#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()) {