在端点被“触摸”之前,NServiceBus不会开始接收消息

时间:2016-11-21 18:52:59

标签: asp.net .net asp.net-web-api asp.net-web-api2 nservicebus

因此,当我在本地运行我的两个服务时,我可以点击服务A,它向服务B发送一个命令,然后选择并处理它。挺直的。但是,当我将这些发布到我的Web服务器并向服务A发送请求时,它将服务发送给服务B(我可以在服务B的队列中看到该消息),但它不会被接收和处理。我在服务B上创建了一个端点,它只返回一个OK响应 - 如果我调用此端点,有效地“触摸”该服务,一切就会启动,消息就会从那一点开始处理。

我认为这可能与后期编译有关,所以我在发布时将发布更改为预编译,但我得到了相同的结果。

有没有办法让服务一发布就开始处理?另外值得注意的是,这两项服务都是WebAPI 2

2 个答案:

答案 0 :(得分:2)

另一个选项(可能更“标准”)是将“处理程序”移动到Windows服务而不是Web应用程序。

对于此Windows服务,您可以利用NServiceBus主机,它将为您提供标准类库到Windows服务。他们在此处提供了大量有关此内容的文档:https://docs.particular.net/nservicebus/hosting/nservicebus-host/?version=Host_6

我认为这更稳定,因为您可以分离发送命令(Web应用程序/ WebApi)和处理命令/发布事件(NSB主机)的处理。主机可以自己坐在Web服务器上,也可以将它们放在不同的服务器上。

我们的默认架构是在您以不同方式扩展Web应用程序和NSB主机时,让单独的服务器运行我们的NSB主机。如果在Web服务器上运行NSB主机,则可能会出现Web应用程序获取过多流量并使NSB主机处理失败的问题。您可以随时使用1台服务器开始简单,监控服务器,然后随着流量的增加移动。

答案 1 :(得分:1)

不确定这是否是做事的“正确方法”,但我最终做的是设置每个网站始终运行并自动初始化。

  • 应用程序池设置为“始终运行”
  • 网站设置preload enabled = true
  • Web.config具有用于应用程序初始化的doAppInitAfterRestart="true"
  • 的webServer条目
  • Web角色已添加到服务器“应用程序初始化”

通过设置这些内容,部署过程基本上是发布站点和iisreset。如果有更好的选择,我仍然在寻找:)