源地址:
最近在研究异步的消息机制,使用的是rabbit mq这个消息框架,使用Erlang开发,提供了java的jar包。
AMQP 里主要要说两个组件:Exchange 和 Queue (在 AMQP 1.0 里还会有变动),这两者都在 Server 端,又称作 Broker ,这部分是 RabbitMQ 实现的。客户端,通常有 Producer 和 Consumer 两种类型。
通常的操作流程是:
(1) 消费者: 创建信息通道。 (2) 消费者: 定义消息队列。 (3) 消费者: 定义特定类型的交换机。 (4) 消费者: 设定绑定规则 (包括交换机名称、队列名称以及路由键)。 (5) 消费者: 等待消息。 (6) 生产者: 创建消息。 (7) 生产者: 将消息投递给信息通道 (注明接收交换机名称和路由键)。 (8) 交换机: 获取消息,依据交换机类型决定是否匹配路由规则 (如需匹配,则对比消息路由键和绑定路由键)。 (9) 消费者: 获取并处理消息,发送反馈。 (10) 结束: 关闭通道和连接。队列定义参数:
durable: 是否持久,如果是true,则在服务重启之后还是存在,否则不存在exclusive: 仅创建者可以使用的私有队列,断开后自动删除。(如果为true则只有创建者线程才可以使用,如果线程停止则queue也会自动删除) auto_delete: 当所有消费客户端连接断开后,是否自动删除队列。交换机定义参数:
type: 交换机类型,包括 fanout, direct 和 topic。 auto_delete: 当所有绑定队列都不再使用时,是否自动删除该交换机。交换机类型:
Fanout: 不处理路由键,将消息广播给绑定到该交换机的所有队列。 不论消息的路由关键字是什么,这条消息都会被路由到所有与该交换器绑定的队列中。广播式交换器类型的工作方式如下:不使用任何参数将消息队列与交换器绑定在一起。 发布者(直接式交换器类型描述中的producer变成了publisher,已经隐含了二种交换器类型的区别)向交换器发送一条消息。 消息被无条件的传递到所有和这个交换器绑定的消息队列中。 Direct: 处理路由键,对消息路径进行全文匹配。消息路由键 "dog" 只能匹配 "dog" 绑定,不匹配 "dog.puppy" 这类绑定。 通过精确匹配消息的路由关键字,将消息路由到零个或者多个队列中,绑定关键字用来将队列和交换器绑定到一起。这让我们可以构建经典的点对点队列消息传输模型,不过和任何已定义的交换器类型一样,当消息的路由关键字与多个绑定关键字匹配时,消息可能会被发送到多个队列中。Topic: 处理路由键,按模式匹配路由键。模式符号 "#" 表示一个或多个单词,"*" 仅匹配一个单词。如 "audit.#" 可匹配 "audit.irs.corporate",但 "audit.*" 只匹配 "audit.irs"。
主题式交换器类型提供了这样的路由机制:通过消息的路由关键字和绑定关键字的模式匹配,将消息路由到被绑定的队列中。这种路由器类型可以被用来支持经典的发布/订阅消息传输模型——使用主题名字空间作为消息寻址模式,将消息传递给那些部分或者全部匹配主题模式的多个消费者。主题交换器类型的工作方式如下:绑定关键字用零个或多个标记构成,每一个标记之间用“.”字符分隔。绑定关键字必须用这种形式明确说明,并支持通配符:“*”匹配一个词组,“#”零个或多个词组。因此绑定关键字“*.stock.#”匹配路由关键字“usd.stock”和“eur.stock.db”,但是不匹配“stock.nasdaq”。这种交换器类型是可选的。生产者无需定义队列、交换机和绑定,只需将消息投递给信息通道即可。
如果定义一durable的queue,那么bind此queue的exchange也必须是durable的
定义用户权限set_permissions [-p vhostpath] [-s scope] {user} {conf} {write} {read}vhostpath
The name of the virtual host to which to grant the user access, defaulting to /.scope
Scope of the permissions: either client (the default) or all. This determines whether permissions are checked for server-generated resource names (all) or only for client-specified resource names (client).user
The name of the user to grant access to the specified virtual host.conf
A regular expression matching resource names for which the user is granted configure permissions.write
A regular expression matching resource names for which the user is granted write permissions.read
A regular expression matching resource names for which the user is granted read permissions.Sets user permissions.
For example:
rabbitmqctl set_permissions -p /myvhost tonyg "^tonyg-.*" ".*" ".*"This command instructs the RabbitMQ broker to grant the user named tonyg access to the virtual host called /myvhost, with configure permissions on all resources whose names starts with "tonyg-", and write and read permissions on all resources.
spring AMQP 中的SimpleMessageListenerContainer 是spring封装好了的,有一系列bean初始化的动作包含在内,目前的用例中因为需要通过程序动态置入queue就直接调用start方法,看了下spring的源码,他是在bean初始化的时候调用的。
目前关于rabbit mq的中文教程很少,刚接触的时候只是看官方上的文档,和官方提供的示例。因为是用Spring-amqp来做的,所以基本上看spring-amqp的时间多一点,提供了一个简单的hello world和复杂的stock例子,先结合api看hello world的例子,再看spring amqp的reference 感觉就可以入门了,当然之前对amqp的概念要熟悉。感觉rabbit的文档真是比较少特别是java的接口方面,花了很多时间死啃那些文档。