2014-12-12 7 views
1

Хорошо, я добавил мою конфигурацию весны xml для большего объяснения моей ситуации.Как я могу найти точку завершения транзакции весной?

Во-первых, я агрегировал 7 каналов Во-вторых, агрегатор выпускает объединенный канал, объявленный как канал публикации. Третьи, Каждые 7 подписных каналов для выбора внутренней базы данных для каждого сообщения. Forth, Каждый канал вставляет данные во внешнюю базу данных с помощью адаптера jdbc-outbound-channel.

Ниже я приложил каждую конфигурацию xml, связанную .. Спасибо.

<int:bridge input-channel="request-write-to-openPMSQueueChannel" 
     output-channel="writetoOpenPMSChannel"> 
     <int:poller fixed-rate="5000" max-messages-per-poll="-1"> 
      <int:transactional propagation="REQUIRED" 
       transaction-manager="transactionExternalDatabaseManager" /> 
     </int:poller> 
    </int:bridge> 

<int:chain input-channel="writetoOpenPMSChannel" 
    output-channel="writetoOpenPMS007Channel"> 
    <int:service-activator method="exectue007"> 
     <bean id="" 
      class="com.sds.redca.core.module.analyzer.convert.ModelingConvertSVC"> 
     </bean> 
    </int:service-activator> 
    <int:splitter ref="fromListToRowSplitter" /> 
</int:chain> 

<int:chain input-channel="writetoOpenPMSChannel" 
     output-channel="writetoOpenPMS006Channel"> 
     <int:service-activator method="exectue006"> 
      <bean id="" 
       class="com.sds.redca.core.module.analyzer.convert.ModelingConvertSVC"> 
      </bean> 
     </int:service-activator> 
     <int:splitter ref="fromListToRowSplitter" /> 
    </int:chain> 

<int-jdbc:outbound-channel-adapter channel="writetoOpenPMS001Channel" 
query="INSERT INTO IF_RSRC 
     (PJT_ID, DT_INPUT, RSRC_ID, RSRC_TYPE_ID, RSRC_DETAILTYPE_ID, RSRC_NM, CNFG_PJT_NM, RSRC_PATH_NM, LST_RGSTR_ID, LST_RGST_DTM, FINAL_RVSN_NO, YN_USE) 
     VALUES 
     (:payload[PJT_ID], :headers[timeStamp], :payload[RSRC_ID], :payload[RSRC_TYPE_ID], :payload[RSRC_DETAILTYPE_ID], :payload[RSRC_NM], :payload[CNFG_PJT_NM], 
     :payload[RSRC_PATH_NM], :payload[LST_RGSTR_ID], :payload[LST_RGST_DTM], :payload[FINAL_RVSN_NO], :payload[YN_USE])" 
data-source="outboundDataSource" /> 
<int-jdbc:outbound-channel-adapter channel="writetoOpenPMS002Channel" 
query="INSERT INTO IF_RSRC_RELATION 
     (PJT_ID, DT_INPUT, MAIN_RSRC_ID, SUB_RSRC_ID, RELATION_TYPE_CODE_ID) 
     VALUES 
     (:payload[PJT_ID], :headers[timeStamp], :payload[MAIN_RSRC_ID], :payload[SUB_RSRC_ID], :payload[RELATION_TYPE_CODE_ID])" 
data-source="outboundDataSource" /> 

Но проблема в том, что я должен вызвать какое-либо событие сразу после того, когда 7 вставные работы успешно завершена. Как я могу получить точку, в которой 7 транзакций вставки завершены для запуска некоторого пост-события?

ответ

1

К сожалению, информации недостаточно. Нам нужно увидеть конфигурацию upstream.

Если все ваши INSERT s находятся в одном TX, вы можете просто и еще один подписчик в конце логики бизнеса.

Если все выполнено с использованием той же темы с TX, TX не будет завершен, пока вы не сделаете это окончательное уведомление.

С другой стороны, если все они живут в разных транзакциях, вам нужно что-то вроде receipt, когда каждый элемент добавляет некоторую информацию в еще одну таблицу, чтобы подтвердить, что она выполнила оригинальную работу. Да, это может быть в том же TX.

Чтобы определить, что все требуемые элементы завершили свою работу, вам необходимо: poll с коротким интервалом, чтобы новая таблица с определенным бизнес-ключом подсчитывала их.

С другой стороны все ваши задачи могут отправлять одно и то же сообщение в общий <aggregator> и что для них будет выпущена одна группа только тогда, когда все совершили транзакцию.

Возможно, существует аноректное решение, но нам нужно больше узнать о вашем прецеденте.

UPDATE

Спасибо за конфиге.

Я надеюсь, что ваш writetoOpenPMSChannel является однопотоковым каналом публикации-подписки.

Итак, все ваши процессы writetoOpenPMS* связаны с TX-плеером и будут выполняться один за другим в пределах одного TX.

Следовательно, нет никаких остановок, чтобы добавить еще одного абонента к этому каналу в качестве последнего. И он получает одно и то же сообщение в конце TX, непосредственно перед фиксацией. Если у вас нет отложенных ограничений для этих таблиц, все будет в порядке и в пределах одного TX.

С другой стороны <poller> «ы <transactional> имеет synchronization-factory возможность получить сделку с фиксации/отката с помощью TransactionSynchronization стратегии: http://docs.spring.io/spring-integration/docs/latest-ga/reference/html/transactions.html#transaction-synchronization

+0

Как вы сказали, я добавил мой вверх по течению конфигурации. пожалуйста помогите. Спасибо за внимание :) – verystrongjoe

+0

Обновлен asnwer в соответствии с вашей конфигурацией. –

+0

Спасибо вам за подробный ответ. Но, все же, я не могу знать, где я могу поставить код события post post. Можете ли вы дать более подробное объяснение? – verystrongjoe

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