IBM Integration Bus, лучшие практики для вызова нескольких сервисов
Итак, у меня есть это требование, которое принимает один документ, и из этого необходимо создать один или несколько документов на выходе.
По этой причине необходимо определить, существует ли уже документ, поскольку для создания и обновления сценариев применяются разные операции.
В прямом коде это было бы просто (концептуально)
InputData in = <something>
if (getItemFromExternalSystem(in.key1) == null) {
createItemSpecificToKey1InExternalSystem(in.key1);
}
if (getItemFromExternalSystem(in.key2) == null) {
createItemSpecificToKey2InExternalSystem(in.key1, in.key2);
}
createItemFromInput(in.key1,in.key2, in.moreData);
По сути, это своего рода "убедиться, что эти данные присутствуют".
Тем не менее, в МИБ Как мне добиться этого? Если бы я использовал подпоток для цикла Get/create, вывод подпотока был бы таким, каким будет результат последней операции, он возвращается из подпотока как новое "сообщение" потока, но на самом деле я не заботиться о значении из подпотока "обеспечить наличие данных". Вместо этого мне нужно продолжить работу над моим исходным сообщением, но все же дождаться завершения различных подпотоков, прежде чем я смогу запустить свой последний "createItem"
2 ответа
Вы можете использовать Узлы агрегации: например, использовать 3 потока:
- первым будет распространять ваше оригинальное сообщение третьему
- второй будет вызывать операции createItemSpecificToKey1InExternalSystem и createItemSpecificToKey2InExternalSystem
- третий будет агрегировать результаты первого и второго и вызвать createItemFromInput.
Вы рассматривали возможность использования узла Collector? Он соберет ваши записи в N "коллекций", а затем вы можете перебирать коллекции и выводить по одному документу на коллекцию.