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