Commit cac2cfd8 authored by midKingKing's avatar midKingKing

Updates 后端开发/消息机制.md

Auto commit by GitBook Editor
parent 33c426b2
# 消息系统 # 消息机制
## 1.简介 ## 1.简介
...@@ -16,72 +16,21 @@ RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种 ...@@ -16,72 +16,21 @@ RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种
![](/assets/config.png) ![](/assets/config.png)
## 2 交换机和队列定义 ## 2 自定义消息
在融租易的接口管理的消息队列模块定义功中,提供了自定义队列和交换机的功能,可以根据配置实现自定义的队列和交换机的匹配,避免了在xml中的繁琐配置。 在融租易的接口管理的消息队列模块定义功中,提供了自定义队列和交换机的功能,可以根据配置实现自定义的队列和交换机的匹配,避免了在xml中的繁琐配置。
### 2.1 定义交换机 ### 2.1 定义交换机
java 代码中,注入 IMessagePublisher 类。 接口管理的消息队列定义模块中,首先进行交换机的定义,界面如图:
```java ![](/assets/exchange.png)
public class XXXSenderTest {
@Autowired
private IMessagePublisher messagePublisher;
public void sendMessageTest (){
// 向 队列:queue1 中发送消息 : message1(字符串)
messagePublisher.message("queue1","message1");
User user = new User();
user.setUserName("YJP");
// 向队列:queue2 中发送消息:bean(对象)
messagePublisher.message("queue2", user);
}
}
```
> 之前的 rPush 命令不再推荐使用,改为 message ### 2.2 定义队列和路由键
以上代码示例了如何发送一个消息 定义完交换机后,你还需要定义你的队列和相应的匹配模式(既路由键)界面如图:
1. 注入 IMessagePublisher 用于发送消息
2. message 方法执行发送命令,注意 2 个参数的类型
3. 消息类型是对象的会转换为 json 格式
> 类型的转换是透明的,调用者一般不需要关心
### 2.2 监听队列中的消息
监听队列消息的 java 实现
```java
@QueueMonitor(queue="queue1")
public XXXReceiver implements IMessageConsumer<String>{
/**
* 第一个参数的类型,与 IMessageConsumer 的泛型类型一致
*/
public void onMessage(String message,String queue) {
System.out.println("got message :"+message);
}
}
```
关键点: 关键点:
...@@ -93,7 +42,7 @@ public XXXReceiver implements IMessageConsumer<String>{ ...@@ -93,7 +42,7 @@ public XXXReceiver implements IMessageConsumer<String>{
> 绝大部分时候,都要保证发送的消息类型与接收的类型一致! > 绝大部分时候,都要保证发送的消息类型与接收的类型一致!
## 3 发布/订阅 ## 3 发送消息/接收消息
发布订阅模式的特点是:一个消息会被所有订阅者收到(只会收到一次)。 发布订阅模式的特点是:一个消息会被所有订阅者收到(只会收到一次)。
...@@ -191,65 +140,7 @@ hap中队列根据注解动态初始化,默认队列为持久化,广播队 ...@@ -191,65 +140,7 @@ hap中队列根据注解动态初始化,默认队列为持久化,广播队
rabbitmq主要由3种路由方式**direct\(单播\),topic\(多播\),fanout\(广播\),**rabbitmq会根据使用的路由通过routing-key发送给路由里的队列。路由通过&lt;**rabbit:direct-exchange&gt;**&lt;**rabbit:** **topic-exchange&gt;**&lt;**rabbit:** **fanout-exchange&gt;标签**申明**。** rabbitmq主要由3种路由方式**direct\(单播\),topic\(多播\),fanout\(广播\),**rabbitmq会根据使用的路由通过routing-key发送给路由里的队列。路由通过&lt;**rabbit:direct-exchange&gt;**&lt;**rabbit:** **topic-exchange&gt;**&lt;**rabbit:** **fanout-exchange&gt;标签**申明**。**
### 4.4 绑定路由 ###
将队列绑定到相应路由,把队列和路由联系起来。由 ** &lt;rabbit:bindings&gt; 标签**声明。(示例如下
```xml
<!-- 定义direct exchange,绑定queueTest -->
<rabbit:direct-exchange name="exchangeTest" durable="true" auto-delete="false">
<rabbit:bindings>
<rabbit:binding queue="queueTest" key="queueTestKey"></rabbit:binding>
</rabbit:bindings>
</rabbit:direct-exchange>
```
### 4.5 RabbitTemplate
用于发送消息,通过 `rabbit:template` 标签声明,注入bean后可使用convertAndSend等方法发送信息也可使用receiveAndConvert等方法**同步**接受消息。需要参数exchange和 routing-key来确定发往的队列。 可使用自定义的retryTemplate扩展retry机制。
```xml
!--定义rabbit template用于数据的接收和发送 -->
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory"
routing-key="queueTestKey" exchange="exchangeTest"/>
```
### 5.6 监听队列(异步接收消息)
通过container容易声明监听,在容器中配置监听所需队列名称和监听的方法messageRciver
```xml
<rabbit:listener-container
connection-factory="connectionFactory">
<rabbit:listener queues="queueTest" ref="messageReceiver" />
</rabbit:listener-container>
<bean id="messageRecevicer" ref="com.hand.hap.QueueListenter">
```
队列监听java类
```java
public class QueueListenter implements MessageListener {
@Override
public void onMessage(Message msg) {
//相关业务处理
}
}
```
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment