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 のユーザーマニュアルから役に立つ情報を得ることができませんでした。だから多分誰かがそれを経験したことがあります。
セバスチャンに挨拶