我最近学习了Hornetq代码,对JMSbridge有疑问。
你可以看到,JMSbridgeImpl.java中有一个名为“sendMessages()”的乐趣。有趣的是将msg发送到远程JMSServer,但没有做出确认。
但在名为“sendBatchNonTransacted()”的乐趣中,只有对最后一个消息的确认,例如“messages.getLast()。acknowledge();”
所以问题是:为什么不在名为“sendMessages()”的乐趣中通过每个消息来做ack?
道歉,我的英语是游泳池。
我在线等你帮忙!谢谢!
但我还有一个问题:我修改了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,但内存也是溢出。
我的代码中有什么问题吗?
答案 0 :(得分:1)
我们有两种方法可以保证发送消息:
所有sendBatchLocalTx(),sedBatchXA()和sendBatchNonTransacted()都使用sendMessages()发送消息,然后保证以自己的方式发送消息(提交事务或确认消息)!
在sendBatchNonTransacted()中,它使用客户端确认模式;在这种模式下,通过查询消息(此处为最后一条消息),当前会话中的所有已发送消息都将被激活!