标签: nservicebus

如何使用代码配置nservicebus msmqtransport

我刚刚开始使用NServiceBus,并且无法弄清楚在代码中配置MsmqTransport时我缺少的东西.如果我像这样配置发布者;

IBus bus = Configure.With()
                        .CastleWindsorBuilder()
                        .XmlSerializer()
                        .MsmqSubscriptionStorage()
                        .MsmqTransport()
                            .IsTransactional(true)
                            .PurgeOnStartup(false)
                        .UnicastBus()
                            .ImpersonateSender(false)
                        .CreateBus()
                        .Start();
bus.Publish(new Message(DateTime.Now));
Run Code Online (Sandbox Code Playgroud)

和app.config一样


<configSections>
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
</configSections>
<MsmqTransportConfig 
    InputQueue="testapps_messagebus" 
    ErrorQueue="testapps_errors" 
    NumberOfWorkerThreads="1" 
    MaxRetries="5" />

然后一切正常 - 它将创建队列,我可以愉快地消息,但是如果我删除队列,然后再尝试使用这样的代码;

var config = Configure.With()
              .CastleWindsorBuilder()
              .XmlSerializer()
              .UnicastBus()
                  .ImpersonateSender(false)
              .MsmqSubscriptionStorage();
config
    .Configurer
    .ConfigureComponent<MsmqTransport>(NServiceBus.ObjectBuilder.ComponentCallModelEnum.None)
        .ConfigureProperty(x => x.InputQueue, "testapps_messagebus")
        .ConfigureProperty(x => x.NumberOfWorkerThreads, 1)
        .ConfigureProperty(x => x.ErrorQueue, "testapps_errors")
        .ConfigureProperty(x => x.MaxRetries, 5);

IBus bus = config
         .CreateBus()
         .Start();

bus.Publish(new Message(DateTime.Now));
Run Code Online (Sandbox Code Playgroud)

消息似乎丢失了,因为它们没有出现在任何队列中也没有得到处理 - 我猜我错过了什么,但我看不到哪里.

nservicebus

6
推荐指数
1
解决办法
4775
查看次数

使用NServiceBus测试Bus.Send应用程序

我在使用NServiceBus的应用程序.NET应用程序中有这个代码:

 Bus.Send<IServiceStarted>(e =>
                             {
                                  e.ServiceInfo = ReadServiceInfo();
                                  e.EventTime = DateProvider.Now;
                             });
Run Code Online (Sandbox Code Playgroud)

你会如何对这样的代码进行单元测试?

c# unit-testing rhino-mocks mocking nservicebus

6
推荐指数
1
解决办法
4325
查看次数

您在哪里将加密密钥放在面向公众的服务器上?

我在我的Web应用程序和服务之间使用NServiceBus和MSMQ,我需要能够加密消息有效负载,这样如果消息在Web服务器上本地排队(服务主机已关闭),则无法查看敏感数据.

由于Web服务器是面向公众的,因此我不仅需要加密可能被序列化到磁盘的数据,而且我也无法将加密密钥存储在Web服务器上.

我已经考虑使用DPAPI存储密钥,但由于密钥将存储在主机上,我还不知道是否违反了要求.我考虑的另一个选项是,当Web应用程序启动时,它可以从服务请求密钥并在应用程序池的生命周期内将其保存在内存中.

我以前没有必要处理这种级别的加密要求,并希望了解其他人正在做什么,并获得有关上述想法的一些反馈.

c# security encryption nservicebus

6
推荐指数
2
解决办法
596
查看次数

可怕的"扫描组件中找不到端点配置"NServiceBus错误

背景:

  • 我的解决方案中有两个NServiceBus端点项目.
  • 两者都是NServiceBus订阅者,并包含一个消息的消息处理程序.
  • 每个订阅者项目处理来自两个不同发布者之一的消息.因此,一个项目引用来自一个发布者的消息DLL,另一个项目引用来自另一个发布者的消息DLL.
  • 两个发布者都在我的解决方案外部.
  • 除了消息DLL之外,两个订阅者项目都引用了NServiceBus的相同二进制文件,并且还具有完全相同的设置(UnicastBusConfig,EndpointConfig,appSettings等)

一个订阅者项目运行正常,但另一个订阅者项目失败并出现此错误:

未处理的异常:System.InvalidOperationException:在扫描的程序集中找不到端点配置.当NServiceBus无法加载包含IConfigureThisEndpoint的程序集时,通常会发生这种情况.尝试使用appsetting键在NServiceBus.Host.exe.config中显式指定类型:EndpointConfigurationTypeScanned path: 在NServiceBus.Hrost.Program.GetEndpointConfigurationType()处的NServiceBus.Host.Program.ValidateEndpoints(IEnumerable`1 endpointConfigurationTypes)处的路径NServiceBus.Host.Program.Main(String [] args)

我怀疑问题必然在于订户的NServiceBus发布者消息DLL无法启动.但是,我不知道如何弄清楚这有什么问题.我看过:

  • 两个NServiceBus发布者消息DLL使用ildasm显示它们是相同的(关于处理器标志和引用的NServiceBus DLL版本).
  • NSB消息项目,都是使用.Net 3.5 Framework构建的.

我在这里疯了,已经烧了差不多一天试图让这个工作.任何帮助都将受到大力赞赏.

nservicebus

6
推荐指数
1
解决办法
5111
查看次数

ASP.NET应用程序可以处理NServiceBus事件吗?

大多数(如果不是全部)ASP.NET(或MVC)的NSB示例都让Web应用程序使用Bus.Send并可能注册一个简单的回调来发送消息,这本质上就是我在我的应用程序中使用它的方式.

我想知道的是,在同一个ASP.NET应用程序中处理消息是否可能和/或是否有意义.

我问的主要原因是缓存.这个过程可能会是这样的:

  1. 用户从Web应用程序发起请求.
  2. Web应用程序向独立应用程序服务器发送消息,并将更改记录在本地数据库中.
  3. 在来自同一用户的未来页面请求中,Web应用程序知道更改并将其列为"挂起"状态.
  4. 一堆东​​西发生在后端,最终请求被批准或拒绝.发布引用原始请求的事件.
  5. 此时,Web应用程序应该开始显示最新信息.

现在,在一个真正的Web应用程序中,这个待处理的请求几乎肯定会被缓存,很可能很长一段时间,因为否则应用程序必须在每次用户请求查询数据库以查找待处理的更改目前的信息.

因此,当请求最终在后端完成时 - 可能需要一分钟或一天 - Web应用程序至少需要使此缓存条目无效并执行另一个数据库查找.

现在我意识到这可以通过SqlDependency对象等来管理,但是我们假设它们不可用 - 也许它不是SQL Server后端,也可能是当前信息查询转到Web服务,无论如何.问题是,网络应用程序如何意识到状态的变化?

如果它可以在ASP.NET应用程序来处理NServiceBus的消息,什么是处理程序的情况下?换句话说,IoC容器将不得不注入一堆依赖项,但它们的范围是什么?这是否都在HTTP请求的上下文中执行?或者一切都需要为消息处理程序的静态/单例?

对这类问题有更好的/推荐的方法吗?

asp.net asp.net-mvc nservicebus publish-subscribe

6
推荐指数
1
解决办法
1316
查看次数

NServiceBus处理程序单元测试的依赖注入

这是你应该如何为NServiceBus处理程序注入依赖项来测试它:

Test.Handler<YourMessageHandler>()
  .WithExternalDependencies(h => h.Dependency = yourObj)
Run Code Online (Sandbox Code Playgroud)

(http://nservicebus.com/UnitTesting.aspx)

但是这意味着我的Dependency对象引用应该公开,我不喜欢.有没有办法让它保持私有readonly并在构造函数中分配它,所以应该只通过处理程序构造函数传递实现?

谢谢

c# unit-testing dependency-injection nservicebus

6
推荐指数
1
解决办法
2383
查看次数

如何使用NServiceBus安排每天运行的任务

是否有使用NServiceBus安排任务的优雅方式.我在搜索网络找到了一种方法.NServiceBus是否提供用于调度的内部API.

nservicebus job-scheduling

5
推荐指数
1
解决办法
3395
查看次数

NServiceBus端点是否可以使用不同的序列化程序处理和发布?

我有一个端点处理传入的消息(来自Bus.Send),做一些工作,然后发布另一个消息.是否可以将其配置为使用Json序列化程序反序列化传入的消息,但在发布时,使用Xml序列化程序序列化传出消息?

我的配置目前如下所示,它使用Json序列化程序对传入和序列化传出消息进行反序列化:

        Configure.With()
            .DefaultBuilder()
            .JsonSerializer()
            .MsmqTransport()
            .IsTransactional(true)
            .PurgeOnStartup(false)
            .UnicastBus() 
Run Code Online (Sandbox Code Playgroud)

xml serialization json nservicebus

5
推荐指数
1
解决办法
441
查看次数

NServiceBus是否有全局异常处理程序?

在NServiceBus中处理异常当前建议是使用内置工具.错误的消息将转到错误消息队列,并将日志写入磁盘.

但是,如果我想将我的错误发送到像AirBrake这样的服务,该服务具有更好的功能来分组类似的异常,指标和其他好东西呢?我可以使用全局异常处理程序吗?

nservicebus

5
推荐指数
1
解决办法
1106
查看次数

NServiceBus命令处理程序中的生产者/消费者

因为NServiceBus似乎不支持在消息队列中添加优先级机制,所以我想自己实现这一点。

  • 命令处理程序(生产者):
public void Handle(DoAnAction message)
{
  _messageManager.Insert(message);
}
Run Code Online (Sandbox Code Playgroud)
  • 单个使用者(不同线程):
public void Run()
{
  DoAnAction message;
  while (true) 
  {
    if (_messageManager.TryDequeue(out message)) 
    {
      doALongCall(message);
    }
    else 
    {
      Thread.sleep(200);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

首先这是一个好主意吗?我不喜欢这样丢失消息的想法。

更新:用例:我们有许多客户可以发送消息DoAnAction。该操作的处理需要一段时间。问题是当1个客户端决定发送200个DoAnAction时,所有其他客户端都必须等待2-3个小时,以便可以处理所有这些消息(FIFO)。相反,我想根据客户端的顺序处理这些消息。

因此,即使客户端A仍有200条消息要处理,当客户端B发送消息时,下一个也会排队。如果客户端B发送3条消息,则队列将如下所示:BA,BA,BA,A,A,A,...

.net c# nservicebus producer-consumer

5
推荐指数
1
解决办法
141
查看次数