我刚刚开始使用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的应用程序.NET应用程序中有这个代码:
Bus.Send<IServiceStarted>(e =>
{
e.ServiceInfo = ReadServiceInfo();
e.EventTime = DateProvider.Now;
});
Run Code Online (Sandbox Code Playgroud)
你会如何对这样的代码进行单元测试?
我在我的Web应用程序和服务之间使用NServiceBus和MSMQ,我需要能够加密消息有效负载,这样如果消息在Web服务器上本地排队(服务主机已关闭),则无法查看敏感数据.
由于Web服务器是面向公众的,因此我不仅需要加密可能被序列化到磁盘的数据,而且我也无法将加密密钥存储在Web服务器上.
我已经考虑使用DPAPI存储密钥,但由于密钥将存储在主机上,我还不知道是否违反了要求.我考虑的另一个选项是,当Web应用程序启动时,它可以从服务请求密钥并在应用程序池的生命周期内将其保存在内存中.
我以前没有必要处理这种级别的加密要求,并希望了解其他人正在做什么,并获得有关上述想法的一些反馈.
背景:
一个订阅者项目运行正常,但另一个订阅者项目失败并出现此错误:
未处理的异常: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无法启动.但是,我不知道如何弄清楚这有什么问题.我看过:
我在这里疯了,已经烧了差不多一天试图让这个工作.任何帮助都将受到大力赞赏.
大多数(如果不是全部)ASP.NET(或MVC)的NSB示例都让Web应用程序使用Bus.Send并可能注册一个简单的回调来发送消息,这本质上就是我在我的应用程序中使用它的方式.
我想知道的是,在同一个ASP.NET应用程序中处理消息是否可能和/或是否有意义.
我问的主要原因是缓存.这个过程可能会是这样的:
现在,在一个真正的Web应用程序中,这个待处理的请求几乎肯定会被缓存,很可能很长一段时间,因为否则应用程序必须在每次用户请求时查询数据库以查找待处理的更改目前的信息.
因此,当请求最终在后端完成时 - 可能需要一分钟或一天 - Web应用程序至少需要使此缓存条目无效并执行另一个数据库查找.
现在我意识到这可以通过SqlDependency对象等来管理,但是我们假设它们不可用 - 也许它不是SQL Server后端,也可能是当前信息查询转到Web服务,无论如何.问题是,网络应用程序如何意识到状态的变化?
如果它是可以在ASP.NET应用程序来处理NServiceBus的消息,什么是处理程序的情况下?换句话说,IoC容器将不得不注入一堆依赖项,但它们的范围是什么?这是否都在HTTP请求的上下文中执行?或者一切都需要为消息处理程序的静态/单例?
对这类问题有更好的/推荐的方法吗?
这是你应该如何为NServiceBus处理程序注入依赖项来测试它:
Test.Handler<YourMessageHandler>()
.WithExternalDependencies(h => h.Dependency = yourObj)
Run Code Online (Sandbox Code Playgroud)
(http://nservicebus.com/UnitTesting.aspx)
但是这意味着我的Dependency对象引用应该公开,我不喜欢.有没有办法让它保持私有readonly并在构造函数中分配它,所以应该只通过处理程序构造函数传递实现?
谢谢
我有一个端点处理传入的消息(来自Bus.Send),做一些工作,然后发布另一个消息.是否可以将其配置为使用Json序列化程序反序列化传入的消息,但在发布时,使用Xml序列化程序序列化传出消息?
我的配置目前如下所示,它使用Json序列化程序对传入和序列化传出消息进行反序列化:
Configure.With()
.DefaultBuilder()
.JsonSerializer()
.MsmqTransport()
.IsTransactional(true)
.PurgeOnStartup(false)
.UnicastBus()
Run Code Online (Sandbox Code Playgroud) 在NServiceBus中处理异常的当前建议是使用内置工具.错误的消息将转到错误消息队列,并将日志写入磁盘.
但是,如果我想将我的错误发送到像AirBrake这样的服务,该服务具有更好的功能来分组类似的异常,指标和其他好东西呢?我可以使用全局异常处理程序吗?
因为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,...
nservicebus ×10
c# ×4
unit-testing ×2
.net ×1
asp.net ×1
asp.net-mvc ×1
encryption ×1
json ×1
mocking ×1
rhino-mocks ×1
security ×1
xml ×1