
为什么Template不需要定义configuration文件来接收yml文件的参数?
这是个常识问题,我这里做个记录。。。
我都能忘记昨天吃了东西的,好在我喜欢做笔记。。。
我们的demo都是基于RabbitTemplate来写。。。
通过枚举ExchangeEnum、QueueEnum、BindingEnum动态维护和创建
1.初始化交换机
2.初始化队列
3.交换机和队列绑定
1.定义队列
2.定义交换机
3.交换机和队列绑定
4.不定义超时队列的@RabbitListener,只定义超时接收队列的@RabbitListener
测试:
1.AsyncRabbitTemplate定义
2.测试
3.监听方法
1.消息回退:
void basicNack(long deliveryTag, boolean multiple, boolean requeue)
2.拒绝消息
void basicReject(long deliveryTag, boolean requeue) throws IOException
3.确认ack
void basicAck(long deliveryTag, boolean multiple) throws IOException
4.创建一个队列
5.启动一个消费者,并返回服务端生成的消费者标识
6.取消消费者订阅
7.主动拉取队列中的一条消息
1.队列参数
2.消息参数
读取配置文件的RabbitMQ的组件信息,然后动态的去创建关系。
配置文件格式:
配置文件:
声明 *** 作类(容器中单例bean创建完毕,执行回调方法):
在项目启动后,便会去读取配置文件的信息,然后去创建RabbitMQ的组件信息,实现了配置集中管理。
概述由于种种原因,RabbitMQ到目前为止,官方还没有实现优先级队列,只实现了Consumer的优先级处理。
但是,迫于种种原因,应用层面上又需要优先级队列,因此需求来了:如何为RabbitMQ加入优先级队列特性。
查询资料后,得知RabbitMQ虽然官方没有支持此特性,但是社区已经有相关优先级队列插件了,并且这个插件被列在RabbitMQ官方网站中了。
地址如下:http://www.rabbitmq.com/community-plugins.html
插件安装
不要立刻下载这个url中的那个链接,要先根据你想要更新目标的rabbitmq版本再去另外一个地方下载相应插件,如:
会列出两大版本的插件目录(选择对应目录进入下载,否则会报错...):
插件如何安装?
进入rabbitmq安装目录,进入plugins目录,将上面这个ez文件拷贝到plugins目录中,然后运行命令来enable这个插件
centos下,默认路径在:/usr/lib/rabbitmq/lib/rabbitmq_server-3.3.4/plugins(版本号可能会变化)
windows下,默认路径在:C:\Program Files\RabbitMQ Server\rabbitmq_server-3.3.4\plugins(版本号可能会变化)
把ez文件拷贝过去,然后运行列举插件列表命令:
找到这个优先级队列插件名为:rabbitmq_priority_queue
执行:rabbitmq-plugins enable rabbitmq_priority_queue
ok,重新启动rabbitmq-server服务。
这样,server端的配置算完成了。
C#代码端需要作出的更改
下面看看客户端类库的编写:
我们先要定义优先级枚举,继承自byte,因为RabbitMQ的C#客户端优先级是用byte来传递的:
先定义3个级别的优先级:低、中、高(其实可以定义很多级别,只是为了简化,因此只定义了3个级别)
有2个地方需要改动:
申明队列时需要加入自定义的属性
发送消息到rabbitmq时,设置自定义属性
internal static IDictionary<string, object>QueueArguments
{
get
{
IDictionary<string, object>arguments=new Dictionary<string, object>()
arguments["x-max-priority"] = 10//定义队列优先级为10个级别
return arguments
}
}
channel.QueueDeclare("queueName", true, false, false, QueueArguments)//QueueArguments就是上面定义的这个dictionary
var headers = channel.CreateBasicProperties()
headers.Priority = (byte)msg.Priority//在这里把继承自byte的枚举转换成byte
channel.BasicPublish("exchange", "route", headers, SerializerUtility.Serialize2Bytes(msg))
其他注意的地方
在装了优先级队列插件的rabbitmq-server实例中,所有的Durable队列必须用如上的方式,设置x-max-priority属性,否则rabbitmq-server服务会crash
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)