弹出轮询器在特定重试计数后回滚异常

时间:2015-11-25 15:12:21

标签: spring spring-integration rollback

我的轮询器从数据库中提取数据并将其传递给服务激活器。 如果在服务激活器方法中发生任何异常,我应该将获取的数据回滚到其先前的状态,并且应该再次将相同的数据发送到服务激活器,仅用于特定的重试计数(比如3)。 **是否可以在xml配置中执行此操作。 ?有关详细信息,我将共享轮询器配置和服务激活器。 的 poller.xml



	<int-jdbc:inbound-channel-adapter id="datachannel"
		query="select loyalty_id,process_id,mobile_uid from TBL_RECEIPT where r_cre_time
		=(select min(r_cre_time) from TBL_RECEIPT where receipt_status=0)"
		data-source="dataSource" max-rows-per-poll="1"
		update="update TBL_RECEIPT set receipt_status=11 where process_id in (:process_id)">
		<int:poller fixed-rate="5000">
		<int:transactional/>
		</int:poller>
	</int-jdbc:inbound-channel-adapter>


<int:channel id="errors">
<int:queue/>
</int:channel>

   <bean id="poller" class="main.java.com.as.poller.PollerService" />

	<int:channel id="executerchannel">
		<int:dispatcher task-executor="taskExecutor" />
	</int:channel> 


	<task:executor id="taskExecutor" pool-size="2" />

	<int:service-activator input-channel="datachannel"
		output-channel="executerchannel" ref="poller" method="getRecordFromPoller">
			<int:request-handler-advice-chain>
		<int:retry-advice recovery-channel="errors" />
		</int:request-handler-advice-chain>
	</int:service-activator>
	

     <int:service-activator input-channel="executerchannel"
		ref="poller" method="getDataFromExecuterChannel">
	</int:service-activator>
	
&#13;
&#13;
&#13;

服务激活方法

&#13;
&#13;
@SuppressWarnings({ "unchecked", "rawtypes" })

	@ServiceActivator

	public void processMessage(Message message) throws IOException {
		int capLimit = Integer.parseInt(env.getProperty("capping_limit"));
		
		List<Map<String, Object>> rows = (List<Map<String, Object>>) message
				.getPayload();
		for (Map<String, Object> row : rows) {
			String loyaltyId = (String) row.get("loyalty_id");
			String processId = (String) row.get("process_id");
			String xid=(String)row.get("mobile_uid");
&#13;
&#13;
&#13;

我听说过int:在poller配置中使用的事务。但是当我添加它时,即使在成功事务之后它也会获取相同的记录。(意味着它每次都会回滚)。 有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:0)

您可以向服务激活器添加retry request-handler-advice

要使重试有状态(抛出异常以便事务将回滚),您需要提供RetryStateGenerator。否则,线程将在重试期间暂停。

无论使用有状态还是无状态重试,您都应该使用事务轮询器,以便仅在成功后应用更新。

  

表示每次都会回滚

事务轮询器仅在抛出异常时才会回滚。因此,如果您看到同一行,则必须失败。

启用所有org.springframework的DEBUG日志记录,以关注消息流和事务活动。