如何通过JMS向WebSphere MQ发送大消息?

4
2个回答

5
该限制适用于多年前发布的WAS V5.1.1版本附带的WMQ版本。如果这是问题,升级到当前版本的WMQ将解决问题。WMQ的当前版本为V7.0.1。V6.0.2也仍然是当前版本,但将在2012年9月停止服务。V6和V7可以发送和接收高达100MB的消息,但WMQ本身默认为4MB。如果需要大于4MB的消息,则需要调整QMgr、队列和通道的参数,但JMS在现代版本中不是限制。WMQ Java/JMS手册没有明确提及最大大小,因为它与本机WMQ的最大长度相同,为100MB。然而,WMQ V6 Performance Report提供了高达64MB的JMS消息基准。
无论是什么阻止您发送一个3MB的消息,都不是WMQ的JMS实现在消息大小方面的限制。如果您已经检查了所有通道和队列以及QMgr上的MAXMSGL,则问题就不那么明显,但它确实是配置问题。

这一切都是真的。然而,我所提到的限制是在使用JMS接口时,而在这种情况下,我没有找到配置限制超过2 MB的方法。 - erezul
你为什么认为有2MB的限制?这不是JMS规范的一部分,WMQ类也没有强制实施该限制。如果您尝试发送大型消息时出现错误,那么很可能是队列、通道和/或QMgr中的MAXMSGL调整施加了限制。 - T.Rob
请查看原帖中的链接。 - erezul
这里是链接中的一小段代码: - erezul
我已经更新了我的答案,并提供了链接到V6产品文档,展示了使用64MB消息进行JMS消息性能基准测试的位置。你在配置中缺少了一些东西,而链接的技术说明并不适用。 - T.Rob
显示剩余7条评论

0
这可能听起来很繁琐,但这是一个解决方案:
  1. 将您的消息内容转换为字节数组。
  2. 将字节数组分成 n 个子数组,每个子数组大小约为 ~< 1.9 MB。
  3. 启动 JMS 事务并在 ByteMessage 中发送每个子数组,递增组计数:

例如:

   message.setStringProperty("JMSXGroupID", groupId);
   message.setIntProperty("JMSXGroupSeq", i);

在接收端,您需要实现一个选择器来获取组中的所有消息,一旦您收到第一条消息。检索组中的所有消息(希望您能够获取它们全部),正确排序它们,重新创建大字节数组,取消编组,然后您就完成了。
真的很简单.....
这里有一个更好的例子

虽然这是一种好的代码高手游戏,但问题的前提是错误的。希望我们能够解决根本原因,而不是通过编程来"解决"配置或调优。这个问题大致等同于:"如何让我的车超过内置限制的45英里/小时?"并引用Model-T Ford的规格表作为现代汽车不能超过45英里/小时的证明。继续这个类比,这个答案大致相当于"加强锅炉以便可以获得更多的蒸汽压力"。 - T.Rob
这是一段非常出色的代码高尔夫。此外,这种方法明确得到WebSphere MQ的支持:http://publib.boulder.ibm.com/infocenter/wmqfte/v7r0/index.jsp?topic=/com.ibm.wmqfte.doc/file_to_message.htm。Model-T福特汽车有锅炉吗? - Nicholas
MQFTE可以拆分文件,发送和重新组装消息。但它解决的是不同的问题。OP的前提是IBM的JMS不支持大于2MB的消息,这不仅在今天已经不是真实情况,而且在引用的技术说明书编写时,只有WMQ与WAS捆绑在一起才是真实情况!我完全支持一个好的编码挑战,只要它解决了一个真正的问题或者每个人都明白这是一个学术性的练习。在这种情况下,OP真的相信这个限制是真实存在的。难道我们不应该帮助解决配置/调优问题,而不是让他继续在错误的产品理解下劳累吗? - T.Rob
经过进一步的研究,我发现Model-T没有锅炉,尽管当时许多汽车都有。但这更好地说明了问题 - 如果我们要解决一个不存在的问题,一个不存在的解决方案似乎是完美的方法。 - T.Rob
尼古拉斯,FYI我看到了这篇文章,并注意到结尾的链接已经失效。我曾要求IBM将其重新发布在其他地方,但据我所知他们从未这样做。 - JoshMc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接