IBM MQ 中未读取标头

问题描述 投票:0回答:1

我正在尝试将带有一些标头的消息放入某个主题,并使用 java 客户端 [1] 获取它们。但是,我能够成功地添加带有标头的消息,但无法从消息中获取标头。这是我正在尝试的代码。

进入主题

MQMessage message = new MQMessage();
MQDLH mqdlh = new MQDLH();
mqdlh.setDestQName("DEV.QUEUE.1");
mqdlh.setIntValue("Reason", 10);

MQTM mqtm = new MQTM();
mqtm.setApplId("TestAppId");
mqtm.setProcessName("TestProcessName");

MQHeaderList headerList = new MQHeaderList();
headerList.add(mqdlh);
headerList.add(mqtm);
headerList.write(message);

MQPropertyDescriptor d = new MQPropertyDescriptor();
d.version = MQPD_USER_CONTEXT;
message.writeString("Your message payload");
topic.put(message);

脱离主题

MQMessage msg = new MQMessage();
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = MQGMO_WAIT;
gmo.waitInterval = MQConstants.MQWI_UNLIMITED;
topic.get(msg, gmo);

MQHeaderIterator iterator = new MQHeaderIterator(msg);

while (iterator.hasNext()) {
          MQHeader header = iterator.nextHeader();
          System.out.println(header);
}

迭代器在这里总是返回空结果。但是,如果我尝试如下逐一读取标题,我就能够成功获取它们。

MQDLH dlh = new MQDLH();
dlh.read(msg);
System.out.println(new String(dlh.getDestQName()));
System.out.println((dlh.getValue("Reason")));

我无法理解这里的问题,非常感谢任何有关此问题的帮助。我应该提供任何配置才能使其工作吗?

[1] https://mvnrepository.com/artifact/com.ibm.mq/com.ibm.mq.allclient/9.3.4.0

java ibm-mq mq
1个回答
0
投票

您可以使用

runmqsc
检查和更新队列的
PROPCTL
选项。您需要是管理员,但您可以远程运行
runmqsc
。您需要安装可再发行客户端 - https://developer.ibm.com/articles/mq-downloads/

如果您在计算机本地的 docker 镜像中运行 MQ,那么您可以运行:

export MQSERVER=DEV.APP.SVRCONN/TCP/localhost(1414)

runmqsc -c -u admin QM1

如果您的队列管理器在其他地方运行,那么您很可能需要 ccdt 来连接。

unset MQSERVER
export MQCCDTURL=<path-to-ccdt-file>
export MQSSLKEYR=<full-path-to-keydb-file> 

runmqsc -c -u <admin user id> -w 60 QM1

runmqsc 运行后,您可以发出 MQSC 命令。您可以通过运行来检查队列选项

display queue(DEV.QUEUE.1)

如果您看到

PROPCTL(NONE)
,则不会发送标头,除非

如果应用程序调用 MQCRTMH 创建消息句柄,则它必须 使用 MQINQMP 查询消息属性。名称-值对是 MQRFH2 中不保留任何消息属性,该属性已被删除 消息属性。如果应用程序不创建消息 句柄,所有消息属性都将从 MQRFH2 中删除。 MQRFH2 标头中的名称-值对保留在消息中。

您可以通过运行来设置PROPCTL

ALTER QLOCAL(DEV.QUEUE.1) PROPCTL(COMPAT)

COMPAT
是默认设置。如果它已经设置为 COMPAT,那么管理员已经故意更改了它。

© www.soinside.com 2019 - 2024. All rights reserved.