我刚刚开始使用NService总线,我想知道如何在发送消息时过滤消息,以便它们只发送给特定用户。
例如,假设我有一个包含已分类产品的数据库。我的发布者将每隔N秒检查一次数据库,并在将新产品添加到数据库时发送消息。
但是每个订阅者只对某个特定类别感兴趣并假设I can get the subscriber to send the category they are interested in,那么我只想将有关特定类别产品的消息发布给对其感兴趣的订阅者。
类别是动态的,因此我无法为不同的类别创建不同的消息。因此,我假设所有订阅者都必须订阅相同的已发布IMessage
。
编辑:为了消除一些困惑,这是另一个更接近真实事物的例子。
我的发布商的工作是根据标签通知订阅者有关stackoverflow的新帖子。但是我不希望发布者查询无任何人感兴趣的标签的stackoverflow ...更不用说做类似的事情的开销了。
因此,当订阅者订阅时,他们会注册他们的兴趣以及一些元数据,告诉发布者他们感兴趣的帖子 - 例如帖子标记为NServiceBus
。
现在,发布商知道他们必须监控标记为NServiceBus
的新帖子的stackoverflow,并且可以开始这样做。
因此,当有一个标有NServiceBus
的新帖子并且我的发布者去通知它的订阅者时,我希望它只通知对该标记感兴趣的订阅者...而不是那些感兴趣的订阅者不同的标签。
更有意义吗?
我刚刚开始这个项目,所以如果我走错了路,我会很感激提出并建议使用不同的工具。
答案 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>
这可以帮助您找到不同订阅者处理不同产品类别的正确方向。