gpt4 book ai didi

spring-integration - 使用 spring 集成向非 jms 客户端发送消息

转载 作者:行者123 更新时间:2023-12-04 08:28:09 24 4
gpt4 key购买 nike

我需要通过 IBM MQ 将消息从 spring 集成发送到非 jms 应用程序

我曾尝试发送消息,但不幸的是,由于消息中包含不需要的 Jms header 并获取数据格式异常,接收方非 jms 应用程序无法使用

如何在使用 spring 集成向非 jms 应用程序发送消息之前删除 jms header

我在 IBM MQ 网站上找到了一些引用链接

https://www.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/q032140_.htm

最佳答案

有很多方法可以做到这一点,从您已经收到的评论和答案的传播中可以看出。你如何做真的取决于你。

正如 Daniel 所述,您可以修改队列 URL。

正如 Morag 所说,您可以使用 MQSC 来更改队列。

您也可以通过代码来完成此操作。您尚未提供任何代码,因此很难告诉您如何执行此操作,但如果您将目标(队列)转换为 MQDestination,则可以使用 IBM JMS API 排除 RFH2 header 。

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;
}
}

关于spring-integration - 使用 spring 集成向非 jms 客户端发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65162136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com