Я смоделировал интеграционную архитектуру между различными подсистемами. Все уведомления от подсистемы отправляются в подписанные подсистемы с использованием примитива Publish
. Эти уведомления отправляются в цикле for
внутри метода Handler
, поэтому все они находятся в одном и том же TransactionScope
. Я сделал простой пример, чтобы объяснить это: клиент отправляет сообщение на сервер, который отправляет переменное количество сообщений, используя примитив Publish
. Это обработчик сервера:
public void Handle(MyMessage message)
{
for (int i = 0; i < message.numberOfNotifications; i++)
{
Bus.Publish<NotificationMessage>(m =>
{
m.myPersonalCount= i;
}
);
}
}
Я смотрю и не могу понять, что когда я устанавливаю i
на 30 или меньше, все в порядке. От 31 или более я получаю это сообщение об ошибке:
could not execute query
[ SELECT this_.SubscriberEndpoint as y0_ FROM "Subscription" this_ WHERE this_.MessageType in (?) ]
И глядя во внутреннее исключение, я получаю Unable to enlist in a distributed transaction
.
Я пробовал то же самое, используя примитив Send
, но все было (пробовал с сообщениями 10k), так что это проблема, относящаяся только к директиве Publish
.
Я использую Oracle 10g для dbms и Oracle 11g для клиента.
Если конечная точка не является транзакционной, у меня нет никаких проблем, поэтому проблема, похоже, связана только с TransactionScope.
Любая помощь приветствуется, спасибо