OPEN MQ - Помощь с асинхронным - PullRequest
0 голосов
/ 10 ноября 2009

Я тестирую открытый 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 Ответ

1 голос
/ 10 ноября 2009

Сообщение удалено из очереди посредника из-за того, что для сеанса, который вы используете, установлено автоматическое подтверждение.

mdbSession = mdbConn.createSession(false, Session.AUTO_ACKNOWLEDGE);

Это автоматически отправит брокеру подтверждение того, что слушатель получил сообщение для потребителя, с которым он связан, после того, как метод onMessage () выполнен до завершения. Это приводит к тому, что сообщение удаляется из очереди.

Если вы принимаете процесс подтверждения вручную, вы можете выбрать только подтверждение получения сообщения в выбранный вами момент (будь то 15 минут спустя или любые другие критерии, которые вы используете для потребляющего клиента).

Настройка сеанса Session.CLIENT_ACKNOWLEDGE позволит вам сделать это, но затем вам придется вручную отправить подтверждение в свой код потребителя. Вызвав подтверждение для сообщения msg.acknowledge() внутри вашего метода onMessage () в вашем слушателе.

Затем будет подтверждено получение сообщений, использованных в этом сеансе, и они будут удалены из очереди.

Страницы 46 и 65 в указанном вами PDF-документе полезны для получения дополнительной информации по этому вопросу, как и api

...