Лучшая практика при вызове асинхронного процесса bpel из процесса синхронизации bpel

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

Я полагаю, что это не единственное доступное решение, касающееся процесса синхронизации, ожидающего асинхронного. Мой вопрос здесь в том, есть ли лучший способ сделать это? Касательно производительности специально.

Если на этот вопрос уже был ответ, извините, но я его не нашел.


person gilneto8    schedule 06.08.2014    source источник


Ответы (1)


Лучшим способом было бы отправить сообщение из асинхронного процесса в синхронизирующий. Последний может просто заблокировать активность receive, пока не придет сообщение. Это лучше с точки зрения производительности, поскольку процессу синхронизации не нужно регулярно просыпаться и проверять базу данных. Вместо этого он может просто заснуть, пока механизм не обнаружит прибытие сообщения и не активирует процесс синхронизации.

Обратите внимание, что это означает, что вы должны использовать correlationSets [1] на стороне процесса синхронизации, который должен быть инициирован в какой-то момент времени до ожидания фактического сообщения (например, во время вашего начального receive). Это необходимо для того, чтобы механизм мог решить, в какой экземпляр процесса переслать сообщение. Вы также можете добавить дополнительные partnerLink с myRole в процесс синхронизации, чтобы была операция для вызова асинхронным процессом (которому также требуется соответствующий partnerLink). Структура процесса синхронизации, которую я имею в виду, выглядит примерно так:

<sequence>
  <receive name="initialSyncReceive" createInstance="yes" partnerLink="originalPartnerLink" ... />
  <!-- some logic before waiting on async process -->
  <receive name="notificationFromAsync" partnerLink="newPartnerLinkForAsyncOnly" ... />
  <!-- some logic after notification from async process -->
  <reply name="replyToSyncRequest" partnerLink="originalPartnerLink" ... />
<sequence>

Отказ от ответственности. Это всего лишь набросок, и вы не можете просто скопировать/вставить код. Чтобы этот сценарий работал, требуется ряд нетривиальных изменений в обоих процессах, например. добавление correlationSets, дополнительных WSDL, propertyAliases и partnerlinks.

person joergl    schedule 07.08.2014
comment
Спасибо за вклад, я думаю, что могу это представить. - person gilneto8; 08.08.2014