我对使用 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 用户手册中获得有用的信息。所以也许有人有这方面的经验。
问候塞巴斯蒂安