Spring集成 - 请求 - 应答实现

时间:2016-07-20 19:58:43

标签: spring-integration ibm-mq

我是Spring Integration的新手,也是Stack Overflow的新手。我正在寻找一些帮助来理解Spring Integration,因为它与请求 - 回复模式有关。通过在网上阅读,我认为我应该使用Service Activator来启用这种用例。

我正在使用JMS来促进基于XML的消息的发送和接收。我们的下划线实现是IBM Websphere MQ。

我也使用Spring Boot(版本1.3.6.RELEASE)并尝试使用基于纯注释的配置方法(如果可行的话)。我已经在网上搜索并查看了一些示例,但到目前为止我看不到任何内容,这有助于我了解它是如何组合在一起的。 Spring Integration文档非常出色,但我仍然在努力解决所有部分的组合问题。如果有遗漏的话,我会提前道歉。我认为这里的帖子是最后一种选择。

以下是我的配置内容:

package com.daluga.spring.integration.configuration

import com.ibm.mq.jms.MQConnectionFactory;
import com.ibm.mq.jms.MQQueue;
import com.ibm.msg.client.wmq.WMQConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.InboundChannelAdapter;
import org.springframework.integration.annotation.IntegrationComponentScan;
import org.springframework.integration.annotation.Poller;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.config.EnableIntegration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.connection.CachingConnectionFactory;
import org.springframework.jms.core.JmsTemplate;

import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;

//import com.ibm.msg.client.services.Trace;

@Configuration
public class MQConfiguration {

    private static final Logger LOGGER = LoggerFactory.getLogger(MQConfiguration.class);

    @Value("${host-name}")
    private String hostName;

    @Value("${port}")
    private int port;

    @Value("${channel}")
    private String channel;

    @Value("${time-to-live}")
    private int timeToLive;

    @Autowired
    @Qualifier("MQConnectionFactory")
    ConnectionFactory connectionFactory;

    @Bean(name = "jmsTemplate")
    public JmsTemplate provideJmsTemplate() {
        JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
        jmsTemplate.setExplicitQosEnabled(true); 
        jmsTemplate.setTimeToLive(timeToLive);
        jmsTemplate.setDeliveryMode(DeliveryMode.NON_PERSISTENT);     
        return jmsTemplate;
    }

    @Bean(name = "MQConnectionFactory")
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory ccf  = new CachingConnectionFactory();

        //Trace.setOn();

        try {
            MQConnectionFactory mqcf = new MQConnectionFactory();
            mqcf.setHostName(hostName);
            mqcf.setPort(port);
            mqcf.setChannel(channel);
            mqcf.setTransportType(WMQConstants.WMQ_CM_CLIENT);
            ccf.setTargetConnectionFactory(mqcf);
            ccf.setSessionCacheSize(2);   
        } catch (JMSException e) {
            throw new RuntimeException(e);
        }

        return ccf;
    }

    @Bean(name = "requestQueue")
    public Destination createRequestQueue() {

        Destination queue = null;

        try {
            queue = new MQQueue("REQUEST.QUEUE");
        } catch (JMSException e) {
            throw new RuntimeException(e);
        }

        return queue;
    }

    @Bean(name = "replyQueue")
    public Destination createReplyQueue() {

        Destination queue = null;

        try {
            queue = new MQQueue("REPLY.QUEUE");
        } catch (JMSException e) {
            throw new RuntimeException(e);
        }

        return queue;
    }

    @Bean(name = "requestChannel")
    public QueueChannel createRequestChannel() {

        QueueChannel channel = new QueueChannel();

        return channel;
    }

    @Bean(name = "replyChannel")
    public QueueChannel createReplyChannel() {

        QueueChannel channel = new QueueChannel();

        return channel;
    }

}

这是我的服务类:

package com.daluga.spring.integration.service

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.stereotype.Service;


@Service
public class MyRequestReplyService {

    private static final Logger LOGGER = LoggerFactory.getLogger(MyRequestReplyService.class);

    @ServiceActivator(inputChannel = "replyChannel")
    public void sendAndReceive(String requestPayload) {
        // How to get replyPayload
    }

}

所以,在这一点上,我不太确定如何将所有这些粘合在一起以使其发挥作用。我不明白如何将我的请求粘合在一起并将响应队列回复给服务激活器以使其全部工作。

我正在调用的服务(基于JMS / Webshere MQ)使用典型的消息和相关ID,以便我可以将请求正确地绑定到相应的响应。

任何人都可以向我提供有关如何使其发挥作用的任何指导吗?请让我知道我可以提供哪些其他信息以便明确说明。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

网关提供请求/回复语义。

您应该使用Spring Integration's built-in JMS Support

,而不是直接使用JmsTemplate
@Bean
@ServiceActivator(inputChannel="requestChannel")
public MessageHandler jmsOutGateway() {
    JmsOutboundGateway outGateway = new JmsOutboundGateway();
    // set properties
    outGateway.setOutputChannel(replyChannel());
    return outGateway;
}

如果您想自己动手,请更改服务激活方法,返回回复类型并使用模板sendAndReceive()convertSendAndReceive()方法之一。

sample app使用XML配置,但应提供一些额外的指导。