hornerq JMSbridge承认

时间:2013-06-08 01:54:43

标签: jms overflow hornetq bridge

我最近学习了Hornetq代码,对JMSbridge有疑问。

你可以看到,JMSbridgeImpl.java中有一个名为“sendMessages()”的乐趣。有趣的是将msg发送到远程JMSServer,但没有做出确认。

但在名为“sendBatchNonTransacted()”的乐趣中,只有对最后一个消息的确认,例如“messages.getLast()。acknowledge();”

所以问题是:为什么不在名为“sendMessages()”的乐趣中通过每个消息来做ack?

道歉,我的英语是游泳池。

我在线等你帮忙!谢谢!

--------------------------------------------

噢,非常感谢“Moj Far”对于这个问题,我明白了。

但我还有一个问题:我修改了hornetQ源代码, 我想使用ClientConsumer(有成功的init)来获取本地HornetQ中的msg 并使用JMS生成器将msg发送到远程JMSServer。

在“SourceReceiver”类的“运行”功能中,我的表现如下:

if (bridgeType == JMSBridgeImpl.ALL_NETTY_MODE ) {
    msg = sourceConsumer.receive(1000);
} else {        /* core client receive msg */
    cmsg = localClientConsumer.receive(1000);
    if (cmsg != null) {
        hq_msg = HornetQMessage.createMessage(cmsg, localClientSession);
        //hq_msg = HornetQMessage.createMessage(cmsg, null);
        hq_msg.doBeforeReceive();
        //cmsg.acknowledge();       do ack after send
        msg = hq_msg;
    }
}                                   

但是运行2小时后,VM memary就会溢出。

我同意不使用localClientSession创建HornetQMessage,但内存也是溢出。

我的代码中有什么问题吗?

1 个答案:

答案 0 :(得分:1)

我们有两种方法可以保证发送消息:

  1. Transactional(在sendBatchLocalTx()和sendBatchXA()中使用)
  2. 非交易或确认(在sendBatchNonTransacted()中使用)
  3. 所有sendBatchLocalTx(),sedBatchXA()和sendBatchNonTransacted()都使用sendMessages()发送消息,然后保证以自己的方式发送消息(提交事务或确认消息)!

    在sendBatchNonTransacted()中,它使用客户端确认模式;在这种模式下,通过查询消息(此处为最后一条消息),当前会话中的所有已发送消息都将被激活!