EasyNetQ自v0.7.1.30附带一个简单的AutoSubscriber。 您可以使用它轻松扫描实现接口IConsume <T>或IConsumeAsync <T>的类的特定程序集,然后让自动订户将这些使用者订阅到您的总线。 IConsume <T>的实现将使用总线Subscribe方法,而IConsumeAsync <T>的实现将使用总线SubscribeAsync方法,请参阅Subscribe以了解详细信息。 你当然可以让你的消费者处理多个消息。 我们来看看一些样品。

注意:从版本0.13.0开始,所有AutoSubscriber类都位于EasyNetQ.AutoSubscribe命名空间中,因此请添加以下using语句: using EasyNetQ.AutoSubscribe;

让我们定义一个简单的消费者,处理三条消息:MessageA, MessageB and MessageC.

public class MyConsumer : IConsume<MessageA>, IConsume<MessageB>, IConsumeAsync<MessageC>
{
public void Consume(MessageA message) {...} public void Consume(MessageB message) {...} public Task Consume(MessageC message) {...}
}

首先创建AutoSubscriber的新实例,将IBus实例和subscriptionId前缀传递给构造函数。 subscriptionId前缀的前缀是所有自动生成的subscriptionIds,但不是自定义subscriptionIds(请参见下文)。

为了注册这个以及同一个Assembly中的所有其他使用者,我们只需要将包含您的使用者的程序集传递给:AutoSubscriber.Subscribe(assembly)。 注意! 这是你应该只做一次,最好在应用程序启动时。

var subscriber = new AutoSubscriber(bus, "my_applications_subscriptionId_prefix");
subscriber.Subscribe(Assembly.GetExecutingAssembly());

1,通过主题订阅(s)

默认情况下,AutoSubscriber将绑定无主题。 在下面的示例中,MessageA注册了两个主题。

注意! 如果你运行没有ForTopic属性的代码,它将有一个“#”的路由键,它将接收任何消息类型的订阅。 假设安装了默认端口和管理插件,只需访问http:// localhost:15672 /#/队列并根据需要解除绑定即可。

public class MyConsumer : IConsume<MessageA>, IConsume<MessageB>, IConsumeAsync<MessageC>
{
[ForTopic("Topic.Foo")]
[ForTopic("Topic.Bar")]
public void Consume(MessageA message) {...} public void Consume(MessageB message) {...} public Task Consume(MessageC message) {...}
} //To publish by topic
var bus = RabbitHutch.CreateBus("host=localhost"); var msg1 = new MessageA(msg1, "Topic.Foo"); //picked up
var msg2 = new MessageA(msg2, "Topic.Bar"); //picked up
var msg3 = new MessageA(msg3); //not picked up

2,指定一个特定的SubscriptionId

默认情况下,AutoSubscriber将为每个消息/消费者组合生成唯一的SubscriptionId。 这意味着您将启动同一个使用者的多个实例,并且它们将以循环方式(工作模式)从相同的队列中读取。

如果您希望修订订阅ID,则可以使用AutoSubscriberConsumerAttribute修饰Consume方法。 为什么你会修正它,你可以在这里阅读。

比方说,上面的消费者应该有一个固定的SubscriptionId用于MessageB的消费者方法。 刚刚装饰它并为SubscriptionId定义一个值。

[AutoSubscriberConsumer(SubscriptionId = "MyExplicitId")]
public void Consume(MessageB message) { }

3,控制SubscriptionId生成

您当然也可以控制实际的SubscriptionId生成。 只需替换AutoSubscriber.GenerateSubscriptionId:Func <ConsumerInfo,string>。

var subscriber = new AutoSubscriber(bus)
{
CreateConsumer = t => objectResolver.Resolve(t),
GenerateSubscriptionId = c => AppDomain.CurrentDomain.FriendlyName + c.ConcreteType.Name
};
subscriber.Subscribe(Assembly.GetExecutingAssembly());

注意! 只是一个示例实现。 确保您已阅读并理解SubscriptionId值的重要性。

4,控制消费者配置设置

使用自动订阅服务器订阅队列时,可以设置ISubscriptionConfiguration值,例如AutoDelete,Priority等。

通过在创建AutoSubscriber时设置操作。

var subscriber = new AutoSubscriber(bus)
{
ConfigureSubscriptionConfiguration = c => c.WithAutoDelete()
.WithPriority()
};
subscriber.Subscribe(Assembly.GetExecutingAssembly());

或者,您可以将一个属性应用于使用方法,该方法优先于ConfigureSubscriptionConfiguration操作设置的任何配置值。

public class MyConsumer : IConsume<MessageA>
{
[SubscriptionConfiguration(CancelOnHaFailover = true, PrefetchCount = )]
public void Consume(MessageA message) {...}
}

5,在AutoSubscriber中使用IoC容器

AutoSubscriber有一个属性MessageDispatcher,它允许您插入自己的消息分派代码。 这使您可以从IoC容器中解析消费者或执行其他自定义调度时间任务。

我们编写一个定制的IAutoSubscriberMessageDispatcher来解析Windsor IoC容器中的消费者

public class WindsorMessageDispatcher : IAutoSubscriberMessageDispatcher
{
private readonly IWindsorContainer container; public WindsorMessageDispatcher(IWindsorContainer container)
{
this.container = container;
} public void Dispatch<TMessage, TConsumer>(TMessage message) where TMessage : class where TConsumer : IConsume<TMessage>
{
var consumer = container.Resolve<TConsumer>();
try
{
consumer.Consume(message);
}
finally
{
container.Release(consumer);
}
} public Task DispatchAsync<TMessage, TConsumer>(TMessage message) where TMessage: class where TConsumer: IConsumeAsync<TMessage>
{
var consumer = _container.Resolve<TConsumer>();
return consumer.Consume(message).ContinueWith(t=>_container.Release(consumer));
}
}

现在我们需要在我们的IoC容器中注册我们的客户:

var container = new WindsorContainer();
container.Register(
Component.For<MyConsumer>().ImplementedBy<MyConsumer>()
);

接下来使用我们的自定义IMessageDispatcher设置AutoSubscriber:

var bus = RabbitHutch.CreateBus("host=localhost");

var autoSubscriber = new AutoSubscriber(bus, "My_subscription_id_prefix")
{
MessageDispatcher = new WindsorMessageDispatcher(container)
};
autoSubscriber.Subscribe(GetType().Assembly);
autoSubscriber.SubscribeAsync(GetType().Assembly);

现在,每次收到消息时,我们的消费者的新实例都将从我们的容器中解析出来。

12,EasyNetQ-自动订阅的更多相关文章

  1. EasyNetQ使用(八)【对延迟消息插件的支持,自动订阅者】

    RabbitMQ延迟消息插件仍然在实验阶段.你使用这个功能要自担风险. RabbitMQ延迟消息插件为RabbitMQ增加了新的交换机类型,允许延时消息投递. EasyNetQ为交换机通过定义一种新的 ...

  2. 16-EasyNetQ之自动订阅者

    EasyNetQ v0.7.1.30版本有了一个简单AutoSubscriber.你能够使用它很容易的去扫描指定程序集中实现了IConsume 或 IConsumeAsync接口的类,然后这个自动订阅 ...

  3. iOS 自动订阅开发

    一.代码逻辑 关于iOS 订阅.自动订阅 本身功能开发很简单.跟正常的购买没什么大的差异.唯一需要特殊处理(自动订阅)的是, 在APP启动时候要增加侦听: [[SKPaymentQueue defau ...

  4. 【EasyNetQ】- 自动订阅者

    从v0.7.1.30开始,EasyNetQ简单易用AutoSubscriber.你可以用它来轻松地扫描实现任何接口的类的特定组件IConsume<T>或IConsumeAsync<T ...

  5. 【EasyNetQ】- 订阅

    EasyNetQ订阅者订阅消息类型(消息类的.NET类型).一旦通过调用Subscribe方法设置了对类型的订阅,就会在RabbitMQ代理上创建一个持久队列,并且该类型的任何消息都将被放置在队列中. ...

  6. ThinkPHP3.1快速入门(12)自动验证

    自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证. 验证规则 数据验证可以进行数据类型.业务规则.安全判断等方面的验证操作.数据验证有两 ...

  7. easynetq发布订阅demo实现注意事项

    最近开始在项目中使用easynetq,大概了解了下api,在网上看了下示例,结果没有一个运行成功的,一个最简单的发布订阅都没有成功.我是直接运行起来别人的示例,不应该啊,后来一直分析一直分析,最后发现 ...

  8. EMQ ---客户端上线自动订阅主题

    通过修改配置文件即可实现. emq v2.3.11,软件架构做了调整,把功能集成在了emq_modules模块,/data/loaded_plugins默认会加载emq_modules. 我们只需要改 ...

  9. EasyNetQ使用(九)【非泛型的发布&订阅扩展方法,发生错误的情况 】

    自从EasyNetQ第一个版本开始,它就可以发布/订阅特定类型的消息. bus.Subscribe<MyMessage>("subscriptionId", x =&g ...

随机推荐

  1. 【转】利用URLConnection来发送POST和GET请求

    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...

  2. BroadcastReceiver的两种注册方式和使用

    1.静态注册,在minifest文件中 <receiver android:name=".BroadcastReceiverDemo" > <intent-fil ...

  3. API 开发平台 dreamfactory,参考SAWAGGER,国外厂家,开源,本地与云部署

    API 开发平台,参考SAWAGGER,国外厂家,本地与云部署:参考  http://swagger.io/commercial-tools/ 1.dreamfactory 梦工厂公司  https: ...

  4. exp自动备份在bat中不执行

    在命令行前加cd c:\users\...... 先定位进入可以exp的目录下,再执行exp

  5. sqlserver数据库系统性能监控步骤

    1.部署好环境JDK+tomcat+数据库 ①修改数据库连接账号密码db.properties ②修改applicationContext.xml文件,开启任务 <bean id="o ...

  6. 转载:2.2.4 配置项的单位《深入理解Nginx》(陶辉)

    原文:https://book.2cto.com/201304/19629.html 大部分模块遵循一些通用的规定,如指定空间大小时不用每次都定义到字节.指定时间时不用精确到毫秒. 当指定空间大小时, ...

  7. 单点登录SSO+鉴权

    一.单点登录原理 1.登录 2.注销 --------------------------------------------------------------------------------- ...

  8. 解决Idea运行testng套件无testoutput文件夹问题

    说明:testNG的工程我是使用eclipse创建的,直接导入到idea中,运行test时不会生产test-output,只能在idea的控制台中查看运行结果,然后到处报告,经过不懈的百度终于找到怎么 ...

  9. sklearn学习笔记

    用Bagging优化模型的过程:1.对于要使用的弱模型(比如线性分类器.岭回归),通过交叉验证的方式找到弱模型本身的最好超参数:2.然后用这个带着最好超参数的弱模型去构建强模型:3.对强模型也是通过交 ...

  10. Python最佳学习路线图

    python语言基础(1)Python3入门,数据类型,字符串(2)判断/循环语句,函数,命名空间,作用域(3)类与对象,继承,多态(4)tkinter界面编程(5)文件与异常,数据处理简介(6)Py ...