3

在下面的 JBoss/HornetQ 用户手册页中,您可以看到 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 中。

4

2 回答 2

1

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

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

于 2013-01-22T18:29:56.600 回答
0

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

在此处查看详细信息WMQ 中的分段

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

如果您在 GMO 中提供MQGMO_COMPLETE_MSG,则在获取消息时,所有段都会根据 MsgSeqNumber 自动连接,并且

您将使用单个 GET 在接收应用程序上收到一条消息。

于 2013-01-22T14:16:12.240 回答