【问题标题】:ClassNotFoundException first time Message Driven Bean is invoked in Weblogic在 Weblogic 中第一次调用消息驱动 Bean 时出现 ClassNotFoundException
【发布时间】:2014-08-26 02:35:51
【问题描述】:

我有以下简单的消息驱动 Bean:

@MessageDriven( mappedName ="jms/priceQueue")
public class PriceMessageBean implements MessageListener {
    private Logger logger = Logger.getLogger(
            PriceMessageBean.class.getCanonicalName());

    @Override
    public void onMessage(Message message) {
        logger.info("Message");
        try {
            PriceUpdate update = (PriceUpdate) (((ObjectMessage)message).getObject());
            logger.info("Size: " + update.getPreciousList().size());
        } catch (JMSException jms) {
            logger.info("Error: " + jms.getMessage());
        }
    }
}

它按预期工作。但是,第一次收到消息时,我收到以下异常。似乎 weblogic 正在尝试加载与 EJB 同名的类。如果我设置不同的名称(使用 name="myMDB"),weblogic 会尝试加载名为“myMDB”的类。有关如何避免此异常的任何想法?

java.lang.ClassNotFoundException: PriceMessageBean
    at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:297)
    at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:270)
    at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:64)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:179)
    at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:43)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:270)
    at com.oracle.injection.provider.weld.WeldBeanManager.newBeanInstance(WeldBeanManager.java:116)
    at com.oracle.injection.provider.weld.WeldWebWithEjbBeanManager.newBeanInstance(WeldWebWithEjbBeanManager.java:30)
    at weblogic.ejb.container.injection.InjectionBasedEjbComponentCreator.getBean(InjectionBasedEjbComponentCreator.java:75)
    at weblogic.ejb.container.manager.BaseEJBManager.createNewBeanInstance(BaseEJBManager.java:209)
    at weblogic.ejb.container.manager.BaseEJBManager.allocateBean(BaseEJBManager.java:235)
    at weblogic.ejb.container.manager.MessageDrivenManager.createBean(MessageDrivenManager.java:280)
    at weblogic.ejb.container.pool.MessageDrivenPool.createBean(MessageDrivenPool.java:169)
    at weblogic.ejb.container.pool.MessageDrivenPool.getBean(MessageDrivenPool.java:92)
    at weblogic.ejb.container.internal.MDListener.execute(MDListener.java:553)
    at weblogic.ejb.container.internal.MDListener.transactionalOnMessage(MDListener.java:488)
    at weblogic.ejb.container.internal.MDListener.onMessage(MDListener.java:385)
    at weblogic.jms.client.JMSSession.onMessage(JMSSession.java:4659)
    at weblogic.jms.client.JMSSession.execute(JMSSession.java:4345)
    at weblogic.jms.client.JMSSession.executeMessage(JMSSession.java:3821)
    at weblogic.jms.client.JMSSession.access$000(JMSSession.java:115)
    at weblogic.jms.client.JMSSession$UseForRunnable.run(JMSSession.java:5170)
    at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:545)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)

【问题讨论】:

    标签: jakarta-ee jms weblogic java-ee-6 weblogic12c


    【解决方案1】:

    我遇到了同样的错误,我通过将我的 MDB 命名为与我的完全限定的 java 类相同来解决它。

    在您的情况下,这意味着将平均名称更改为: com.yourpackagename.PriceMessageBean

    @MessageDriven( name="com.yourpackagename.PriceMessageBean", 
                    mappedName ="jms/priceQueue")
    public class PriceMessageBean implements MessageListener {
    

    【讨论】:

    • 感谢您的建议。似乎仍然必须有更好的方法来做到这一点,但您的解决方案有效。
    猜你喜欢
    • 2016-06-14
    • 2017-08-04
    • 2014-01-12
    • 2012-12-13
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    相关资源
    最近更新 更多