Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
H
hel-developer-guide
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
chenhao
hel-developer-guide
Commits
cac2cfd8
Commit
cac2cfd8
authored
Jul 27, 2017
by
midKingKing
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Updates 后端开发/消息机制.md
Auto commit by GitBook Editor
parent
33c426b2
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
8 additions
and
117 deletions
+8
-117
config.png
assets/config.png
+0
-0
exchange.png
assets/exchange.png
+0
-0
消息机制.md
后端开发/消息机制.md
+8
-117
No files found.
assets/config.png
0 → 100644
View file @
cac2cfd8
15.8 KB
assets/exchange.png
0 → 100644
View file @
cac2cfd8
34.1 KB
后端开发/消息机制.md
View file @
cac2cfd8
# 消息
系统
# 消息
机制
## 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发送给路由里的队列。路由通过
<
**rabbit:direct-exchange
>
**
<
**rabbit:**
**topic-exchange>**
<
**rabbit:**
**fanout-exchange>标签**
申明
**。**
rabbitmq主要由3种路由方式
**direct\(单播\),topic\(多播\),fanout\(广播\),**
rabbitmq会根据使用的路由通过routing-key发送给路由里的队列。路由通过
<
**rabbit:direct-exchange
>
**
<
**rabbit:**
**topic-exchange>**
<
**rabbit:**
**fanout-exchange>标签**
申明
**。**
### 4.4 绑定路由
###
将队列绑定到相应路由,把队列和路由联系起来。由
** <rabbit:bindings> 标签**
声明。(示例如下
```
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
)
{
//相关业务处理
}
}
```
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment