Spring 集成是实现事务性发件箱模式的良好框架吗?

Is Spring Integration a good framework to implement the Transactional Outbox pattern?

我正在使用 Java 实现 T运行 发件箱模式。消息中继服务将轮询发件箱 table 以查找条目,在找到并处理发件箱消息后,它将更新发件箱条目以进行“处理”。 我正在使用 Spring 引导和 运行 进入 Spring 集成项目,想知道这是否是此模式处理消息中继轮询和发件箱 JPA 更新的好方法 table 或者有更好的方法吗?

编辑 1:

我正在尝试设置 JpaOundboundGateway。这个对吗?以及如何将参数设置为 Jpa 查询?

    @Bean
public JpaExecutor jpaUpdateStateExecutor() {
    JpaExecutor jpaExecutor = new JpaExecutor(this.entityManagerFactory);
    jpaExecutor.setNamedQuery("myQuery");
    jpaExecutor.setUsePayloadAsParameterSource(true);
    jpaExecutor.setExpectSingleResult(true);
    return jpaExecutor;
}

@Bean
@ServiceActivator(inputChannel = "jpaChannel")
public MessageHandler jpaOutbound() {
    JpaOutboundGateway gateway = new JpaOutboundGateway(jpaUpdateStateExecutor());
    gateway.setGatewayType(OutboundGatewayType.UPDATING);
    return gateway;
}

我的网关:

@MessagingGateway
public interface MyGateway {
    @Gateway(requestChannel = "jpaChannel")
    @Transactional
    void jpaActions(Long idOfEntity);
}

这正是 Spring 集成的目的。

您可能会考虑使用基于其中的 JdbcChannelMessageStoreQueueChannel。因此,一项服务会在其事务中向此通道发送一条消息。另一方面,将有一个轮询消费者从该频道读取,因此您的消息 table。注意:此解决方案在轮询事务结束时从 INT_CHANNEL_MESSAGE table 中删除消息。

您可以考虑使用 JPA Outbound Channel Adapter 在一侧保留消息,在另一侧使用 JPA Polling Channel Adpater 来更新实体。

在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/jpa.html#jpa

无论哪种方式,我都没有发现使用 Spring 集成实现该模式的问题。