[https://docs.abp.io/zh-Hans/abp/latest/Distributed-Event-Bus-RabbitMQ-Integration](ABP vNext官方文档链接),基本使用可直接阅读官方文档,云怀不重复造轮子,只做官方未提到但重要的说明
关键配置说明
关键配置类:AbpRabbitMqEventBusOptions.cs
用于配置连接名、队列名即要监听的队列名、交换机名;
关键配置类:AbpRabbitMqOptions
即原始RabbitMq针对.NET的连接配置类:RabbitMqConnections.cs
关键配置——appsettings.json
本地连接配置
{"RabbitMQ": {"EventBus": {"ClientName": "MyClientName","ExchangeName": "MyExchangeName"}}
}
远程主机配置
集群用逗号分隔
{"RabbitMQ": {"Connections": {"Default": {"HostName": "192.168.1.101:5701,ip2:port2,ip3:port3","UserName": "yunhuai","Password": "yunhuai","VirtualHost": "/test"}},"EventBus": {"ClientName": "MsDemo_AServer","ExchangeName": "MsDemo"}}
}
多主机
若应用程序有多个主机,指定其中之一为EventBus
{"RabbitMQ": {"Connections": {"Default": {"HostName": "123.123.123.123"},"SecondConnection": {"HostName": "321.321.321.321"}},"EventBus": {"ClientName": "MyClientName","ExchangeName": "MyExchangeName","ConnectionName": "SecondConnection"}}
}
ABP vNext 底层限制
交换机只支持direct路由,原RabbitMQ可配置
交换机和队列强行持久化,原RabbitMQ可配置
当所有绑定队列都不在了,交换机也强制可不自动删除,原RabbitMQ可配置
强制不可申明排他性队列,排他性队列特征:只对首次申明队列的连接可见并会在该连接断开时自动删除,原RabbitMQ可配置
当所有消费者断开后,强制不会删除该队列,原RabbitMQ可配置
备注:以上皆因源码写死,并非RabbitMQ不支持,源码如下:
注意事项
A服务=》B服务=》C服务,传输对象1与传输对象2不能是同一个命名空间下的同一个类名,这是由于ABP vNext EventBus底层将完整类名作为路由键进行转发,如果两个对象一致,那么B将进入死循环,附带C也进入异常
A、B、C之间应该共用同一个交换机,即配置的ExChangeName一致,而队列名不一致
不存在自己指定自己作为生产者的队列的名字,所以必须先启动队列消费者创建了相关队列,队列生产者发出Message才有效果,即启动顺序:C=>B=>A