2015-11-25 2 views
0

Мой опроллер извлекает данные из БД и передает их активатору службы. Если какое-либо исключение происходит в методе активатора службы, я должен откатить данные, извлеченные в предыдущее состояние, и снова отправить те же данные активисту службы только для определенного количества повторных попыток (скажем, 3) . ** Возможно ли это сделать в xml-конфигурации. ? Для получения подробной информации я расскажу о настройках poller и активаторе сервиса. poller.xmlВозврат весеннего опрокера по исключению после определенного количества повторных попыток

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

 

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

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

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

 

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

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

 
    <int:service-activator input-channel="executerchannel" 
 
\t \t ref="poller" method="getDataFromExecuterChannel"> 
 
\t </int:service-activator> 
 
\t

службы метод активатор

@SuppressWarnings({ "unchecked", "rawtypes" }) 
 

 
\t @ServiceActivator 
 

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

я слышал о int: transactional используется в конфигурации poller. Но когда я добавил его, он взял ту же запись даже после успешной транзакции. (означает, что он каждый раз откатывается). Может кто-нибудь, пожалуйста, помогите мне в этом?

+0

Могу ли я спросить, почему вы хотите выполнить те же самые вещи, зная, что это провалится? –

+0

от активатора службы Я звоню во внешнюю систему. Если я получаю любое исключение из этой службы, мне нужно отменить транзакцию и повторить попытку – chungunuvavaa

ответ

0

К сервисному активатору можно добавить retry request-handler-advice.

Чтобы сделать повторную попытку (исключение, чтобы транзакция откатилась), вы должны указать RetryStateGenerator. В противном случае поток будет просто приостановлен во время повторных попыток.

Независимо от использования повторения попыток с сохранением состояния или без сохранения состояния, вы действительно должны использовать транзакционный опрос, чтобы обновление применялось только после успеха.

означает его получение откатить каждый

Транзактная голосующий будет откатить только если исключение. Поэтому, если вы видите ту же строку, что-то должно быть неудачно.

Включите ведение журнала DEBUG для всех org.springframework, чтобы следить за потоком сообщений и транзакцией.

+0

Я попробую это и дам вам знать. Спасибо за ваше драгоценное время – chungunuvavaa

+0

От ссылки что вы предоставили http://docs.spring.io/spring-integration/reference/html/messaging-endpoints-chapter.html#message-handler-advice-chain ... Совет повторных попыток (osihandler.advice.RequestHandlerRetryAdvice) использует богатые механизмы повтора. Я не могу найти, что этот сервер class.jetty бросает ошибку. Я знаю, что я глуп, чтобы спросить об этом, но у меня нет идеи. Должен ли я создать класс под названием RequestHandlerRetryAdvice на себе. должен ли я писать в этом классе. Пожалуйста, уточните, пожалуйста. – chungunuvavaa

+0

'o.s.i.' - аббревиатура - см. [Здесь] (http://docs.spring.io/spring-integration/reference/html/_conventions_in_this_book.html). Класс находится в 'spring-integration-core' и был представлен в версии 2.2; текущая версия - 4.2.2. –

Смежные вопросы