2013-02-27 41 views
1

在NServiceBus中,您可以创建一个SendOnly总线,这意味着它只会将消息发送到另一个服务。在我看来,这应该不需要本地队列的发送服务,但我一直无法配置此。SendOnly模式,没有本地队列

var bus = Configure.With() 
    .DefiningCommandsAs(t => typeof(MyNamespace.Messaging.Markers.ICommand).IsAssignableFrom(t)) 
    .DefaultBuilder() 
    .XmlSerializer() 
    .MsmqTransport() 
    .UnicastBus() 
    .SendOnly(); 

给出了以下异常:

无法生成任何端点名称,请注明使用Configure.DefineEndpointName(...)

自己 约定虽然我能解决这个问题通过增加一个.DefineEndpointName它似乎可怜的形式为这个服务创建一个队列,因为它永远不会被实际使用。

是否有避免需要为仅发送总线创建本地队列的方法,如果不是,为什么在此模式下需要此本地队列?

+0

我很确定有一个DoNotCreateQueues()或类似的可用,如果你添加它会发生什么? – 2013-02-27 20:45:20

+0

@AdamFyles我不知道那是在那里,它看起来非常有前途,但不幸的是,我将它添加到配置后仍然出现相同的错误。 – 2013-02-27 20:49:10

+1

这应该工作没有'.DefineEndpointName(...)'(测试对v3.3.5),请参阅[sendonly示例](https://github.com/NServiceBus/NServiceBus/blob/master/Samples/SendOnlyEndpoint/SendOnlyEndpoint。自定义/ Program.cs中)。你正在运行什么版本的NServiceBus? – 2013-02-28 02:06:30

回答

2

无论是否仅发送,所有端点都需要一个名称。这与创建队列无关(是队列名称==端点名称)。添加一个定义端点名称,你会看到没有队列将被创建。另请注意,发送的邮件不会包含地址回复,因为这样做没有意义。

+0

有趣的是,它不创建队列,为什么它不需要.DefineEndpointName如果我不使用.DefiningCommandsAs?我还注意到,在发送不带.DefineEndpointName时,它会引用不存在的发件人队列。 – 2013-03-03 08:44:33

+1

我的猜测是,通过跳过约定找不到消息,并且不会触发端点名称的此问题。我需要检查以确保代码 – 2013-03-03 17:47:59

1

我相信这是提供消息来源的地方。发送队列是MSMQ的固有部分。它允许确认消息,支持NServiceBus总线。回复功能。

在这种情况下似乎没有必要,但是如果我们认为SendOnly正试图引导开发人员使用特定的消息传递风格。考虑到支持多种消息类型的MSMQ,我认为这不是一个问题。

+0

这是有道理的,它仍然看起来有点丑陋,但我得到原因:) – 2013-02-27 21:01:35