我为不同子系统之间的集成架构建模。来自子系统的所有通知都使用原语发送到订阅的子系统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 有关。
任何帮助表示赞赏,谢谢