有很多方法可以做到这一点,从 cmets 的传播和您已经收到的答案中可以看出。你如何做到这一点真的取决于你。
正如丹尼尔所说,您可以修改队列网址。
正如 Morag 所说,您可以使用 MQSC 来更改队列。
您也可以通过代码执行此操作。您没有提供任何代码,因此很难告诉您如何执行此操作,但如果您将目标(队列)转换为 MQDestination,则可以使用 IBM JMS API 排除 RFH2 标头。
RFH2 将被排除
import javax.jms.Destination;
import com.ibm.mq.jms.MQDestination;
import com.ibm.msg.client.wmq.WMQConstants;
...
Destination destination = ...
...
MQDestination mqDestination = (MQDestination) destination;
destination.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);
我在 Spring 中使用此服务对此进行了测试
import com.ibm.mq.jms.MQDestination;
import com.ibm.msg.client.wmq.WMQConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
import javax.jms.*;
@Service
public class SendMessageNonJmsService {
protected final Log logger = LogFactory.getLog(getClass());
final private JmsTemplate myNonJmsTemplate;
@Autowired
private ConnectionFactory connectionFactory;
SendMessageNonJmsService(JmsTemplate myNonJmsTemplate) {
this.myNonJmsTemplate = myNonJmsTemplate;
}
public void sendAsNonJms(String msg) {
Destination destination = null;
JMSContext context = connectionFactory.createContext();
destination = context.createQueue("queue:///audit");
try {
MQDestination mqDestination = (MQDestination) destination;
mqDestination.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);
}
catch (JMSException ex) {
logger.warn("JMSException preparing message destination : "
+ ex.getErrorCode() + " : "
+ ex.getMessage());
}
myNonJmsTemplate.send(destination, session -> session.createTextMessage(msg));
}
}
如果您希望发送代码尽可能简单
public void sendAsNonJms(String msg) {
myNonJmsTemplate.send("audit", session -> session.createTextMessage(msg));
}
然后你可以在你的 JmsTemplate 上设置一个目标解析器
@Bean("myNonJmsTemplate")
public JmsTemplate myNonJmsTemplate() {
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
jmsTemplate.setDestinationResolver(new OurDestinationResolver());
return jmsTemplate;
}
你的目标解析器看起来像这样:
import com.ibm.mq.jms.MQDestination;
import com.ibm.msg.client.wmq.WMQConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.support.destination.DestinationResolver;
import javax.jms.*;
public class OurDestinationResolver implements DestinationResolver {
protected final Log logger = LogFactory.getLog(getClass());
@Autowired
private ConnectionFactory connectionFactory;
@Override
public Destination resolveDestinationName(Session session, String dest, boolean pubSub) throws JMSException {
Destination destination = null;
if (pubSub) {
destination = session.createTopic(dest);
} else {
destination = session.createQueue(dest);
}
MQDestination mqDestination = (MQDestination) destination;
mqDestination.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);
return destination;
}
}