【发布时间】:2017-05-21 08:25:16
【问题描述】:
我有一个 REST 服务,它接收一些数据并通过异步 IBM MQ 请求检查数据。
REST 控制器:
@RestController
@RequestMapping("/request")
public class RequestController {
@RequestMapping(method = RequestMethod.POST)
public Response postRequest(@RequestBody Request request) {
String data = request.getData();
jmsSender.send(data);
// Now I need the response from MQ
// String mqResponse = ...
if (mqIsValid(mqResponse)) {
return createValidResponse();
}
return createNotValidResponse();
}
}
MQ 发送者:
@Service
public class JmsSender {
public void send(String data) {
jmsTemplate.convertAndSend("QUEUE.TO.MQ", data);
}
}
MQ 接收器:
@Component
public class JmsReceiver {
@JmsListener(destination = "QUEUE.FROM.MQ, containerFactory = "DefaultJmsListenerContainerFactory")
public void receiveMessage(String message) {
// How to pass the message to the controller?
}
}
如何等待来自 MQ 的正确数据在控制器中创建正确的响应?
是否可以像here 所述那样使用BlockingQueue?就我而言,我必须区分数据。我不能只从阻塞队列中取出第一个数据。
例如,如果同时有两个 REST 请求(带有数据:abc 和 xyz)。如何确保回复正确的答案,而不仅仅是我从 MQ 得到的第一个答案?
我也无法更改 MQ 接口。
【问题讨论】:
-
我不知道你是否可以使用 JMS 实现这一点。几个月前我不得不做一些类似的事情,我不得不使用 IBM MQ 类来实现这一点。如果可以使用 MQ 类,则必须设置并使用唯一的correlationId 来匹配响应和请求。
-
谢谢,我会调查的。实际上,数据本身包含一个唯一的 ID,我可以用它来识别它。但是如何告诉 REST 控制器等待 MQ 的响应并将响应传递给控制器?
标签: java rest spring-boot ibm-mq