【问题标题】:Messages not getting removed from JMS Queue while using XASession使用 XASession 时消息未从 JMS 队列中删除
【发布时间】:2019-10-18 16:57:03
【问题描述】:

我正在尝试连接到安慰队列并简单地从中读取消息。但是,我能够阅读消息,但消息没有从队列中删除。 以下是我尝试过的代码:

public void clearMessages() throws Exception {

        // Programmatically create the connection factory using default settings
        // Create connection to the Solace router

        SolXAConnectionFactoryImpl connectionFactory = returnConnFactory();


        XAConnection connection = connectionFactory.createXAConnection();

        XASession session = connection.createXASession();

        Queue queue = session.createQueue(QUEUE_NAME);
        connection.start();
        MessageConsumer messageConsumer = session.createConsumer(queue);
        //session.b

        messageConsumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                if(message instanceof SolTextMessage)  {
                    SolTextMessage solTextMessage =(SolTextMessage)message;
                    try {
                        System.out.println("Message cleared is : "+solTextMessage.getText());
                    } catch (JMSException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                else {
                    System.out.println("Message Content: %s"+ SolJmsUtility.dumpMessage(message));
                }
                    latch.countDown(); 
            }
        });
        latch.await(120,TimeUnit.SECONDS);
        connection.stop();

        messageConsumer.close();
        session.close();
        connection.close();
    }

这里的latch是CountDownLatch的对象,初始化为:

CountDownLatch latch = new CountDownLatch(2);

【问题讨论】:

  • 你为什么使用XAConnection? XA 用于在单个事务中涉及多个资源(例如 JMS、数据库等)并且工作需要在它们之间以原子方式提交或回滚的情况。您似乎在这里只涉及一个资源(即 JMS)。在不一定使用 XA 时使用 XA 会使您的代码复杂化并降低性能。
  • 因为否则我会得到“非 xasession 无法绑定到 xa 端点”

标签: java jms solace


【解决方案1】:

您需要提交 XA 事务才能使用消息。 在JMS中,函数调用是XAResource.commit(xid, true)

另外,是否有使用 CountDownLatch 的理由? 如果你想同步消费消息,可以选择不设置消息监听,调用MessageConsumer.receive()

Solace 确实提供了一个基本示例,展示了如何使用 XA 事务。 参考API示例目录下的XATransactions.java

请注意,示例代码通过调用相关的 XAResource 方法(例如 XAResource.commit())手动管理 XA 事务。 XA 事务通常在 Java EE 应用服务器中使用,其中包含一个事务管理器来管理 XA 事务的生命周期。

【讨论】:

  • 谢谢Russell..你能指出可以帮助我的代码吗
  • 请参考API示例目录下的XATransactions.java。
猜你喜欢
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 2013-02-01
相关资源
最近更新 更多