我有一个无法启动的WinService,因为NServiceBus抛出"服务无法启动.System.Messaging.MessageQueueException(0x80004005):拒绝访问消息队列系统."
这是在Windows 7上
我试图将服务运行为:LocalSystem,Localservice和NetworkService
这是我如何设置NServiceBus
private static IBus _serviceBus;
private static AuditMessageHandler _messageHandler;
public AuditQueueProcessor()
{
_messageHandler = new AuditMessageHandler();
_serviceBus = Configure.With()
.Log4Net()
.DefaultBuilder()
.XmlSerializer()
.MsmqTransport()
.IsTransactional(true)
.PurgeOnStartup(false)
.UnicastBus()
.ImpersonateSender(false)
.LoadMessageHandlers()
.CreateBus()
.Start();
}
Run Code Online (Sandbox Code Playgroud)
这是我的配置
<configuration>
<configSections>
<section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core"/>
<section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core"/>
</configSections>
<MsmqTransportConfig InputQueue="LoggerInputQueue" ErrorQueue="LoggerInputError" NumberOfWorkerThreads="1" MaxRetries="5"/>
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="Truckstop2.Imports.Objects.AuditMessage,Truckstop2.Imports.Objects" Endpoint="InputQueue@newimp001" />
</MessageEndpointMappings>
</UnicastBusConfig>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
</configuration>
Run Code Online (Sandbox Code Playgroud) 我希望更好地理解为什么建议不要使用NServiceBus从网站发布消息(NServiceBus文档,滚动大约三分之二的时间).
它是否对Publish()事件和Send()命令具有语义意义?如果是这样,我认为Web应用程序可以同时发布()和发送():-)
此外,由于使用发布()不需要的Web应用程序,以了解邮件的收件人(发送()要求的Web应用程序配置了所有收件人端点),感觉就像发布()是一个更好的选择许多场景,以便您可以"任意"订阅应用程序到消息队列.
有没有人对此有这种或那种强烈的感受?我很想听听你的想法和意见.
我对使用域事件构建读取模型的系统中的流程感到有些困惑.特别是,我们如何处理用户期望数据(及其视图)在完成命令时发生更改的事实,但由于我们的系统架构(对发布事件的非阻塞调用),实际数据库可能不会在页面重新加载?
我希望使用事件和服务总线将我们的一个系统的设计与CQRS更加一致.
让我们说我的流程是这样的:
用户单击"查看"中的按钮可执行从其帐户中删除付款方式的任务.
控制器调用PaymentMethodRemovalService,并将其传递给accountId和paymentMethodId.
Controller使用AccountRepository检索Account并调用account.RemovePaymentMethod(id)
帐户验证可以进行操作并发布事件PaymentMethodRemovedMessage(accountId,paymentMethodId)
因为事件发布是异步的,所以我们现在必须从服务返回并从控制器返回视图 - 但是我们的实际数据还没有更新!
处理程序IHandle <PaymentMethodRemovedMessage>,检测事件并从数据库中删除实际行
那么,一个人要做什么?
我可以简单地说,删除显示付款方式的div.这可能适用于AJAX场景,但如果我使用Post-Redirect-Get来支持非JavaScript客户端会怎样.然后我将触发我的Get并从查询端读取数据,可能在更新之前.
我是否只是显示一条通知,说明他们已提交删除付款方式的请求?(这似乎不友好,提交订单是有意义的,但不是,例如,更改地址).
有没有办法将实现更改协调为解耦异步事件并显示反映其当前更改的用户数据?
编辑:我的问题非常类似于CQRS,DDD同步报告数据库 我不得不说,那里给出的答案也提到了这里,有一点气味 - 争论用户界面显示一个带外的更新读取DB,可以这么说.我希望有点清洁.
domain-driven-design nservicebus cqrs event-sourcing domain-events
作为练习,我试图找到一个实现竞争消费者的例子.
许多生产者 - > MSMQueue < - 竞争消费者
到目前为止,我没有找到任何关于如何实现这一目标的文档.我首次尝试弄清楚如何在MassTransit或NServiceBus中实现如何实现多层间接.
任何帮助将不胜感激.
在工作流程方面,MS WF和NServiceBus之间是否有任何重叠?如果另一个已经在使用中,是否需要使用一个?他们一起玩得怎么样?
有没有人设法让NServiceBus网关组件工作?v3.0中的样本不像其他样本那样开箱即用.
分步指南或代码示例将有助于使此组件正常工作.
谢谢
当事情出错时,我们会看到一些奇怪的问题 - 在某些情况下,异常消息和堆栈跟踪不匹配.
我们有许多具有类似结构的消息处理程序,如下所示:
public void Handle(AddTelephoneNumber message)
{
var directory = ClientService.Directory(Context).Result;
var client = ClientService.ClientLookup(message.ClientNumber, Context).Result;
if (!client.Item1)
{
//Client does not exist
throw new Exception("Unable to locate client"); //A
}
//B Start
var clientPersonsLnk = client.Item2.Links.Single(l => l.Rel == "client-persons");
var persons = ClientService.Get<Persons>(clientPersonsLnk.Uri, Context).Result;
var person = ClientService.Get<Person>(persons.PartyUri(message.Party), Context).Result;
var phones = ClientService.Get<TelephoneNumbers>(person.Links.Single(l => l.Rel == "person-telephones").Uri, Context).Result;
var addPhoneLink = phones.Links.Single(l => l.Rel == "telephone-add");
var newPhone = new TelephoneNumber();
//Set up the new telephone …Run Code Online (Sandbox Code Playgroud) 根据我的理解,NServiceBus在事务中执行IMessageHandler的Handle方法,如果异常传播出该方法,则NServiceBus将确保消息被放回消息队列(在错误队列之前上升X次)等.所以我们有一个原子操作可以这么说.
现在,如果我在NServiceBus Message Handle方法中,我会做这样的事情
using(var trans = session.BeginTransaction())
{
person.Age = 10;
session.Update<Person>(person);
trans.Commit()
}
using(var trans2 = session.BeginTransaction())
{
person.Age = 20;
session.Update<Person>(person);
// throw new ApplicationException("Oh no");
trans2.Commit()
}
Run Code Online (Sandbox Code Playgroud)
这对交易范围有什么影响?就其与Nservicebus交易的关系而言,trans1现在被视为嵌套交易,即使我们没有做任何事情来嫁给他们吗?(如果不是如何链接到NServiceBus的交易?
查看第二个块(trans2),如果我取消注释throw语句,那么NServiceBus事务是否也会回滚trans1?在基本场景中,假设我将上述内容转储到控制台应用程序中,则trans1是独立的,提交,刷新且不会回滚.我想澄清现在我们坐在像NServiceBus这样的其他交易中会发生什么?
以上只是示例代码,我不会直接使用session,更像是通过uow模式.
Udi 在这里提到"人们已经换掉了NServiceBus的MSMQ层并插入了RabbitMQ".
我希望能够在最终目标上做同样的事情,即能够使用AMQP在Mono/Linux上运行使用NServiceBus构建的应用程序.
在潜入之前,虽然我想从可能已经做过这方面的人那里得到一些反馈,以避免陷阱,红鲱鱼等.
或者,如果方法是一项艰巨的任务,最好直接使用RabbitMQ,但如果可能的话,我想坚持使用NServiceBus.
NServiceBus是ESB还是轻量级ESB?或者它更像是具有持久/可靠消息传递的WCF?它看起来更像是一个消息框架而不是ESB.
只是想要一些指针,因为我刚刚开始研究不同的ESB产品以及它们能够做什么或不做什么.
nservicebus ×10
messaging ×2
msmq ×2
.net ×1
amqp ×1
c# ×1
c#-4.0 ×1
cqrs ×1
esb ×1
gateway ×1
masstransit ×1
msdtc ×1
nhibernate ×1
rabbitmq ×1
transactions ×1