Процесс BPEL остановлен на втором приеме - PullRequest
2 голосов
/ 20 апреля 2011

Я новичок в написании BPEL. Я понял простой процесс ниже:

Receive1 | | invoke1 | | receive2 | | invoke2

Проблема в том, что процесс корректно работает до «receive2», но когда я вызываю, через soapUI, операция, связанная с «receive2», ничего не происходит. Я читал другие сообщения о BPEL, но ничего не соответствует этому вопросу. Ниже приведены реальные действия (я пропустил Назначить).

    <bpel:receive name="receiveInput" partnerLink="client"
             portType="tns:HealthMobility"
             operation="initiate" variable="input"
             createInstance="yes"/>

    <bpel:invoke name="getTreatmentOptions" 
     partnerLink="treatmentProviderPL" operation="getTreatmentOptions"  
     inputVariable="getTreatmentOptionsReq" outputVariable="getTreatmentOptionsResp"> 
    </bpel:invoke>

    <bpel:receive name="bookMobility" partnerLink="client" operation="bookMobility" 
     variable="bookMobilityReq" portType="tns:HealthMobility"/>

    <bpel:invoke name="getTripOptions" partnerLink="mobilityMultiProvidersPL"  
     operation="getTripOptions" inputVariable="getTripOptionsReq" 
     outputVariable="getTripOptionsResp"></bpel:invoke>

Я попытался выполнить отладку, просто удалив прием и статически инициализировав входную переменную, требуемую для вызова getTriOptions. В этом случае все работает нормально, поэтому это обязательно означает, что процесс продолжит ожидать получения, даже если я вызову bookMobility через SOAPUI. Мой вопрос: почему? Я что-то упустил?

Спасибо

1 Ответ

3 голосов
/ 20 апреля 2011

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

Чтобы решить эту проблему, вам нужно найти идентификатор в полезной нагрузке сообщения и инициализировать набор корреляций с этим значением. Затем, при использовании того же набора корреляции со вторым приемом, все сообщения, которые содержат один и тот же идентификатор, будут направлены в этот конкретный экземпляр процесса. Для получения дополнительной информации о корреляционных наборах я рекомендую прочитать праймер BPEL , раздел 4.2.4.

...