2015-04-28 86 views
0

我是Spring集成的新手,基本上只是試圖學習。我試圖用mysql db測試頻道消息存儲。這裏是我的彈簧配置爲使用消息存儲配置的通道維護事務 - Spring集成

<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"/> 

正如您將看到通道instanceRequests已配置Mariadb中的消息存儲。我注意到當消息進入時,表INT_CHANNEL_MESSAGE被填充,並且只要處理程序instanceRequestNameHandler讀取消息,它就刪除記錄。

我的要求是,如果由於某種原因,當處理程序正在處理時系統發生故障,消息應該保留在INT_CHANNEL_MESSAGE表中,直到另一個節點啓動它或系統重新啓動。當我說系統故障時,我的意思是服務器停止或重新啓動,而不是業務錯誤,對於業務錯誤我可以添加錯誤通道。因此,系統故障應該會有某種回滾,但現在還沒有發生。

我可以做些什麼或SI不支持嗎?

回答

0

您需要在輪詢器上啓用事務。請參閱the documentation。當下遊流程完成時,交易將被提交。

+0

謝謝@GaryRussell!我遵循交易步驟,現在正在開展工作。我會添加一個答案,我如何做到這一點 – Tatha

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> 

我在模擬集羣情景測試此停留,因此,如果一個節點從創紀錄它在記錄上鎖定的通道以及從另一個節點處理的通道不能讀取和處理記錄。如果第一個實例重新啓動/停止,它會釋放鎖定,並且節點進程確實會啓動它

相關問題