OPEN MQ - Помощь с асинхронным
Я тестирую открытый 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(), сообщение всегда удаляется из очереди. Как я могу держать сообщение в очереди, чтобы позвонить позже?
Спасибо!
1 ответ
Сообщение удаляется из очереди посредника из-за того, что для сеанса, который вы используете, установлено автоматическое подтверждение.
mdbSession = mdbConn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Это автоматически отправит брокеру подтверждение того, что слушатель получил сообщение для потребителя, с которым оно связано, после выполнения метода onMessage() до его завершения. Это приводит к тому, что сообщение удаляется из очереди.
Если вы принимаете процесс подтверждения вручную, вы можете подтвердить получение сообщения только в тот момент, который вы выбрали (будь то 15 минут спустя или какие-либо критерии, которые вы используете для потребляющего клиента).
Настройка сеанса Session.CLIENT_ACKNOWLEDGE
позволит вам сделать это, но затем вам придется вручную отправить подтверждение в вашем коде потребителя. Позвонив, подтвердите на сообщение msg.acknowledge()
внутри вашего метода onMessage() в вашем слушателе.
Затем он подтвердит получение сообщений, использованных в этом сеансе, и удалит их из очереди.
Страницы 46 и 65 в указанном вами PDF-документе полезны для получения дополнительной информации по этому вопросу, как и API.