我模拟了不同子系统之间的集成架构。所有来自子系统的通知都使用原始Publish
发送到订阅的子系统。这些通知在Handler
方法内的for
循环中发送,因此它们全都在相同的TransactionScope
中。我做了一个简单的例子来解释这一点:客户端发送消息到服务器,该服务器使用原始Publish
发送可变数量的消息。这是服务器处理器:在transactionScope中多次发布失败
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 11g客户端的Oracle 10g。
如果端点不是事务性的,我没有任何问题,所以这个问题似乎只与TransactionScope的关心。
任何帮助表示赞赏,谢谢
您使用的是什么版本的NServiceBus? –
@ChrisBednarski我用versione 2.0.1329.2,我知道这是一个很老的版本.. – Riccardo
我建议移动到NSB的新版本 - 类似在这里回答http://stackoverflow.com/a/12478656/136720 –