Java操作队列

常见的几种模式:

java 排队 消息队列 java使用消息队列_用例

 

1 简单队列simple

模型:(p + 队列 + c)

P:生产者producer,将消息发送到队列

红色:消息队列

C:消费者consumer,从队列消费消息

 

生产真的速度一般大于消费者的速度(因为消费者需要和业务计算相结合)

java 排队 消息队列 java使用消息队列_大数据_02

创建maven工程

导入pomjar文件

java 排队 消息队列 java使用消息队列_java_03

 

步骤:

a:获取MQ链接的工具类

java 排队 消息队列 java使用消息队列_用例_04

 

创建生产者类发送消息:

java 排队 消息队列 java使用消息队列_用例_05

再回到web控制台可以看到刚才的操作:

java 排队 消息队列 java使用消息队列_大数据_06

java 排队 消息队列 java使用消息队列_持久化_07

 

C: 创建一个消费者类消费消息

用的是旧的版本的(3.4)队列API

java 排队 消息队列 java使用消息队列_用例_08

 

用最新的队列API(基于事件的监听):

java 排队 消息队列 java使用消息队列_大数据_09


 

 

 

2 工作队列work    queue

一个生产者对应多个消费者!

java 排队 消息队列 java使用消息队列_用例_10

 

轮询分发(round ribon)

编写生产者类生产50条信息:

java 排队 消息队列 java使用消息队列_java 排队 消息队列_11

 

 

消费者1消费消息:

java 排队 消息队列 java使用消息队列_持久化_12

 

消费者2消费消息:

修改睡眠时间为1000ms.

 

结果会看到消费者1和2都一人一个消息,均分消费了这50条消息。

这个是Rabbitmq的轮询分发(round-robin)。

 

 

公平分发(fair dipatch)

java 排队 消息队列 java使用消息队列_java_13

java 排队 消息队列 java使用消息队列_java_14

关闭自动应答asc,改为手动

 

修改生产者代码:

java 排队 消息队列 java使用消息队列_java_15

 

修改消费者代码:

java 排队 消息队列 java使用消息队列_持久化_16

 

运行的结果会看到睡眠2000ms的消费者消费的消息明显少于睡眠1000ms的消费者

 

 

消息应答ack,和消息持久化durable

消息应答主要是防止消费者挂了之后丢失数据。

java 排队 消息队列 java使用消息队列_java 排队 消息队列_17

 

持久化durable:

 

消息的持久化主要是为了防止rabbitmq服务器挂了之后消息丢失。

java 排队 消息队列 java使用消息队列_用例_18

 

 

3 订阅模式

 

模型

java 排队 消息队列 java使用消息队列_java 排队 消息队列_19

X:交换机,路由器。需要绑定到队列。

java 排队 消息队列 java使用消息队列_大数据_20

交换机

java 排队 消息队列 java使用消息队列_持久化_21

 

java 排队 消息队列 java使用消息队列_java 排队 消息队列_22

 

 

"":匿名转发。

java 排队 消息队列 java使用消息队列_持久化_23

Fanout:不处理路由键

java 排队 消息队列 java使用消息队列_持久化_24


java 排队 消息队列 java使用消息队列_大数据_25


 

代码用例

编写生产者:

java 排队 消息队列 java使用消息队列_持久化_26


java 排队 消息队列 java使用消息队列_java 排队 消息队列_27


运行之后可以在web控台看到多了一个exchange:

java 排队 消息队列 java使用消息队列_用例_28

 

创建消费者类:

java 排队 消息队列 java使用消息队列_持久化_29


java 排队 消息队列 java使用消息队列_持久化_30


在web控制台可以见到:

java 排队 消息队列 java使用消息队列_java_31


 

 

 

 

 

4 Direct:处理路由键的模式

java 排队 消息队列 java使用消息队列_java_32


java 排队 消息队列 java使用消息队列_java_33


 

代码用例 生产者:

 

java 排队 消息队列 java使用消息队列_大数据_34


 

消费者1(单个路由key):

java 排队 消息队列 java使用消息队列_持久化_35


java 排队 消息队列 java使用消息队列_用例_36


 

消费者2(多个路由key):

java 排队 消息队列 java使用消息队列_持久化_37


java 排队 消息队列 java使用消息队列_java 排队 消息队列_38


 

启动消费者1和2之后,再发送key为error的消息,消费者1和2都能消费该消息

 

5 Topics 模式    

 

将路由键和某种主题模式匹配(采用通配符的方式)

#:匹配一个或者多个的情况(常用)

*:匹配一个。(少用)

java 排队 消息队列 java使用消息队列_java_39

 

java 排队 消息队列 java使用消息队列_java 排队 消息队列_40

 

 

代码用例:发布商品的增删改查

生产者:

java 排队 消息队列 java使用消息队列_java_41

消费者1:

java 排队 消息队列 java使用消息队列_用例_42


 

消费者2:

java 排队 消息队列 java使用消息队列_大数据_43