如果你连接过关系数据库,例如SQL Server。你会发现EasyNetQ处理connections有点奇怪。和关系数据库通讯一直都是通过client开始的。Client 打开一个连接, 发出一个SQL命令,如有必要时,处理结果,然后关闭连接。一般建议是你维持一个打开的连接,时间要尽可能短,通过API断开连接池。

诸如与RabbitMQ这样的消息代理会话,是有些不同的,因为连接倾向于在应用的整个生命周期内保持连接状态。通常你打开一个连接,创建一个订阅,然后打开连接后,等待消息到来。EasyNetQ不能保证代理在所有的时间都是可用的。相反它使用了延迟连接的方法,在后台线程轮询终结点,直到连接成功。假如服务器出于任何原因连接断开了(可能是网络故障,或许是RabbitMQ Server自身的原因断开了),EasyNetQ将恢复轮询终结点直到重新连接成功。

标准的做法是在你应用的生命周期内只创建一个IBus实例.当你的应用关闭后Dispose掉它。
延迟连接到RabbitMQ服务器是通过IBus接口表示的。大部分EasyNetQ操作都是IBus上的方法。创建一个IBus实例如下:

var bus = RabbitHutch.CreateBus("host=myServer;virtualHost=myVirtualHost;username=mike;password=topsecret")
  • 1

这个连接字符串是由键值对组成,格式如下 key=value, 通过分号;分隔。只有一个必选的字段是host.可能的连接字符串值是:

host(例如 host=localhost 或 host=192.168.2.56 或 host=myhost.mydomain.com)这个字段是必选的。如要具体指定你要连接服务器端口,你用标准格式 host:port(例如:host=myhost.com:5673)。假如你省略了端口号,AMQP默认端口是5672.连接到RabbitMQ集群,需要指定每一个集群节点用逗号分隔(例如:host:myhost1.com,myhost2.com,myhost3.com).更多详情请参考Cluster Support

virtualhost(例如:virtualHost=myVirturalHost)默认虚拟主机是’/’

username(例如:username=mike)默认是’guest’(对于非’localhost’主机你需要使用其他用户名)

password (例如:password=mysecret)默认为’guest’

requestedHearbeat(例如:requestHearbeat=10)默认为10秒钟。没有心跳设置为0

prefetchcount(例如:prefetchcount=1) 默认为50.这个值是在EasyNetQ发送ack之前发送给RabbitMQ的消息数。不限制设置为0(不推荐). 为了在消费者之间保持公平和平衡设置为1.

publisherConfirms(例如:publisherconfirms=true)默认是false。 如何开启Publisher Confirms?

persistentMessages(例如:persistentMessages=false)默认为true。这个决定了在发送消息时采用什么样的delivery_mode。 false=1,true=2. 设置为trueRabbitMQ将会把消息持久化到磁盘,并且在服务器重启后仍会存在。设置为false可以提高性能收益。

product(例如:product=我的现实中重要的服务)在EasyNetQ 0.27.3中被引进。默认值是Bus的实例名。
此处输入的值将显示在RabbitMQ的后台管理界面中。

platform(例如:platform=my.fully.qualified.domain.name)在EasyNetQ 0.27.3中被引进。默认值是运行着客户端处理Bus的实例的机器的主机名。此处输入的值将会线上在RabbitMQ管理端界面中。

timeout(例如:timeout=60)模式值为10秒。在EasyNet 0.17中被引进。可解析类型为System.UInt16从0到65535范围内的值。不限制超时时间设置为0.当超时事时抛出System.TimeoutException.

关闭连接,只要简单的dispose,如下:

bus.Dispose();

这样就关闭了EasyNetQ使用过的连接、管道、消费者和所有其他资源。


EasyNetQ可以通过SSL进行连接。这篇指南的作者Gordon Coulter最初为回应一个提问写的。

首先,你必须仔细依据https://www.rabbitmq.com/ssl.html文章中的步骤。我花费了很多时间尝试让openssl这部分能运作起来,然后为了让他按我的需要去运作而不仅仅只是一个demo,我又花费了很多时间。

第一次通过SSLEasyNetQ运作时,在他们为了测试而做的可以运行的页面上的那点DotNet代码给我提供了很大帮助。我有一个简单的控制台程序,包涵了RabbitEasyNetQ代码,会在下面展示。此外使用了Rabbit logs

当你连接上后,管理界面的connection页面会显示一个小的SSL协议标签。你也在Overview 选项卡的端口监听表里看到443端口。

代码如下:

var connection = new ConnectionConfiguration();

connection.Port = 443;
connection.UserName = "user";
connection.Password = "pass";
connection.Product = "SSLTest"; var host1 = new HostConfiguration();
host1.Host = "rmq1.contoso.com";
host1.Port = 443;
host1.Ssl.Enabled = true;
host1.Ssl.ServerName = "rmq1.contoso.com";
host1.Ssl.CertPath = "c:\\tmp\\myclient.p12";
host1.Ssl.CertPassphrase = "secret"; var host2 = new HostConfiguration();
host2.Host = "rmq2.contoso.com";
host2.Port = 443;
host2.Ssl.Enabled = true;
host2.Ssl.ServerName = "rmq2.contoso.com";
host2.Ssl.CertPath = "c:\\tmp\\myclient.p12";
host2.Ssl.CertPassphrase = "secret"; connection.Hosts = new List<HostConfiguration> { host1, host2 }; connection.Validate(); //VERY IMPORTANT - DOES CONFIG AS WELL AS VALIDATION! var Bus = RabbitHutch.CreateBus(connection, services => services.Register<IEasyNetQLogger>(logger => new DoNothingLogger()));

尽管在ConnectionConfiguration上有一个Ssl选项属性,但在HostConfiguration对象上设置Ssl选项属性是一个合适的地方。HostConfiguration对象上设置SSL选项可以支持集群的场景。注意,在上面代码中我们指定了两个HostConfiguration对象。假如一个挂了,EasyNetQ的持续连接功能将自动连接到下一个可用的主机。在这个主机上配置SSL在连接时就不会出现任何错误。

假如你仅仅指定一个主机,你可以选择通过HostConfiguration对象去设置SSL选项,也可以直接用ConnectionConfiguration对象去设置。

不要忘记调用Validate()方法。我最初跳过那儿(基本上我写的都是硬编码,因此可能没有什么错误需要验证)。但是,这个方法调用实际上回去应用一系列设置,为了确保连接运行是必要的。

SslOption详情参见文档SslOption Class

你可以尝试用官方的RabbitMQ .NET client去配置和测试,尝试去运行示例。首先要阐明,在你的项目做任何修改前,所有这些设置都被正确的描述在Official RabbitMQ SSL documentation for .NET.


EasyNetQ提供了一个Logger接口 IEasyNetQLogger

public interface IEasyNetQLogger
{
void DebugWrite(string format,params object[] args);
void InfoWrite(string format, params object[] args);
void ErrorWrite(string format, params object[] args);
void ErrorWrite(Exception exception);
}

Logging 默认是关闭的,NullLogger作为IEasyNetQLogger的具体实现被注册进去。

有一个控制台Logger(ConsoleLogger)可以用来做测试或调试。但是,它或许不能在生产环境系统中使用。调试级别的Logging是非常详细的,记录了所有信息,会对你的应用有性能上的影响。并且,这可能对于那些在AMQPEasyNetQ方面没有深入了解的人来说没有多大意义。

你应该提供自己的基于IEasyNetQLogger实现,记录日志信息和错误信息到自己的应用日志中。RabbitHutch.CreateBus方法提供了overloads方法,允许你替换成自己的日志组件。参看Replacing EasyNetQ Components.你可以使用这个方法注册自己的LoggerBus中。示例如下:

var logger = new MyLogger();// IEasyNetQLogger实现。
var bus = RabbitHutch.CreateBus(“我的连接字符串”,x => x.Register<IEasyNetQLooger>(_ => looger));
 

最新文章

  1. 小tip:关于typeof,instanceof,toString(),valueOf(),toLocaleString(),join(),reverse(),sort(),pop(),push(),shift(),unshift()
  2. linux内核学习之四 系统调用
  3. php生成html文件的多种方法介绍
  4. Hibernate动态更新
  5. 如何快速查找IP归属地
  6. asp.net 代码 注意点
  7. sql删除wordpress没用的postmeta记录
  8. java感触一则
  9. linux使用工具记录
  10. ubuntu 安装LaTex
  11. 主席树初步 HDU2665的区间第k小
  12. hdu3829最大独立集
  13. 1013 Realtime Status
  14. 使用parcel打造一个零配置的react工作流
  15. nyoj281 整数中的1(二) 数位DP
  16. Java学习点滴——初识Java
  17. iOS 反调试
  18. Spring Batch 介绍
  19. Dubbo 消费者
  20. 这两天使用JSP开发程序,记录一些基本方法

热门文章

  1. devops发展历程
  2. SP703 SERVICE - Mobile Service[DP]
  3. Python 常用的ORM框架简介
  4. 企业IT运维以及信息管理部服务器管理
  5. 项目:jSon和Ajax登录功能
  6. 边学边体验django--HttpRequest 对象
  7. MySQL组提交(group commit)
  8. python pass del eval
  9. leetcode解题报告(13):K-diff Pairs in an Array
  10. 国庆集训Day1