NServiceBus过滤订阅者的消息

时间:2011-07-06 06:51:19

标签: c# .net nservicebus

我刚刚开始使用NService总线,我想知道如何在发送消息时过滤消息,以便它们只发送给特定用户。

例如,假设我有一个包含已分类产品的数据库。我的发布者将每隔N秒检查一次数据库,并在将新产品添加到数据库时发送消息。

但是每个订阅者只对某个特定类别感兴趣并假设I can get the subscriber to send the category they are interested in,那么我只想将有关特定类别产品的消息发布给对其感兴趣的订阅者。

类别是动态的,因此我无法为不同的类别创建不同的消息。因此,我假设所有订阅者都必须订阅相同的已发布IMessage

编辑:为了消除一些困惑,这是另一个更接近真实事物的例子。

我的发布商的工作是根据标签通知订阅者有关stackoverflow的新帖子。但是我不希望发布者查询无任何人感兴趣的标签的stackoverflow ...更不用说做类似的事情的开销了。

因此,当订阅者订阅时,他们会注册他们的兴趣以及一些元数据,告诉发布者他们感兴趣的帖子 - 例如帖子标记为NServiceBus

现在,发布商知道他们必须监控标记为NServiceBus的新帖子的stackoverflow,并且可以开始这样做。

因此,当有一个标有NServiceBus的新帖子并且我的发布者去通知它的订阅者时,我希望它只通知对该标记感兴趣的订阅者...而不是那些感兴趣的订阅者不同的标签。

更有意义吗?

我刚刚开始这个项目,所以如果我走错了路,我会很感激提出并建议使用不同的工具。

2 个答案:

答案 0 :(得分:1)

假设您使分类订阅有效,那么广播类别和相关产品就足够了,让每个端点都忽略它不关心的产品。否则,您必须为每个产品创建一条消息并包含该类别,以便端点可以忽略已配置的类别。

答案 1 :(得分:0)

NServiceBus附带的“PubSub”示例演示了这种情况。

消息包括以下内容:

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>

Subscriber 2处理通用IEvent(将导致处理所有消息,EventMessage和IEvent

namespace Subscriber2
{
    public class EventMessageHandler : IHandleMessages<IEvent>

这可以帮助您找到不同订阅者处理不同产品类别的正确方向。