我使用hornetQ有一些理解问题。我想要实现的是异步请求处理。我有一个服务器组件接受传入的TCP连接。客户端将使用TLV消息以专有协议发送请求。为了将处理与io的东西分离,我使用hornetQ引入了一个消息队列。因此,当有新消息进入时,它只会被放入INBOX队列中。该队列有几个侦听器线程,因此处理是多线程的。这些侦听器将依次生成响应并将它们放回到OUTBOX队列中。每个客户端都有自己的发件箱队列,因此它们不会相互影响(例如,当客户端暂时断开连接时)。 因此,对于发件箱处理,我创建一个ClientProducer并设置MessageHandler属性,以便在将消息放入发件箱队列时得到通知。
到目前为止,我很清楚。但现在的问题是,当目标客户端未连接时,我无法立即发送消息,但必须再次邀请他连接(单向通信)。但在这种情况下如何处理消息呢?我不使用事务处理,因此我无法回滚以将消息放回队列中。也许代码片段可以更清楚我想要做的事情:
@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用户手册中获得有用的东西。也许有人有这方面的经验。
Greets Sebastian