原因:无法确定回复目的地:请求消息不包含回复目的地,并且未设置默认回复目的地

发布于 2025-01-19 18:08:42 字数 3704 浏览 0 评论 0原文

使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文