我正在我的项目中测试用于发送和接收消息的开放 MQ。我配置它发送同步消息没有问题,但是我在官方文档中找不到任何方法来配置消息在生产者发送消息后15分钟被消费,并在出现错误时继续调用消费者.
官方文档:http://dlc.sun.com/pdf/819-7757/819-7757.pdf
我发送消息的方法
public void sendMessage(EntradaPrecomven entrada){
try{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL, "file:///C:/mqteste");
// Create the initial context.
Context ctx = new InitialContext(env);
// Look up the connection factory object in the JNDI object store.
autenticisFactory = (ConnectionFactory) ctx.lookup(CF_LOOKUP_NAME);
mdbConn = autenticisFactory.createConnection();
mdbSession = mdbConn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = (Destination) ctx.lookup(DEST_LOOKUP_NAME);
MessageProducer myProducer = mdbSession.createProducer(destination);
ObjectMessage outMsg = mdbSession.createObjectMessage(entrada);
outMsg.setJMSRedelivered(Boolean.TRUE);
myProducer.send(outMsg);
consumidor = mdbSession.createConsumer(destination);
MessageMDB myListener = new MessageMDB();
consumidor.setMessageListener(myListener);
mdbConn.start();
mdbConn.close();
}catch(Exception e){
try {
mdbSession.rollback();
} catch (JMSException e1) {}
}
}
我的听众:
@Override
public void onMessage(Message msg) {
ObjectMessage objMessage = (ObjectMessage) msg;
try {
System.out.println("Received Phone Call:" + objMessage.getJMSRedelivered());
throw new JMSException("TESTE");
} catch (JMSException e) {
e.printStackTrace();
}
}
所以,当我调用 mdbConn.start() 时,会调用 sendMessage(),但我想在调用后 15 分钟再调用。无论 sendMessage() 做什么,消息总是会从队列中删除。我怎样才能将消息保留在队列中以便稍后调用?
谢谢!
最佳答案
由于您正在使用的 session 设置为自动确认,该消息已从代理队列中删除。
mdbSession = mdbConn.createSession(false, Session.AUTO_ACKNOWLEDGE);
一旦 onMessage() 方法执行完成,这将自动向代理发送确认消息,表明监听器已收到与其关联的消费者的消息。这会导致消息从队列中删除。
如果您手动接管确认过程,您可以选择仅在您选择的时间确认收到消息(可以是 15 分钟后,也可以是您对消费客户端的任何标准)。
设置 session Session.CLIENT_ACKNOWLEDGE
将允许您执行此操作,但随后您必须在消费者代码中手动发送确认。通过在监听器的 onMessage() 方法内调用对消息 msg.acknowledge()
的确认。
然后,这将确认收到该 session 中使用的消息并将其从队列中删除。
您引用的 pdf 中的第 46 和 65 页对于有关此方面的更多信息很有用,就像 api 一样。
关于java - OPEN MQ - 异步帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1710525/