forum.bitel.ru
http://forum.bitel.ru/

Вывод print error
http://forum.bitel.ru/viewtopic.php?f=19&t=12368
Страница 1 из 1

Автор:  mhollow [ 07 апр 2017, 12:54 ]
Заголовок сообщения:  Вывод print error

Я конечно дико извиняюсь, а где смотреть вывод методов print и error из EventScriptBase при "обычной работе" (не в окне "вывод" после запуска")?
В какой лог они попадают или куда?
Спасибо.

Автор:  skn [ 07 апр 2017, 13:47 ]
Заголовок сообщения:  Re: Вывод print error

mhollow писал(а):
Я конечно дико извиняюсь, а где смотреть вывод методов print и error из EventScriptBase при "обычной работе" (не в окне "вывод" после запуска")?
В какой лог они попадают или куда?
Спасибо.


если скрипт на договоре, то в договоре есть в разделе Скрипты поведения, закладка Логи выполнения

Автор:  mhollow [ 09 апр 2017, 21:37 ]
Заголовок сообщения:  Re: Вывод print error

А почему print работает только из execute (в глобальном скрипте)?
Из всех остальных методов того же класса - java.lang.NullPointerException
at ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase.print(GlobalScriptBase.java:31)

Автор:  dimOn [ 10 апр 2017, 13:29 ]
Заголовок сообщения:  Re: Вывод print error

полный стек дайте

Автор:  mhollow [ 10 апр 2017, 13:42 ]
Заголовок сообщения:  Re: Вывод print error

GENERATE_TIME: 10.04.17 10:38:55
EXECUTION_STOP_TIME: 10.04.17 10:38:55
PROCESS_TIME: 0

OUT:
print from execute


EXCEPTIONS:
java.lang.NullPointerException
at ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase.print(GlobalScriptBase.java:31)
at ru.xxx.bgbilling.kernel.TestGlobal.testMethod(TestGlobal.java:31)
at ru.xxx.bgbilling.kernel.TestGlobal.execute(TestGlobal.java:21)
at ru.bitel.bgbilling.kernel.script.server.bean.GlobalScriptInvoker.invoke(GlobalScriptInvoker.java:38)
at ru.bitel.bgbilling.kernel.script.server.GlobalScriptServiceImpl.executeGlobalScriptParams(GlobalScriptServiceImpl.java:83)
at ru.bitel.bgbilling.kernel.script.server.GlobalScriptServiceImpl.executeGlobalScript(GlobalScriptServiceImpl.java:59)
at sun.reflect.GeneratedMethodAccessor480.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at ru.bitel.bgbilling.kernel.container.service.server.ServiceInfo.invoke(ServiceInfo.java:101)
at ru.bitel.bgbilling.kernel.container.ws.server.AbstractJaxWsHandler.invoke0(AbstractJaxWsHandler.java:229)
at ru.bitel.bgbilling.kernel.container.ws.server.AbstractJaxWsHandler.access$000(AbstractJaxWsHandler.java:47)
at ru.bitel.bgbilling.kernel.container.ws.server.AbstractJaxWsHandler$1.run(AbstractJaxWsHandler.java:276)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at ru.bitel.bgbilling.kernel.container.ws.server.AbstractJaxWsHandler.invoke(AbstractJaxWsHandler.java:270)
at ru.bitel.bgbilling.kernel.container.ws.server.JaxWsHandler.invoke(JaxWsHandler.java:315)
at ru.bitel.bgbilling.kernel.container.ws.server.AbstractJaxWsHandler$ServiceInstanceResolver$1.invoke(AbstractJaxWsHandler.java:375)
at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:150)
at com.sun.xml.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:261)
at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:100)
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:641)
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:600)
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:585)
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:482)
at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:314)
at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:608)
at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:259)
at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:162)
at ru.bitel.bgbilling.kernel.container.ws.server.JaxWSAdapter.handle(JaxWSAdapter.java:290)
at bitel.billing.server.Executer.doPost(SourceFile:163)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

package ru.xxx.bgbilling.kernel;
import java.io.FileReader;
import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;
import ru.bitel.bgbilling.server.util.Setup;

public class TestGlobal extends GlobalScriptBase {

@Override
public void execute(Setup setup, ConnectionSet connectionSet) {
print("print from execute");
TestGlobal tg = new TestGlobal();
tg.testMethod();
print("done from execute");
return;
}

public void TestGlobal() { }

private void testMethod() {
print("print from testMethod");
return;
}
}

Автор:  dimOn [ 10 апр 2017, 13:49 ]
Заголовок сообщения:  Re: Вывод print error

Код:
TestGlobal tg = new TestGlobal();

Так работать не будет, GlobalScriptBase там отдельно инициализируется перед запуском итд, а вы просто инстанс гольный создали, где никакие print не настроены
Почему просто testMethod() не вызвать из этого же инстанса, а не из нового tg?
Если критично писать именно так, то надо подумать как часть кода перенести, скорее всего init какой-нибудь достаточно будет.

Автор:  mhollow [ 10 апр 2017, 13:56 ]
Заголовок сообщения:  Re: Вывод print error

Ну вообще говоря, формально мой класс расширяет GlobalScriptBase
public class TestGlobal extends GlobalScriptBase
поэтому извините, работать обязано.
А кто создает инстанс, ядро или я сам, это уже не важно.

Автор:  skn [ 10 апр 2017, 15:04 ]
Заголовок сообщения:  Re: Вывод print error

все правильно
когда ядро создает инстанс, оно его и нициализирует
хотите сами его создавать будьте любезны его и сами инициализировать.

Автор:  mhollow [ 10 апр 2017, 15:29 ]
Заголовок сообщения:  Re: Вывод print error

Нет, не правильно.
Инициализация при расширении класса НЕ обязательна. Методы объявленные в расширяемом классе обязаны быть доступными в расширяющем классе без всякой дополнительной инициализации.
Хотите еще один холивар? Нет проблем. Только на этот раз все это ооочень четко описано в спецификации к Java. И я не поленюсь, найду. И окажется что вы нарушаете спецификацию языка.
Инициализация всего-лишь дополнительная возможность выполнить определенные действия по инициализации полей при создании объекта или класса. Которая мне, как создателю это класса и его инстанса в данном случае не нужна.

Автор:  Phricker [ 10 апр 2017, 15:32 ]
Заголовок сообщения:  Re: Вывод print error

mhollow писал(а):
И окажется что вы нарушаете спецификацию языка.

Увы ©

Автор:  mhollow [ 10 апр 2017, 15:34 ]
Заголовок сообщения:  Re: Вывод print error

Sad but true © )))

Автор:  skn [ 10 апр 2017, 15:46 ]
Заголовок сообщения:  Re: Вывод print error

mhollow писал(а):
Нет, не правильно.
Инициализация при расширении класса НЕ обязательна. Методы объявленные в расширяемом классе обязаны быть доступными в расширяющем классе без всякой дополнительной инициализации.
Хотите еще один холивар? Нет проблем. Только на этот раз все это ооочень четко описано в спецификации к Java. И я не поленюсь, найду. И окажется что вы нарушаете спецификацию языка.


Спецификация тут не причем, класс компилируется, а все остальное дело автора класса и его целей.

Автор:  mhollow [ 10 апр 2017, 15:56 ]
Заголовок сообщения:  Re: Вывод print error

Моя цель в данном контексте использовать метод, объявленный в родительском классе.
И для того чтобы иметь возможность это сделать я все необходимые условия с точки зрения требований языка выполнил - расширил класс.
Но что-то пошло не так...Если я не могу этого сделать это как минимум означает, что класс родитель спроектирован не достаточно хорошо. Конечно он мне дает его вызвать, но сам метод вызывает Exception.
Нарушение спецификации в данном случае заключается не в том, что мне компилятор не дает вызвать метод родительского класса а в том что он не работает из расширяющего класса.

Автор:  skn [ 10 апр 2017, 16:01 ]
Заголовок сообщения:  Re: Вывод print error

компилятор дает вам вызвать метод, а метод кидает Exception если для его работы чего то не хватает, обычная практика программирования, кидать исключение при нештатной ситуации...

Автор:  stark [ 10 апр 2017, 16:05 ]
Заголовок сообщения:  Re: Вывод print error

Тогда не используете GlobalScriptBase. Вас же никто не заставляет, используйте свою реализацию интерфейса GlobalScript.
Вот вам код
Код:
public abstract class GlobalScriptBase
    implements GlobalScript
{
   private PrintStream out;
   private PrintStream err;
   private ParameterMap params;
   
   public void setOutputStream( PrintStream out )
   {
      this.out = out;
   }
   
   public void setErrorStream( PrintStream err )
   {
      this.err = err;
   }

   protected void print( Object message )
   {
      this.out.println( message );
   }
   
   protected void error( Object message )
   {
      this.err.println( message );
   }

   /**
    * Дополнительные параметры скрипта.
    * Например, сюда попадают все параметры из конфига задачи выполнения глобальных скриптов по таймеру.
    * При запуске из командной строки класса реализующего интерфейс GlobalScript попадают параметры переданные.
    */
   public ParameterMap getParams()
   {
      return params;
   }

   public void setParams(ParameterMap params)
   {
      this.params = params;
   }
}



Если очень надо именно GlobalScriptBase, мы можем в следующем обновлении сделать его конструктор приватным и вы вообще ничего не сможете создать и отнаследоваться о него.
И в это не будет ничего неправильного, Есть например такой pattern

GlobalScriptBase - это по сути наш внутренний класс, и мы можем запретить его использовать.

Автор:  mhollow [ 10 апр 2017, 16:08 ]
Заголовок сообщения:  Re: Вывод print error

А в чем нештатность ситуации? Я расширил класс, радостно потираю потные ручонки, вызываю метод родительского класса. А меня тут начинаю гнать не очень сухими тряпками и говорить что это нештатная ситуация.
Я очень сильно сконфужен.
Ну так запретите, потому что я, извините действую СТРОГО по инструкции, только уж будьте любезны, отразите это в документации.
https://docs.bitel.ru/pages/viewpage.action?pageId=73597356
Класс, привязанный к глобальному скрипту, должен расширять базовый класс ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase.
Там вообще кстати ни слова про интерфейс.

Автор:  barguzin2 [ 10 апр 2017, 16:13 ]
Заголовок сообщения:  Re: Вывод print error

Комрад, поймите уже наконец, что правила игры здесь не вы устанавливаете. И максимум, на что вы можете расчитывать - это высказать пожелание и предложение. А тут получается ВЫ делаете что-то, ОНО не работает, а виноваты разработчики. Так пишите так, как говорят, как будет работать. Сколько людей пользуется глобальными скриптами (ой, вы тоже начали скриптами пользоваться?) и ни у кого не возникало ни проблем ни претензий.

Изображение

Автор:  mhollow [ 10 апр 2017, 16:15 ]
Заголовок сообщения:  Re: Вывод print error

Я всё еще надеюсь изменить мир)) Ну или хотя бы разработчиков bgbilling )))))

Автор:  Phricker [ 10 апр 2017, 16:17 ]
Заголовок сообщения:  Re: Вывод print error

mhollow писал(а):
Я всё еще надеюсь изменить мир)) Ну или хотя бы разработчиков bgbilling )))))

Увы ©

Автор:  mhollow [ 10 апр 2017, 16:17 ]
Заголовок сообщения:  Re: Вывод print error

Вот вот, один Phricker меня понимает :(

Автор:  stark [ 10 апр 2017, 16:22 ]
Заголовок сообщения:  Re: Вывод print error

mhollow писал(а):
А в чем нештатность ситуации? Я расширил класс, радостно потираю потные ручонки, вызываю метод родительского класса. А меня тут начинаю гнать не очень сухими тряпками и говорить что это нештатная ситуация.
Я очень сильно сконфужен.


Есть внутренний классы в любом api, даже в jdk есть классы в пакете sun, которые можно использовать только на свой страх и риск, никто вам не гарантирует чтобы в следующей версии они вообще будут например. Вы не можете создать любой наш класс извне.

Автор:  mhollow [ 10 апр 2017, 16:26 ]
Заголовок сообщения:  Re: Вывод print error

Цитата:
Вы не можете создать любой наш класс извне.

Ладно, ладно. Как скажете, уважаемые. Я уже на всё согласная ))
Неплохо было только это где-то отразить, а то я видите-ли не знал о такой мелочи ( И Фрикер ночью во сне не явился и не просветил )))

Автор:  stark [ 10 апр 2017, 16:29 ]
Заголовок сообщения:  Re: Вывод print error

mhollow писал(а):
Цитата:
Вы не можете создать любой наш класс извне.

Ладно, ладно. Как скажете, уважаемые. Я уже на всё согласная ))
Неплохо было только это где-то отразить, а то я видите-ли не знал о такой мелочи (


Хорошо, мы добавили в TODO что либо сделать по этому поводу. Пока можете поставить
Код:
setOutputStream( System.out);
setErrorStream( System.err);

Автор:  Amir [ 10 апр 2017, 16:33 ]
Заголовок сообщения:  Re: Вывод print error

https://docs.oracle.com/cd/E19798-01/82 ... index.html

Автор:  mhollow [ 10 апр 2017, 16:37 ]
Заголовок сообщения:  Re: Вывод print error

Ну строго говоря я не создаю а расширяю, и не любой класс, а который я обязан расширить.
Причем без всяких дополнительных инструкций по инициализации.

Автор:  mhollow [ 10 апр 2017, 16:53 ]
Заголовок сообщения:  Re: Вывод print error

Цитата:
setOutputStream( System.out);
setErrorStream( System.err);

Это куда именно поставить? Если в конструктор класса то НЕ помогает.

Автор:  skn [ 10 апр 2017, 20:35 ]
Заголовок сообщения:  Re: Вывод print error

Код:
TestGlobal testGlobal = new TestGlobal();
testGlobal.setOutputStream( System.out);
testGlobal.setErrorStream( System.err);

Автор:  mhollow [ 10 апр 2017, 20:43 ]
Заголовок сообщения:  Re: Вывод print error

Да, спасибо, это работает.

Автор:  dimOn [ 10 апр 2017, 20:44 ]
Заголовок сообщения:  Re: Вывод print error

mhollow писал(а):
Нет, не правильно.
Инициализация при расширении класса НЕ обязательна. Методы объявленные в расширяемом классе обязаны быть доступными в расширяющем классе без всякой дополнительной инициализации.

Фигню пишете опять очень уверенно :lupa:
И методы доступны, и поля доступны. Но они НЕ ИНИЦИАЛИЗИРОВАНЫ, это делается вручную вызывающим кодом. Вообще теоретически это (а именно неконсистентность и недоинициализированность после полноценного создания инстанса объекта) не вполне корректно, если речь о публичном API(*). Но вы извращаетесь с фактически внутренним классом, который не велено трогать и создавать инстансы.

(*) и то в данном случае это очень спорно, т.к. print - второстепенная функциональность, для её работы нужна дополнительная информация, ничего страшного в этом нет. Но в таком случае надо не NPE кидать, конечно, а IllegalStateException какой-нибудь, и будет 104% корректно всё.

Автор:  dimOn [ 10 апр 2017, 20:48 ]
Заголовок сообщения:  Re: Вывод print error

Цитата:
Ну строго говоря я не создаю а расширяю, и не любой класс, а который я обязан расширить.
Причем без всяких дополнительных инструкций по инициализации.
Цитата:
Ну так запретите, потому что я, извините действую СТРОГО по инструкции, только уж будьте любезны, отразите это в документации.
https://docs.bitel.ru/pages/viewpage.ac ... d=73597356
Класс, привязанный к глобальному скрипту, должен расширять базовый класс ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase.
Там вообще кстати ни слова про интерфейс.

Вы не расширяете, а именно создаёте новый инстанс. Расширение - это наследование. Расширение, это вот эта строка: public class TestGlobal extends GlobalScriptBase .
Эта строка: TestGlobal tg = new TestGlobal() - это создание инстанса вашего "расширенного класса". Зачем вы это делаете - вообще непонятно. Это не надо делать ни в вашей задаче, ни по какой-то инструкции. Нет там такого и быть не может. Потому что это совершенно излишне и не нужно вам.

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/