Я пытаюсь вызвать EJB на JBoss 5.1.0 из двух экземпляров Tomcat 6.0.14. Одна машина работает нормально, а другая не работает. Код представляет собой действие Struts, выполняющее что-то похожее на:
try {
MyInterface myInterface = (MyInterface)Component.getInstance(MyInterface.class);
log.debug(new StringBuilder().append("Got a ").append(myInterface).toString());
myInterface.doSomething();
} catch (Exception e) {
logger.error(e.getMessage());
}
Я закончил тем, что прикрепил точку останова к вызову логгера внутри блока catch, так как вызов логгера не дал никакого результата.
Отладчик показал, что Исключение было NPE, но у него нет сообщения. Ведение журнала показывает, что вызов отладки сразу после назначения интерфейса работает нормально, и текст выглядит примерно так: «Получил прокси для jboss.j2ee: ear = ear.ear, jar = ear-internal-3.0.0.jar, name = MyInterfaceImpl, service = EJB3, реализующий [интерфейс com.myco.MyInterface] ".
У меня нет легкого доступа к стороне сервера, поэтому я не могу подключить отладчик там, и у меня нет легкого доступа к исходному коду (я использовал JDecompiler, чтобы узнать, где разместить точку останова в jdb - код - внутренний код, я просто не работаю в правильном отделе!)
Я не вижу, как в приведенном выше коде myInterface может иметь значение null, поэтому для меня NPE либо со стороны сервера, либо из внутренних компонентов Tomcat.
Есть несколько тонких различий между конфигурацией двух машин, но нет ничего, что предполагало бы бросание NPE в код. Основные различия в конфигурации:
- conf загружен из символических ссылок
- рабочий клиент Tomcat находится на той же машине, что и сервер JBoss, а неисправный клиент Tomcat находится на отдельной машине в другой подсети (однако прокси-сервер возвращается, и я вижу, как сетевой трафик идет на правильные порты на сервере JBoss с использованием tcpdump, так что я не думаю, что это проблема с сетью)
У кого-нибудь есть идеи?
(машины работают на RHEL5 с JDK 1.60_18)
Мне удалось вытащить это из системы - похоже, что это эта ошибка, но, безусловно, если клиентские jar-файлы одинаковы на обоих Tomcats, ошибка будет либо с обоими, либо ни с одним
[org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:379)
org.jboss.ejb3.session.InvokableContextClassProxyHack._dynamicInvoke(InvokableContextClassProxyHack.java:53)
org.jboss.aop.Dispatcher.invoke(Dispatcher.java:91)
org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:891)
org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:744)
org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:697)
org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:524)
org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:232)
org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:211)
org.jboss.remoting.Client.invoke(Client.java:1724)
org.jboss.remoting.Client.invoke(Client.java:629)
org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:62)
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:67)
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
org.jboss.ejb3.security.client.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:65)
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:74)
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
org.jboss.aspects.remoting.PojiProxy.invoke(PojiProxy.java:61)
$Proxy9.invoke(Unknown Source)
org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:207)
org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:164)
$Proxy8.getRoster(Unknown Source)
com.mycompany.MyAction.execute(GetNotificationsAction.java:33)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
com.mycompany.filters.EncodingFilter.doFilter(EncodingFilter.java:23)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
java.lang.Thread.run(Thread.java:619)]