有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用Spring JmsTemplate更改MQ头

我使用简单的SpringJMSTemplate将消息发送到MQ

<beans:bean id="myJMSTemplate" class="org.springframework.jms.core.JmsTemplate">
    <beans:property name="connectionFactory">
        <beans:ref bean="cachedConnectionFactory" />
    </beans:property>
    <beans:property name="pubSubDomain">
        <beans:value>false</beans:value>
    </beans:property>
    <beans:property name="receiveTimeout">
        <beans:value>1000</beans:value>
    </beans:property>
</beans:bean>

    <int-jms:outbound-channel-adapter id="sendMessageToAvengers" channel="antEventChannel" jms-template="myJMSTemplate" destination-name='com.marvel.avengers.antMan'/>

这工作正常,但是,我的客户端应用程序无法处理消息,因为默认情况下消息格式为“MQHRF2”。 如何更改MQ头以显式发送MQSTR格式

提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    IBM MQ JMS接口有一个名为TARGCLIENT的属性,当设置为值MQ时,该属性不会添加MQRFH2头。我不知道Spring接口是否允许使用它

    或者,可以将队列管理器上的队列定义配置为删除无法处理它的应用程序的头。这是一种更好的删除MQRFH2头的方法,因为它在get时间而不是put时间删除MQRFH2头,这意味着如果应用程序能够处理MQRFH2头,它仍然在那里,但是对于无法处理它的应用程序,它将为它们删除

    要使队列以这种方式运行,请在队列管理器上发出以下MQSC命令:

    ALTER QLOCAL(q-name) PROPCTL(NONE)
    

    额外阅读

  2. # 2 楼答案

    您必须设置属性targetcllient=1,才能将消息作为MQSTR发送。 要在发送部分java代码时执行此操作,请按如下所示更改队列名称

    String senderQ = "queue:///MYQUEUENAME?targetClient=1";
    jmsTemplate.send(senderQ, new MessageCreator() {
        public Message createMessage(Session session) throws JMSException {
             TextMessage message = session.createTextMessage(text);
             message.setJMSReplyTo(replyToQ);
             return message;
        }
    });
    

    或者,您可以尝试在jmstemplatebean中设置它

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <!  set format to MQSTR with "targetClient=1" parameter  >
        <property name="defaultDestinationName" value="queue:///default?targetClient=1" />
        <property name="connectionFactory" ref="mqConnectionFactory" />
    </bean>