Мы переносим наше приложение JavaEE 6 с Weblogic 12.1 на 12.2 (JavaEE 7).
Мы определили компонент, управляемый сообщениями, на ejb-jar.xml
+ weblogic-ejb-jar.xml
.
В файле ejb-jar.xml у нас есть несколько записей, подобных этой (другое имя ejb, но один и тот же класс ejb):
<message-driven>
<ejb-name>MyApp-MessageHandler-Queue1</ejb-name>
<ejb-class>myapp.asynclayer.messagehandler.MessageHandlerBean</ejb-class>
<transaction-type>Container</transaction-type>
<activation-config>
...
</activation-config>
<env-entry>
...
</env-entry>
<message-driven>
Если мы развернем его на новом WL, приложение будет иметь статус Активный, но очереди не подключаются автоматически, более того, в журнале возникает исключение.
####<Apr 3, 2019 7:43:25,549 PM EEST> <Info> <EJB> <devrecapp122> <async_srv1> <[ACTIVE] ExecuteThread: '41' for queue: 'weblogic.kernel.Default (self-tuning)'> <<anonymous>> <> <4cdfccf6-1c7a-4d61-b116-4140143e7563-00000280> <1554309805549> <[severity-value: 64] [rid: 0] [partition-id: 0] [partition-name: DOMAIN] > <BEA-011061> <Stack trace associated with message Error starting the MessageDrivenBean MyApp-MessageDispatcher-Queue1 follows:
com.oracle.pitchfork.interfaces.LifecycleCallbackException: Failure to invoke public java.lang.Object org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(javax.interceptor.InvocationContext) throws java.lang.Exception on bean class class org.jboss.weld.ejb.SessionBeanInterceptor with args: [LifecycleEventCallbackInvocationContext(1403901847)]
at com.oracle.pitchfork.inject.Jsr250Metadata.invokeLifecycleMethod(Jsr250Metadata.java:391)
...
Caused By: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
Caused By: java.lang.NullPointerException
at org.jboss.weld.ejb.SessionBeanInterceptor.obtainBeanManager(SessionBeanInterceptor.java:61)
Грязный обходной путь, который мы сделали - создать один класс на MDB:
public class MessageHandlerBeanQueue1 extends MessageHandlerBean {
//empty
}
Итак, для тега ejb-class
мы указываем конкретный класс. При этом у нас нет ошибок и очереди подключены правильно.
Почему это происходит на новом Weblogic?