HornetQ MessageHandler howto

时间:2012-07-09 07:57:34

标签: transactions hornetq core-api

我使用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

0 个答案:

没有答案