【发布时间】:2020-11-16 18:53:40
【问题描述】:
QUEUE_INI 使用 IBM MQ9、最新的 spring boot 和 IBM 的 spring-boot-starter。
我想用@JmsListner 接收一条消息,然后不提交它,将另一条消息发送到另一个队列,接收响应,然后全部提交。
到目前为止,我还有下一个:
@JmsListener(destination = QUEUE_IN, selector = "type='com.example.MainRequest")
public void receiveMessage(Message message) throws JMSException {
LOG.info("Received {} <{}>", QUEUE_IN, message);
jmsTemplate2.convertAndSend(QUEUE_OUT, "SUB Request", requestMsg -> {
requestMsg.setStringProperty("type", "com.example.SubRequest");
return requestMsg;
});
LOG.info("Message sent");
Message reply = jmsTemplate2.receiveSelected(QUEUE_IN, "type='com.example.SubResponse'");
LOG.info("Received reply from {}: <{}>", QUEUE_IN, reply);
}
我卡在“已发送消息”上。看起来子请求还没有真正发送。我在 MQ UI 中看到队列深度为 1,但里面没有消息,我的子请求侦听器也没有看到任何消息。
我也试过使用sendAndReceive 方法:
Message reply = jmsTemplate.sendAndReceive(QUEUE_OUT, session -> {
Message msg = session.createTextMessage();
msg.setStringProperty("type", "com.example.SubRequest");
LOG.info("Sending msg: <{}> to {}", msg, QUEUE_OUT);
return msg;
});
但我没有访问模型队列的权限。
有什么办法可以做到吗?
更新:
我在大家的共同帮助下完成了这项工作。我最终得到了单独的服务,只发送带有@Transactional(propagation = Propagation.REQUIRES_NEW) 的子请求。所有其他逻辑都保留在主侦听器中。
同时打开事务开始/结束日志也很有帮助:
logging:
level:
org.springframework.transaction.interceptor: trace
【问题讨论】:
-
您能否在您的问题中提供一些澄清。
Model queue表示动态队列,这是正确的,您是否使用动态队列作为输出消息。在您的代码中,您似乎正在为QUEUE_IN收听receiveSelected中的消息,那不应该是QUEUE_OUT吗?我认为您应该在两组代码的模型队列上获得相同的不足权限。 -
@chughts 我拥有常规队列的权限。我将子请求发送到
QUEUE_OUT。另一个服务将收到它并将回复发送回QUEUE_IN。所以是正确的(记录有错误)
标签: java spring-boot jms ibm-mq