我正在构建一个简单的REST api,它将Web服务器连接到后端服务,后端服务执行简单的检查并发送响应。
所以客户端(通过HTTP(->到Web服务器(通过ACTIVEMQ/CAMEL(->到Checking-Service,然后再回来。
GET 请求的端点是"/{id}"。我正在尝试使它通过 queue:ws-out 发送一条消息到 queue:cs-in,并将其一直映射回原始 GET 请求。
检查服务 (cs( 代码很好,它只是使用 jmslistener 将 CheckMessage 对象中的一个值更改为 true。
我已经在网上彻底搜索了示例,但无法获得任何工作。我找到的最接近的如下。
这就是我到目前为止在 Web 服务器 (ws( 上所拥有的。
休息控制器
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) {
}
}
谢谢!
-
您从"ws-in"接收消息,其中包含 2 个消费者 jmsTemplate.receiveSelectedAndConvert 和 WSListener !! 来自队列的消息由 2 个之一使用。
-
您向"WS-out"发送消息并从"WS-IN"使用?? 最后一个队列为空且未收到任何消息,您必须将消息发送到它
您需要一个有效的选择器来检索基于 JMSCorrelationID 的 receiveSelectedAndConvert 的消息,作为您创建的示例或从 rest 请求收到的 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);
}
}