NServiceBus中Bus.Publish和Bus.Send的区别是什么?

38

使用Bus.Publish发布消息和使用Bus.Send发送消息之间的基本区别是什么? 我想了解它们的不同之处,以及何时应该选择使用其中之一。

3个回答

35

发布机制用于通知多个订阅者某个特定事件。发布端点将拥有订阅存储,以确定要发送消息的位置。发送通常用于向端点发出命令。一个命令是告诉端点做某事,并且不应该期望回复(尽管有时您确实需要回复,而NSB也支持此功能)。

您看不到Send()的目标地址是因为您可以通过配置指定目标地址。在您的app.config中,您将把消息类型(整个程序集或类)映射到目标地址。这样做时,您不必提供目标地址。


谢谢Adam - 现在我明白了配置所扮演的角色。 - Sean Kearon
错误,上面的评论应该是:谢谢Adam - 现在我看到配置所起的作用,这很有道理。 - Sean Kearon
Bus.Send 的一个重载是 Bus.Send(string destination, message),因此您可以使用 Bus.Send 发送到特定队列。 - RandomUs1r

24

Bus.Publish:用于当您不知道消息将发送到哪里时(0至多个订阅者)。
Bus.Send:用于向特定处理程序(客户端到服务器)发送消息。


好的,但是为什么有些Send()重载没有目标呢?感到困惑... - Sean Kearon
8
我们将语义的意思进一步解释。"Publish"是一个事件,我们把事件看作是"嘿,刚刚发生了某件事情,我不在乎你对这个信息做什么,但是给你了";而我们把"Bus.Send"看作是命令,其意思是"嘿,我需要你做些什么,并且我关心结果(因此知道我要发送给谁)"。 - Matt
2
@SeanKearon,虽然你是4年前发布的,但对于其他人来说,发送命令的目标可以在配置中定义。您不想在代码配置信息中,因此,如果在配置中定义了目标,则可以使用不带目标参数的更简单的Send()形式。 - XenoPuTtSs

1
通常情况下,Context.Publish() 用于发布事件类型,而 Context.Send() 则用于命令类型。

1
欢迎来到SO。你的回答好像有些东西缺失了? - Uwe Allner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接