使用Spring和activemq通过HTTP请求响应

时间:2018-01-29 15:22:06

标签: spring-boot activemq spring-jms

我正在构建一个简单的REST api,它将Web服务器连接到后端服务,后端执行简单的检查并发送响应。

所以客户端(通过HTTP) - >到Web服务器(通过ACTIVEMQ / CAMEL) - >检查服务,然后再回来。

GET请求的终端是" / {id}" 。我尝试通过 queue:ws-out queue:cs-in 发送消息,并将其一直映射回原来的GET请求。

Checking-Service( cs )代码很好,它只是使用jmslistener将CheckMessage对象中的值更改为true。

我已经在网上彻底搜索了一些示例,但无法正常工作。我找到的最接近的是following

这是我到目前为止在Web服务器上的内容( ws )。

RestController

import ...

@RestController
public class RESTController extends Exception{

    @Autowired
    CamelContext camelContext;

    @Autowired
    JmsTemplate jmsTemplate;

    @GetMapping("/{id}")
    public String testCamel(@PathVariable String id) {

        //Object used to send out
        CheckMessage outMsg = new CheckMessage(id);
        //Object used to receive response
        CheckMessage inMsg = new CheckMessage(id);

        //Sending the message out (working)
        jmsTemplate.convertAndSend("ws-out", outMsg);

        //Returning the response to the client (need correlation to the out message"
        return jmsTemplate.receiveSelectedAndConvert("ws-in", ??);
    }

}

ws上的听众

@Service
public class WSListener {

    //For receiving the response from Checking-Service
    @JmsListener(destination = "ws-in")
    public void receiveMessage(CheckMessage response) {
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

  1. 您收到来自" ws-in"的消息与2个消费者jmsTemplate.receiveSelectedAndConvert和WSListener !!来自队列的消息由2中的一个消耗。

  2. 您向" ws-out"发送消息并从" ws-in"消费??最后一个队列 是空的,没有收到任何消息,你必须发送消息 它

  3. 你需要一个有效的选择器来检索带有基于JMSCorrelationID的receiveSelectedAndConvert作为你所提到的例子或从其余请求收到的id的消息,但是你需要将这个id添加到下面的消息头中

        this.jmsTemplate.convertAndSend("ws-out", id, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                TextMessage tm = session.createTextMessage(new CheckMessage(id));
                tm.setJMSCorrelationID(id);
                return tm;
            }
        });
    
    
        return jmsTemplate.receiveSelectedAndConvert("ws-in", "JMSCorrelationID='" + id+ "'");
    

    转发来自" ws-out"的消息到" ws-in"

    @Service
    public class WSListener {
    
        //For receiving the response from Checking-Service
        @JmsListener(destination = "ws-out")
        public void receiveMessage(CheckMessage response) {
            jmsTemplate.convertAndSend("ws-in", response);
        }
    }