我们正在将JavaEE 6应用程序从Weblogic 12.1迁移到12.2(JavaEE 7)。
我们在ejb-jar.xml
+ weblogic-ejb-jar.xml
上定义了消息驱动Bean。
在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上会发生这种情况?