【问题标题】:JMS producer in Session bean on JBoss AS 6 throws exceptionJBoss AS 6 上的 Session bean 中的 JMS 生产者抛出异常
【发布时间】:2012-04-15 09:52:52
【问题描述】:

使用带有“默认”部署配置文件的 JBoss AS 6.1.0 Final。

我喜欢从会话 Bean 发送 JMS 消息。 我设置了以下内容:

/server/default/deploy/my-hornetq-jms:

<configuration xmlns="urn:hornetq"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:hornetq /schema/hornetq-jms.xsd">

    <queue name="queue/DummyMDBean">
        <entry name="jms/DummyMDBean"/>
    </queue>
</configuration>

在我拥有的 bean 中:

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class Demo implements DemoRemote, DemoLocal {
    ...
    @Resource(mappedName = "java:/ConnectionFactory")
    private static QueueConnectionFactory queueConnectionFactory;

    @Resource(mappedName = "/jms/DummyMDBean")
    private static Queue queue;

    public void example() {
        QueueConnection queueConnection = null;
        try {
            queueConnection = queueConnectionFactory.createQueueConnection();
        } catch (JMSException e) {
            System.out.println("Exception occurred: " + e.toString());
            e.printStackTrace();
        }

        try {
            QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            QueueSender queueSender = queueSession.createSender(queue);

            // Send a text message:
            TextMessage textMessage = queueSession.createTextMessage();
            textMessage.setText("Hello World");

            queueSender.send(textMessage);
        } catch (JMSException e) {
            System.out.println("Exception occurred: " + e.toString());
            e.printStackTrace();
        } finally {
            closeConnection(queueConnection);
        }
    }

我收到以下错误:

15:46:05,011 INFO  [STDOUT] Exception occurred: javax.jms.JMSException: Failed to create session factory
15:46:05,661 ERROR [STDERR] javax.jms.JMSException: Failed to create session factory
15:46:05,666 ERROR [STDERR]     at    org.hornetq.jms.client.HornetQConnectionFactory.createConnectionInternal(HornetQConnectionFactory.java:605)
15:46:05,667 ERROR [STDERR]     at org.hornetq.jms.client.HornetQConnectionFactory.createQueueConnection(HornetQConnectionFactory.java:131)
15:46:05,668 ERROR [STDERR]     at org.hornetq.jms.client.HornetQConnectionFactory.createQueueConnection(HornetQConnectionFactory.java:126)
15:46:05,669 ERROR [STDERR]     at com.demo.Demo.example(Demo.java:109)

...

15:46:05,782 ERROR [STDERR]     at java.lang.Thread.run(Thread.java:722)
15:46:05,783 ERROR [STDERR] Caused by: java.lang.NullPointerException
15:46:05,784 ERROR [STDERR]     at org.hornetq.core.client.impl.ServerLocatorImpl.removeFromConnecting(ServerLocatorImpl.java:682)
15:46:05,784 ERROR [STDERR]     at org.hornetq.core.client.impl.ServerLocatorImpl.createSessionFactory(ServerLocatorImpl.java:751)
15:46:05,785 ERROR [STDERR]     at org.hornetq.jms.client.HornetQConnectionFactory.createConnectionInternal(HornetQConnectionFactory.java:601)
15:46:05,785 ERROR [STDERR]     ... 180 more

第 109 行是“queueConnection = queueConnectionFactory.createQueueConnection();”。

除了上面的 xml 之外,我没有对默认值进行任何更改。 关于这个问题的任何想法,以及如何解决它?

【问题讨论】:

  • 与问题无关,但您的第一次尝试/捕获似乎没有多大意义。如果它抛出你只需继续(使用无效连接)。第二个 try catch 执行完全相同的日志记录。您可以删除第一次捕获和第二次尝试。
  • @Arjan 我知道,但这只是一个尝试找出失败原因的测试。

标签: java jms ejb-3.0 jboss6.x


【解决方案1】:

Demo.java中的第109行是否对应以下行?

QueueSender queueSender = queueSession.createSender(queue);

我猜queue 可能为空。您可以尝试如下声明您的队列:

<queue name="queue/DummyMDBean">
    <entry name="/jms/DummyMDBean"/>
</queue>

更新:

使用的连接工厂在 EJB 环境中也可能存在问题。在 AS 6.10 中,/ConnectionFactory 是一种非托管工厂,它在 Servlet 和 JSF 托管 bean 中工作以创建直接目标侦听器(否则在容器中是禁止的)。

对于 EJB 中的用法,您现在似乎实际上应该使用 java:/jmsXA 代替(这在 6.0 和 5.x 中有所不同)。例如

@Resource(mappedName = "java:/JmsXA")
private ConnectionFactory queueConnectionFactory;

【讨论】:

  • 不,它是“queueConnection = queueConnectionFactory.createQueueConnection();” (只需编辑问题以注意这一点)
  • 使用 JmsXA 我得到了55 IDT 2012 timerState=RETRY_TIMEOUT: javax.ejb.EJBTransactionRolledbackException: failed to set value org.hornetq.ra.HornetQRAConnectionFactoryImpl@56d9ea8d on field private static javax.jms.ConnectionFactory com.demo.Demo.queueConnectionFactory; Reason: ClassLoaders of value: BaseClass Loader@738a2a09{vfs:///C:/Users/u/Developent/jboss-6.1.0.Final/server/default/deploy/jms-ra.rar} and target field BaseClassLoader@717a07ac{vfs:///C:/Users /u/Developent/jboss-6.1.0.Final/server/default/deploy/demo.ear} are not equal
  • 首先你应该在注入点移除静态修饰符。无论如何这是错误的,抱歉我之前没有注意到这一点。其次,您可能应该声明ConnectionFactory,而不是QueueConnectionFactory。最后,@TransactionAttribute 也应该被删除(这已经是默认设置,现在什么都不做)
  • 最后要尝试的是将您的 bean 移动到 EJB 模块(如果它已经不存在)并将 my-hornetq-jms 移动到您的耳朵。但实际上应该没有必要。 java:/JmsXA 绝对可以注入到 web 模块中的 bean 中(那些确实有不同的类加载器)。我在 JBoss AS 6.1.0 上做了一千次完全相同的事情,所以理论上一切都应该正常工作。
  • 由于 SO 不鼓励在 cmets 中进行扩展讨论,因此这必须是我在这里发表的最后一条评论,但看起来您遇到了与您在此处展示的具体用例无关的包装问题。参见例如community.jboss.org/message/580534 您可能想要创建一个最小的 EAR 项目来尝试运行它。确保您绝对没有在打包的 EAR 中包含任何用于该测试的库。
猜你喜欢
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 2014-12-05
  • 2013-05-04
  • 1970-01-01
相关资源
最近更新 更多