【问题标题】:OPEN MQ - Help with asynchronousOPEN MQ - 异步帮助
【发布时间】:2009-11-11 04:18:06
【问题描述】:

我正在测试 open 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() 做什么,消息总是从队列中删除。如何将消息保留在队列中以便稍后调用?

谢谢!

【问题讨论】:

    标签: java jms openjms


    【解决方案1】:

    由于您正在使用的会话设置为自动确认,因此该消息已从代理队列中删除。

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

    一旦 onMessage() 方法执行完成,这将自动向代理发送一个确认,表明侦听器已收到与它关联的消费者的消息。这会导致消息从队列中移除。

    如果您手动接管确认过程,您可以选择仅在您选择的时间确认收到消息(15 分钟后或您对消费客户端的任何标准)。

    设置会话Session.CLIENT_ACKNOWLEDGE 将允许您执行此操作,但您必须在您的消费者代码中手动发送确认。通过在侦听器中的 onMessage() 方法中对消息 msg.acknowledge() 调用确认。

    这将确认收到该会话中使用的消息并将它们从队列中删除。

    您引用的 pdf 中的第 46 和 65 页可用于获取更多信息,api 也是如此

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 2011-05-31
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多