0

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

您可以看到,在 JMSbridgeImpl.java 中有一个名为“sendMessages()”的乐趣。乐趣将味精发送到远程 JMSServer,但不做确认。

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

所以问题是:为什么不通过名为“sendMessages()”的乐趣中的每个味精来确认?

抱歉,我的英语是台球。

我在线等你帮忙!谢谢你 !

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

哦,非常感谢“Moj Far”的第一个问题,我明白了。

但我还有一个问题:我修改了hornetQ 的源代码,我想使用ClientConsumer(初始化成功)在本地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 内存溢出。

我也尽量不使用localClientSession来创建HornetQMessage,但是内存也溢出了。

我的代码有问题吗?

4

1 回答 1

1

我们有两种方式来保证发送消息:

  1. 事务性(用于 sendBatchLocalTx() 和 sendBatchXA())
  2. 非事务性或确认(在 sendBatchNonTransacted() 中使用)

所有的 sendBatchLocalTx()、sedBatchXA() 和 sendBatchNonTransacted(),都使用 sendMessages() 发送消息,然后保证以自己的方式发送消息(提交事务或确认消息)!

在 sendBatchNonTransacted() 中,它使用客户端确认模式;在这种模式下,确认一条消息(这里是最后一条消息),当前会话中所有发送的消息都会被确认!

于 2013-06-08T17:52:15.020 回答