我正在尝试连接到慰问队列并仅从其中读取消息。但是,我能够读取消息,但是消息并未从队列中删除。 下面是我尝试过的代码:
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();
}
这里的闩锁是CountDownLatch的对象,其初始化为:
CountDownLatch latch = new CountDownLatch(2);
答案 0 :(得分:1)
您需要提交XA事务以消耗消息。
在JMS中,函数调用为0 + 1
此外,是否有理由使用CountDownLatch?
如果您想同步使用消息,则可以选择不设置消息侦听器并调用XAResource.commit(xid, true)
Solace确实提供了一个基本示例,展示了如何利用XA事务。
请参阅API的示例目录中的MessageConsumer.receive()
。
请注意,示例代码通过调用相关的XAResource方法(例如XAResource.commit())来手动管理XA事务。 XA事务通常在包含事务管理器的Java EE应用程序服务器中使用,以管理XA事务的生命周期。