我在使用队列消息时使用DUPS_OK_ACKNOWLEDGE模式,我需要检测重复项并忽略它们。
.from(Jms.messageDrivenChannelAdapter(activeMQConnectionFactory)
.destination(sourceQueue)
.configureListenerContainer(spec -> {
spec.sessionTransacted(false);
spec.sessionAcknowledgeMode(Session.DUPS_OK_ACKNOWLEDGE);
}))
.transform(orderTransformer)
.handle(orderService, "save")
.get();
我有一个幂等的接收者建议。
@Bean
public IdempotentReceiverInterceptor idempotentReceiverInterceptor() {
IdempotentReceiverInterceptor idempotentReceiverInterceptor = new IdempotentReceiverInterceptor(new MetadataStoreSelector(m ->
(String) m.getHeaders().get("JMSMessageId")));
idempotentReceiverInterceptor.setDiscardChannelName("ignoreDuplicates");
idempotentReceiverInterceptor.setThrowExceptionOnRejection(false);
return idempotentReceiverInterceptor;
}
我遇到了两件事
答案 0 :(得分:1)
Idempotent Receiver绝对是使用者的问题,而不是 producer ,即Jms.messageDrivenChannelAdapter()
。当然,就Spring Integration而言。
如果您不想将重复项传递给下游,则需要在Advice
之后在使用者身上配置此类Jms.messageDrivenChannelAdapter()
。在您的情况下,它是.transform(orderTransformer)
。所以,代码可能如下所示:
.transform(orderTransformer, e -> e.advice(idempotentReceiverInterceptor()))
oracle / mysql MetadataStore
就在这里 - JdbcMetadataStore
,因为5.0
:https://docs.spring.io/spring-integration/docs/5.0.5.RELEASE/reference/html/jdbc.html#jdbc-metadata-store