【问题标题】:Spring Integration: Jdbc-inbound-adapter is it transactional when using adice-chainSpring集成:使用adice-chain时Jdbc-inbound-adapter是事务性的
【发布时间】:2014-05-24 16:09:06
【问题描述】:

我的 jdbc-inbound-adapter 有以下配置:

    <si-jdbc:inbound-channel-adapter id="jdbcInboundAdapter"
    channel="queueChannel" data-source="myDataSource"
    auto-startup="true"
    query="SELECT * FROM STAGE_TABLE WHERE STATUS='WAITING'  FOR UPDATE SKIP LOCKED"
    update="UPDATE STAGE_TABLE SET STATUS='IN_PROGRESS' WHERE ID IN (:Id)"
    max-rows-per-poll="100" row-mapper="rowMapper"
    update-per-row="true">

    <si:poller fixed-rate="5000">
        <si:advice-chain> 
            <ref bean="txAdvice"/> 
            <ref bean="inboundAdapterConfiguration"/> 
        </si:advice-chain>
    </si:poller>
</si-jdbc:inbound-channel-adapter>
    <tx:advice id="txAdvice">
        <tx:attributes>
            <tx:method name="get*" read-only="false"/>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>

我的问题是 select 和 update 语句是否会在同一个事务中执行。

在 spring-integration 文档中,它没有明确指定使用建议链时的交易。 (我使用的是spring-integration-jdbc-2.2.0.RC2.jar) 请参阅第 18.1.1 节轮询事务支持: http://docs.spring.io/spring-integration/docs/2.0.0.RC1/reference/html/transactions.html

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

    您正在使用一个非常旧的版本(当时只是一个候选版本,而不是 GA 版本。当前版本是 3.0.2.RELEASE,最新的 2.2.x2.2.6.RELEASE。请升级到其中一个。

    http://projects.spring.io/spring-integration/

    是的,这一切都在同一个事务中完成。

    你指的是旧文档吗? current documentation

    “用于 JDBC 的轮询器的一个非常重要的特性是将轮询操作包装在事务中的选项,..”。

    事务启动,消息源被调用(获取结果),下游流程全部发生在事务中(除非你切换到另一个线程,在这种情况下事务将在那个时候提交)。

    实际上,更新是在选择之后(并且在发送消息之前)完成的,但是直到下游流程完成后才会发生提交。

    您的频道名为queueChannel;如果它真的是一个队列通道,这意味着一旦消息存储在队列中,事务就会提交。

    如果您认为需要改进文档,请打开JIRA Issue

    【讨论】:

    • 谢谢加里。 1. 关于 Spring-Integration Jar 版本:我们当前的构建已经在生产中。我们将在 6 周后发布另一个版本。我们拥有 3.1.2 版的所有其他 Spring Jar。您认为 2.2.6 或 3.0.2 哪个好。 2.queueChannel是容量为200的QueueChannel。 3.Abt文档:我在搜索poller交易详情时,偶然发现了2.0.0的文档。
    • 另外一个注释:我有一个实现 RowMapper 接口来读取记录的 bean。这个 bean 的范围应该是单例还是原型,以加快读取过程。我们每天收到大约 40 万条消息需要处理。
    • 2.0.0 是古老的;在我的答案的第一个链接中,项目页面上有指向最新文档版本的链接。 RowMapper 应该是无状态的,无论如何它只注入一次,所以无论它是否是单例都不会有什么区别。 2.2.6 不应要求您进行任何工作;您可能需要进行一些小的更改才能转到 3.0.x;有关详细信息,请参阅 Wiki。 github.com/spring-projects/spring-integration/wiki
    猜你喜欢
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多