【问题标题】:Equivalent of org.hornetq.api.core.client.ClientMessage.setBodyInputStream in IBM MQSeries等效于 IBM MQSeries 中的 org.hornetq.api.core.client.ClientMessage.setBodyInputStream
【发布时间】:2013-01-22 12:09:39
【问题描述】:

在下面的JBoss/HornetQ user manual page 中,您可以看到 HornetQ 如何使用 java.io.InputStream 提供一种将数据流式传输到队列的消息的机制。给出了相同代码的 JMS 版本。有没有人遇到过使用 IBM MQSeries / WebsphereMQ 的等价物?

假设我有大量数据要放在 JMS 消息中,这对我来说只是一个字节流。在 Hornet 示例中,仅在发送消息时才读取流,因此如果是,例如 FileInputStream,那么我们只需要足够的内存来缓冲一大块字节。我可以使用 javax.jms.BytesMessage 发送字节块并使用 BytesMessage 缓冲它们。这样做的问题是 BytesMessage (com.ibm.msg.client.jms.internal.JmsBytesMessageImpl) 的 IBM 实现必须缓存它们,直到消息被发送,如果这是大量数据,那就是一个问题。更糟糕的是,虽然我只发送字节,但 IBM 实现似乎保留了重复的副本,一个在 BytesArrayOutputStream 中,另一个在 DataOutputStream 中。

【问题讨论】:

标签: jms ibm-mq


【解决方案1】:

在 WebSphere MQ 中,与您所描述的最接近的是 reference message。 Infocenter 中描述的方法需要对通道出口进行自定义编程,以获取文件系统对象并将其放入消息中,然后再通过通道传输。远程端的补充出口将有效负载保存到文件中,并将对该文件的引用放入返回给应用程序的消息中。

我们在 WMQ 中也有一些程序,它们在一端采用 STDIN 或管道,并将消息放入另一端的队列中。其中一对可以充当管道,通过该管道,面向行的 ASCII 数据在不同机器上的进程之间流动。但是,没有对此的 JMS 实现,并且对于二进制数据来说效果不佳。

【讨论】:

    【解决方案2】:

    在 WMQ 中,我们有 Group 和 Segment 的概念。 除 Z/OS 外,所有操作系统都支持分段。

    在此处查看详细信息Segmentation In WMQ

    在放置消息时使用 GroupId、MsgSeqNumber 和 Offset。

    在获取消息时,如果您在 GMO 中给出 MQGMO_COMPLETE_MSG,则所有段会根据 MsgSeqNumber 和

    自动连接

    您将在接收应用程序上收到一条消息,其中包含 单个 GET。

    【讨论】:

      猜你喜欢
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 2018-11-28
      • 2019-12-15
      • 1970-01-01
      相关资源
      最近更新 更多