我想在 OneWayClientMode 中使用#rebus,同时在代码中配置端点地址,而不是通过 app.config。
这可能吗?我在流畅的配置中找不到它的踪迹。
基本上,您有两个选择:1)在发送消息时明确路由消息,2)使用“IDetermineMessageOwnership”实现您自己的路由逻辑
第一个选项非常简单,而且非常明确 - 您可以bus.Advanced.Routing.Send(destination, message)
在发送消息时直接前往。您当然应该注意不要对目的地进行太多次硬编码,这可能会导致以后出现问题:)
第二个选项也很简单,但它稍微隐式一些——你可以实现IDetermineMessageOwnership
接口,它基本上是一种将消息类型映射到端点的方法,然后让 Rebus 像这样使用它:
Configure.With(...)
.(...)
.MessageOwnership(m => m.Use(myImplementation))
.(...)
除非我只打算做一两个bus.Send
,否则我会选择后一个选项 :) 快乐路由!
我想给出一个更明确的选项 2 示例,因为我必须搜索示例以找出如何输入“myImplementation”,这真的很简单。假设您希望由 sWorkerId 标识的队列接收所有消息,这就是您要做的:
Configure.With(...
.MessageOwnership(o => o.Use(new RebusConfig(sWorkerId)))
.CreateBus()
.Start(RebusConfig.NumberOfWorkers)
RebusConfig 将 IDetermineMessageOwnership 实现为:
public class RebusConfig : IDetermineMessageOwnership
{
private string m_sWorkerRoleEndpoint;
public RebusConfig(string sWorkerRoleEndpointId)
{
m_sWorkerRoleEndpoint = sWorkerRoleEndpointId;
}
public string GetEndpointFor(Type messageType)
{
return m_sWorkerRoleEndpoint;
}
}
希望这可以帮助 ...