spring 集成 dsl 配置幂等接收器以识别重复项
spring integration dsl configure idempotent receiver to identify duplicates
我在使用队列中的消息时使用 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;
}
我被两件事困住了
- 我如何 configure/call 这个建议在
Jms.messageDrivenChannelAdapter?
- 如果我需要元数据存储在 oracle/mysql 中,table 看起来像任何示例链接
Idempotent Receiver 肯定是 consumer 的事情,而不是 producer 的事情,是 Jms.messageDrivenChannelAdapter()
。当然,在 Spring 集成方面。
如果您不想将重复项传递给下游,则需要在 Jms.messageDrivenChannelAdapter()
之后的消费者上配置这样一个 Advice
。在你的例子中是 .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
我在使用队列中的消息时使用 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;
}
我被两件事困住了
- 我如何 configure/call 这个建议在 Jms.messageDrivenChannelAdapter?
- 如果我需要元数据存储在 oracle/mysql 中,table 看起来像任何示例链接
Idempotent Receiver 肯定是 consumer 的事情,而不是 producer 的事情,是 Jms.messageDrivenChannelAdapter()
。当然,在 Spring 集成方面。
如果您不想将重复项传递给下游,则需要在 Jms.messageDrivenChannelAdapter()
之后的消费者上配置这样一个 Advice
。在你的例子中是 .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