Почему моя функция timeToLiveFunction никогда не вызывается?

#spring-integration #spring-jms

#spring-интеграция #spring-jms

Вопрос:

У меня следующий поток:

 @Bean
public IntegrationFlow workerInfoJmsOut(ConnectionFactory connectionFactory, WorkerProperties properties) {
  return IntegrationFlows
    .from(ChannelNames.WORKER_INFO)
    .handle(Jms.outboundAdapter(connectionFactory)
      .timeToLiveFunction(message -> properties.getHeartbeatTtl().toMillis())
      .destination(JmsQueueNames.WORKER_INFO))
    .get();
}
  

И следующий шлюз:

 @MessagingGateway
public interface DispatcherGateway {

  @Gateway(requestChannel = ChannelNames.WORKER_INFO)
  void submit(WorkerMessage message);
}
  

Которая вызывается каждые 1 секунду:

 @Scheduled(fixedDelay = 1000)
public void beat() {
  dispatcherGateway.submit(WorkerInfoNotice.of(...));
}
  

Однако точка останова в timeToLiveFunction никогда не выполняется:

расположение точки останова

Я что-то неправильно понял или почему она никогда не срабатывает?

spring-integration-jms:5.3.1.RELEASE

Ответ №1:

Я обнаружил, что мне нужно включить явное QoS

 @Bean
public IntegrationFlow workerInfoJmsOut(ConnectionFactory connectionFactory, WorkerProperties properties) {
  return IntegrationFlows
    .from(ChannelNames.WORKER_INFO)
    .handle(Jms.outboundAdapter(connectionFactory)
      .configureJmsTemplate(spec -> spec.explicitQosEnabled(true))
      .timeToLiveFunction(message -> properties.getHeartbeatTtl().toMillis())
      .destination(JmsQueueNames.WORKER_INFO))
    .get();
}
  

Комментарии:

1. Вы правы: эта опция действительно является частью QoS: if (this.jmsTemplate instanceof DynamicJmsTemplate amp;amp; this.jmsTemplate.isExplicitQosEnabled()) {