Siebel 8 условия гонки
Представьте себе следующую установку
- Набор из n независимых задач в списке задач должен быть выполнен в Siebel
- Задачи a, b и т. Д. Могут выполняться отдельными потоками.
- Когда поток запускается, рабочий поток записывает состояния всех n задач
- Потоки продолжают завершаться и в конечном итоге отправляют сообщение JMS в очередь.
У нас есть следующая проблема:
- Поток 1, который работает над задачей а, завершает свою работу и помечает задачу как закрытую.
- В то же время поток 2, который работает над задачей b, также завершает свою работу и помечает задачу b как закрытую.
- Два сообщения JMS помещаются в очередь и отправляются в другую серверную систему
- Вот проблема: первое сообщение JMS говорит, что состояние списка задач
a=closed b=open
и второе сообщение JMS говоритa=open b=closed
- Задачи могут быть законно повторно открыты пользователем Siebel (скажем, в целях проверки на мошенничество)
- Внутренняя система получает два сообщения JMS в любом порядке, поскольку промежуточное ПО не гарантирует порядок
- Внутренняя система получает одно сообщение JMS, говорящее
closed,open
а другой вскоре после этого говоритopen,closed
, Это может произойти в любом порядке, но результат тот же. Для серверной системы кажется, что весь список задач не был закрыт, в то время как в Siebel все задачи (a и b в этом примере) были закрыты
Мне говорят, что в Siebel нет способа, чтобы фиксация в базе данных, которая изменяет состояние задач, над которыми выполняются действия в потоке рабочего процесса, могла происходить только в самом конце рабочего процесса. Это имеет решающее значение после отправки сообщений JMS с вводящим в заблуждение состоянием. Это, очевидно, из-за необходимости откатить рабочий процесс при ошибке.
Вопросы: верно ли приведенное выше утверждение, означающее, что эта проблема никогда не может быть решена в Siebel? Если нет, то кто-нибудь может сказать мне, возможно ли исправить это в Siebel, чтобы отправлять сообщение JMS с правильным состоянием задач. Я наивно думаю, что это решается с помощью семафоров, но, по правде говоря, я был избалован в том смысле, что мне никогда не приходилось иметь дело с семафорами, и я точно не знаю, существует ли такая концепция в Siebel. Любая помощь?
1 ответ
Невозможно прочитать данные, пока они не будут переданы в базу данных, можно только контролировать время.
Используйте бизнес-сервис для синхронного вызова рабочих процессов или используйте бизнес-сервис вместо рабочего процесса и отправляйте сообщение JMS после фиксации базы данных. Инструкции для вызова рабочего процесса из бизнес-службы.