原因:无法确定回复目的地:请求消息不包含回复目的地,并且未设置默认回复目的地
使用 JMSConfig 我正在创建 MQ 连接工厂,并且我有 InboundGatewayConfig 和 OutboundGatewayConfig ,在入站配置中我从一个队列读取消息有效负载,在出站配置中将消息发送到另一个队列,我的目标是设置回复通道以确认发送者队列一次队列接收消息。
InboundGatewayConfig:
@Configuration
@EnableIntegration
public class InboundGatewayConfig {
@Autowired
JmsConfig jmsConfig;
@Value("${fcb.inbound.receiver.queue.name}")
private String orderRequestDestination;
@Bean
public MessageChannel inboundOrderRequestChannel() {
return new DirectChannel();
}
@Bean
public MessageChannel inboundOrderResponseChannel() {
return new DirectChannel();
}
@Bean
@ServiceActivator(inputChannel = "inboundOrderRequestChannel")
public OrderService orderService() {
return new OrderService();
}
@Bean
public JmsInboundGateway jmsInboundGateway() {
JmsInboundGateway gateway = new JmsInboundGateway(
defaultMessageListenerContainer(),
channelPublishingJmsMessageListener());
gateway.setRequestChannel(inboundOrderRequestChannel());
return gateway;
}
@Bean
public DefaultMessageListenerContainer defaultMessageListenerContainer() {
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(jmsConfig.fcbCachingConnectionFactory());
container.setDestinationName(orderRequestDestination);
container.setRecoveryInterval(5000);
container.setErrorHandler(t -> System.out.println("Error in JMS Configurations \t" + t.getCause()));
return container;
}
@Bean
public ChannelPublishingJmsMessageListener channelPublishingJmsMessageListener() {
ChannelPublishingJmsMessageListener channelPublishingJmsMessageListener = new ChannelPublishingJmsMessageListener();
channelPublishingJmsMessageListener.setExpectReply(true);
return channelPublishingJmsMessageListener;
}
}
OutboundGatewayConfig:
@Configuration
public class OutboundGatewayConfig {
@Value("${fcb.inbound.receiver.queue.name}")
private String orderRequestDestination;
@Value("${fcb.inbound.response.queue.name}")
private String orderResponseDestination;
@Autowired
JmsConfig jmsConfig;
@Bean
public MessageChannel outboundOrderRequestChannel() {
return new DirectChannel();
}
@Bean
public MessageChannel outboundOrderResponseChannel() {
return new QueueChannel();
}
@Bean
@ServiceActivator(inputChannel = "outboundOrderRequestChannel")
public JmsOutboundGateway jmsOutboundGateway() {
JmsOutboundGateway gateway = new JmsOutboundGateway();
gateway.setConnectionFactory(jmsConfig.fcbCachingConnectionFactory());
gateway.setRequestDestinationName(orderRequestDestination);
gateway.setReplyDestinationName(orderResponseDestination);
gateway.setReplyChannel(outboundOrderResponseChannel());
return gateway;
}
}
这是我的服务类
public class OrderService {
private static final Logger LOGGER =
LoggerFactory.getLogger(OrderService.class);
public Message<?> order(Message<?> order) {
LOGGER.info("received order='{}'", order);
Message<?> status = MessageBuilder.withPayload("Accepted")
.setHeader("jms_correlationId",
order.getHeaders().get("jms_messageId"))
.setReplyChannelName("inboundOrderResponseChannel").build();
LOGGER.info("sending status='{}'", status);
return status;
}
}
在运行应用程序时,InboundGateway 能够从请求队列接收消息有效负载,但在回复时,给出以下警告消息。
2022-04-07 16:06:24.303 WARN 19408 --- [enerContainer-1] osjlDefaultMessageListenerContainer:目标“xxx.yyy.queue”的 JMS 消息侦听器调用程序设置失败 - 尝试恢复。原因:无法确定回复目的地:请求消息不包含回复目的地,并且未设置默认回复目的地。
Using JMSConfig i am creating MQ Connection factory and i have InboundGatewayConfig and OutboundGatewayConfig , in Inbound Config i am reading the Message payload from one queue and in Outbound config sending the message to another queue and my goad is toset reply channel to acknowledge the sender queue once queue receive the message.
InboundGatewayConfig:
@Configuration
@EnableIntegration
public class InboundGatewayConfig {
@Autowired
JmsConfig jmsConfig;
@Value("${fcb.inbound.receiver.queue.name}")
private String orderRequestDestination;
@Bean
public MessageChannel inboundOrderRequestChannel() {
return new DirectChannel();
}
@Bean
public MessageChannel inboundOrderResponseChannel() {
return new DirectChannel();
}
@Bean
@ServiceActivator(inputChannel = "inboundOrderRequestChannel")
public OrderService orderService() {
return new OrderService();
}
@Bean
public JmsInboundGateway jmsInboundGateway() {
JmsInboundGateway gateway = new JmsInboundGateway(
defaultMessageListenerContainer(),
channelPublishingJmsMessageListener());
gateway.setRequestChannel(inboundOrderRequestChannel());
return gateway;
}
@Bean
public DefaultMessageListenerContainer defaultMessageListenerContainer() {
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(jmsConfig.fcbCachingConnectionFactory());
container.setDestinationName(orderRequestDestination);
container.setRecoveryInterval(5000);
container.setErrorHandler(t -> System.out.println("Error in JMS Configurations \t" + t.getCause()));
return container;
}
@Bean
public ChannelPublishingJmsMessageListener channelPublishingJmsMessageListener() {
ChannelPublishingJmsMessageListener channelPublishingJmsMessageListener = new ChannelPublishingJmsMessageListener();
channelPublishingJmsMessageListener.setExpectReply(true);
return channelPublishingJmsMessageListener;
}
}
OutboundGatewayConfig :
@Configuration
public class OutboundGatewayConfig {
@Value("${fcb.inbound.receiver.queue.name}")
private String orderRequestDestination;
@Value("${fcb.inbound.response.queue.name}")
private String orderResponseDestination;
@Autowired
JmsConfig jmsConfig;
@Bean
public MessageChannel outboundOrderRequestChannel() {
return new DirectChannel();
}
@Bean
public MessageChannel outboundOrderResponseChannel() {
return new QueueChannel();
}
@Bean
@ServiceActivator(inputChannel = "outboundOrderRequestChannel")
public JmsOutboundGateway jmsOutboundGateway() {
JmsOutboundGateway gateway = new JmsOutboundGateway();
gateway.setConnectionFactory(jmsConfig.fcbCachingConnectionFactory());
gateway.setRequestDestinationName(orderRequestDestination);
gateway.setReplyDestinationName(orderResponseDestination);
gateway.setReplyChannel(outboundOrderResponseChannel());
return gateway;
}
}
and this my service class
public class OrderService {
private static final Logger LOGGER =
LoggerFactory.getLogger(OrderService.class);
public Message<?> order(Message<?> order) {
LOGGER.info("received order='{}'", order);
Message<?> status = MessageBuilder.withPayload("Accepted")
.setHeader("jms_correlationId",
order.getHeaders().get("jms_messageId"))
.setReplyChannelName("inboundOrderResponseChannel").build();
LOGGER.info("sending status='{}'", status);
return status;
}
}
While running the application InboundGateway able to receive the message payload from request queue but while reply , giving bellow warning message.
2022-04-07 16:06:24.303 WARN 19408 --- [enerContainer-1] o.s.j.l.DefaultMessageListenerContainer : Setup of JMS message listener invoker failed for destination 'xxx.yyy.queue' - trying to recover. Cause: Cannot determine reply destination: Request message does not contain reply-to destination, and no default reply destination set.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论