维护使用消息存储配置的通道的事务 - Spring集成

时间:2015-04-28 14:08:39

标签: java spring spring-integration

我是Spring集成的新手,基本上只是想学习。我试图用mysql db测试通道消息存储。这是我的春季配置

<beans:bean id="jdbcChannelStore" class="org.springframework.integration.jdbc.store.JdbcChannelMessageStore">
    <beans:property name="dataSource" ref="dataSource" />
    <beans:property name="channelMessageStoreQueryProvider">
    <beans:bean class="org.springframework.integration.jdbc.store.channel.MySqlChannelMessageStoreQueryProvider" />
    </beans:property>
</beans:bean>

 <beans:bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
    <beans:property name="driverClassName" value="org.mariadb.jdbc.Driver" />
    <beans:property name="url" value="jdbc:mysql://localhost:3306/TESTDB" />
    <beans:property name="username" value="root" />
    <beans:property name="password" value="######" />
</beans:bean> 


<!-- instanceRequests are processed by the filter one -->
<int:channel id="instanceRequests">
    <int:queue capacity="20" message-store="jdbcChannelStore"/>
    <int:interceptors>
        <beans:bean class="com.trivialjava.rnd.interceptors.TimingInterceptor">
            <beans:constructor-arg>
                <beans:array>
                    <beans:value>com.trivialjava.rnd.entity.InstanceRequest</beans:value>
                    <beans:value>com.trivialjava.rnd.entity.SolutionRequest</beans:value>

                </beans:array>
            </beans:constructor-arg>
        </beans:bean>
    </int:interceptors>
</int:channel>
<int:service-activator input-channel="instanceRequests" ref="instanceRequestNameHandler" method="prepareName" output-channel="instanceRequestsDesc"/>

您将看到已在Mariadb中使用消息存储配置了通道instanceRequests。我注意到,当消息进入时,表格 INT_CHANNEL_MESSAGE 会被填充,一旦处理程序 instanceRequestNameHandler 读取消息,它就会删除记录。

我的要求是,如果由于某种原因在处理程序处理时系统出现故障,该消息应保留在INT_CHANNEL_MESSAGE表中,直到另一个节点选择它或系统重新启动。当我说系统故障时,我的意思是服务器停止或重新启动,而不是业务错误,对于业务错误,我可以添加错误通道。因此,应该对系统故障进行某种回滚,但现在不会发生这种情况。

我可以对此做些什么或者SI不支持这个吗?

2 个答案:

答案 0 :(得分:0)

您需要在轮询器上启用事务。见the documentation。下游流程完成时将提交事务。

答案 1 :(得分:0)

Well Spring Integration确实支持具有消息存储的通道的事务。这就是我实现一个非常基本的事务的方式,以确保即使在os系统失败的情况下,消息也会留在商店中

<!-- added a simple transaction for the poller-->
<int:poller id="poller" default="true" fixed-delay="30000">
    <int:transactional transaction-manager="transactionManager"/>
</int:poller>

<beans:bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <beans:property name="dataSource" ref="dataSource" />
</beans:bean>

我在模拟集群方案中对此进行了测试,因此,如果一个节点从通道读取记录,则会锁定记录,而从另一个节点处理的其他节点无法读取和处理记录。如果第一个实例重新启动/停止,它会释放锁定,节点进程会提取它