0

プロジェクトでメッセージの送受信用にオープン 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() が何をするにしても、メッセージは常にキューから削除されます。後で呼び出されるようにメッセージをキューに保持するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

1

使用しているセッションが自動応答に設定されているため、メッセージはブローカー キューから削除されます。

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

これにより、onMessage() メソッドの実行が完了すると、リスナーが関連付けられているコンシューマーへのメッセージを受信したという確認がブローカーに自動的に送信されます。これにより、メッセージがキューから削除されます。

確認プロセスを手動で引き継ぐ場合は、選択した時間 (15 分後または消費クライアントに対して設定した基準) でのみメッセージの受信を確認するように選択できます。

セッションSession.CLIENT_ACKNOWLEDGEを設定するとこれが可能になりますが、コンシューマ コードで確認応答を手動で送信する必要があります。msg.acknowledge()リスナー内の onMessage() メソッド内のメッセージでacknowledgeを呼び出します。

これにより、そのセッション内で消費されたメッセージの受信が確認され、キューから削除されます。

引用したpdfの46ページと65ページは、APIと同様に、これに関する詳細情報に役立ちます

于 2009-11-10T20:18:06.777 に答える