spring integration dsl配置idempotent接收器来识别重复项

时间:2018-05-17 22:42:31

标签: spring-integration spring-integration-dsl

我在使用队列消息时使用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;
}

我遇到了两件事

  1. 如何配置/调用此建议 Jms.messageDrivenChannelAdapter?
  2. 如果我需要元数据存储在oracle / mysql中,那么该表如何看起来像任何示例链接

1 个答案:

答案 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.0https://docs.spring.io/spring-integration/docs/5.0.5.RELEASE/reference/html/jdbc.html#jdbc-metadata-store