1

hornetQ の使用に関する問題を少し理解しています。私が実現しようとしているのは、非同期リクエスト処理です。着信 tcp 接続を受け入れるサーバー コンポーネントがあります。クライアントは、TLV メッセージを使用して独自のプロトコルで要求を送信します。処理を io から分離するために、hornetQ を使用してメッセージキューを導入しました。そのため、新しいメッセージが着信すると、INBOX キューに入れられます。そのキューにはいくつかのリスナー スレッドがあるため、処理はマルチスレッドです。これらのリスナーは順番に応答を生成し、それらを OUTBOX キューに戻します。すべてのクライアントには独自の送信ボックス キューがあるため、互いに影響を与えることはありません (クライアントが一時的に切断された場合など)。

これまでのところ、私は明確です。しかし、問題は、対象のクライアントが接続されていない場合、すぐにメッセージを送信できず、再度接続するように招待する必要があることです (一方向通信)。しかし、その場合、メッセージをどうするか? トランザクション処理を使用しないため、ロールバックしてメッセージをキューに戻すことはできません。たぶん、コード スニペットは、私がやろうとしていることをより明確にすることができます:

@Override
public void onMessage(ClientMessage p_message)
{
    try
    {
        UID uid = UID.parse(p_message.getStringProperty(MessageQueueServer.MESSAGE_PROPERTY_UID));
        IoSession ioSession = SessionLookupFilter.getSession(uid);

        if ((ioSession != null) && ioSession.isConnected())
        {
            ioSession.write(MessageQueueServer.clientMessageToLTV(p_message));
            // acknowledge to remove message from queue
            p_message.acknowledge();
        }
        else
        {
            // don't acknowledge the message so we will get it again ?!?
            // TODO invite the client to establish a connection via SIP server
            // Set redelivery timeout of message to a serious value so we don't bother the client with subsequent
            // invitations.
        }
    }
    catch (Exception e)
    {
        LogMF.error(log, e, "Error during dispatching of mq-message {0} to client.", new Object[] { p_message });
    }
}

hornetq のユーザーマニュアルから役に立つ情報を得ることができませんでした。だから多分誰かがそれを経験したことがあります。

セバスチャンに挨拶

4

0 に答える 0