我刚刚开始使用NService总线,当我发送消息时,我想知道如何过滤消息,以便它们只发送给特定的订阅者。
例如,假设我有一个包含分类产品的数据库。我的发布者将每N秒检查一次数据库,并在将新产品添加到数据库时发送消息。
但是每个订阅者只对一个特定的类别感兴趣,并且假设是I can get the subscriber to send the category they are interested in,那么我只想向对它们感兴趣的订阅者发布关于特定类别中产品的消息。
类别是动态的,所以我不能为不同的类别创建不同的消息。因此,我假设所有订阅者都必须订阅同一个已发布的IMessage。
编辑:为了消除一些混乱,这里有另一个更接近真实情况的例子。
我的发行者的工作是根据标签通知订阅者关于堆栈溢出的新帖子。但我不想让出版商在堆栈溢出中查询没有人感兴趣的标签.更别提做这种事的开销了。
因此,当订阅者订阅时,他们会注册他们的兴趣,并附上一些元数据,告诉发布者他们感兴趣的帖子--例如标记为NServiceBus的帖子。
现在,发布者知道,他们必须监视新的帖子标记为NServiceBus的堆栈溢出,并且可以开始这样做。
因此,当有一个以NServiceBus为标记的新帖子,而我的发行者去通知它的订阅者时,我希望它只通知对这个标签感兴趣的订阅者.而不是对不同标签感兴趣的订阅者。
更有意义吗?
我刚刚开始这个项目,所以如果我走错了路,我会很感激的提醒和建议,使用一套不同的工具。
发布于 2011-07-06 12:38:39
假设您使分类订阅正常工作,那么广播类别和相关产品就足够了,并且让每个端点忽略它不关心的产品就足够了。否则,您必须为每个产品创建一条消息,并包含这个类别,这样端点就可以忽略已配置的类别。
发布于 2011-07-06 13:11:28
与PubSub一起提供的“NServiceBus”示例演示了此场景。
这些信息包括以下内容:
using NServiceBus;
using System;
namespace MyMessages
{
[Serializable]
public class EventMessage : IEvent
{
public Guid EventId { get; set; }
public DateTime? Time { get; set; }
public TimeSpan Duration { get; set; }
}
public interface IEvent : IMessage
{
Guid EventId { get; set; }
DateTime? Time { get; set; }
TimeSpan Duration { get; set; }
}
}然后,发布者(在本例中)交替制作EventMessage或IEvent,并发布它。
var eventMessage = publishIEvent ? Bus.CreateInstance<IEvent>() : new EventMessage();
eventMessage.EventId = Guid.NewGuid();
eventMessage.Time = DateTime.Now.Second > 30 ? (DateTime?)DateTime.Now : null;
eventMessage.Duration = TimeSpan.FromSeconds(99999D);
Bus.Publish(eventMessage);订阅服务器1处理类型为:
namespace Subscriber1
{
public class EventMessageHandler : IHandleMessages<EventMessage>订阅服务器2处理泛型IEvent (这将导致处理所有消息、EventMessage和IEvent)
namespace Subscriber2
{
public class EventMessageHandler : IHandleMessages<IEvent>这将帮助您正确地处理不同订户的不同产品类别。
https://stackoverflow.com/questions/6592556
复制相似问题