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