- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章spring boot中使用RabbitMQ routing路由详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在上一个教程中我们创建了一个扇形(fanout)交换器。我们能把消息已广播的形式传递给多个消费者.
要做什么?routing 路由 。
在这个教程中,添加一个新的特性,我们可以只订阅消息的一部分。例如,将只连接我们感兴趣的颜色("orange", "black", "green"),并且把消息全部打印在控制台上.
绑定 。
交换器和队列是一种绑定关系。简单的理解为:队列对来自这个交换器中的信息感兴趣.
绑定可以加上一个额外的参数routingkey。spring-amqp使用通俗易懂的api(建造者模式)使它们之间的关系非常清晰。把交换器和队列放入bindingbuilder中并可以很容易的把队列用路由键(routingkey)绑定到交换器上.
1
2
3
4
|
@bean
public
binding binding0a(directexchange directexchange, queue autodeletequeue0) {
return
bindingbuilder.bind(autodeletequeue0).to(directexchange).with(
"orange"
);
}
|
这个意味着,绑定键依赖交换器类型,fanout交换器就不行没有可以绑定的选项.
直连交换器 。
前一个教程中我们的消息系统是以广播的形式传递给所有的消费者。我们想要扩展一下功能,加入基于颜色类型的过滤器。例如,我们想要程序一个接收详细的错误消息并写入硬盘作为日志,不接收info或者警告日志.
橙色、黑色、绿色三种路由键 。
如上图,直连交换器x上绑定了2个队列。第一个队列使用路由键是orange,第二个有2个路由键,black和green.
在这个设定中,把一个使用路由键为orange的消息推送到交换器上时,那么这个消息将会被路由到队列q1上。消息使用的路由键是black或者green时将会被路由到q2。其余没有使用路由键的消息将会被丢弃.
并联绑定 。
并联绑定 。
这个可以实现类似fanout交换器的功能.
差不多了,看代码 。
config.java 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
package
com.zb.rabbitmqtest.t4routing.config;
import
org.springframework.amqp.core.*;
import
org.springframework.context.annotation.bean;
import
org.springframework.context.annotation.configuration;
/**
* @author 张博
*/
@configuration
(value =
"t4config"
)
public
class
config {
/**
* 创建人:张博
* 时间:2018/3/5 上午10:45
* @apinote 定义直连交换器
*/
@bean
public
directexchange directexchange() {
return
new
directexchange(
"direct-exchange"
);
}
/**
* 创建人:张博
* 时间:2018/3/5 上午10:48
* @apinote 定义自动删除匿名队列
*/
@bean
public
queue autodeletequeue0() {
return
new
anonymousqueue();
}
/**
* 创建人:张博
* 时间:2018/3/5 上午10:48
* @apinote 定义自动删除匿名队列
*/
@bean
public
queue autodeletequeue1() {
return
new
anonymousqueue();
}
/**
* 创建人:张博
* 时间:2018/3/5 上午10:48
* @param directexchange 直连交换器
* @param autodeletequeue0 自动删除队列
* @apinote 绑定使用路由键为 orange 的 autodeletequeue0 队列到直连交换器上
* @return binding
*/
@bean
public
binding binding0a(directexchange directexchange, queue autodeletequeue0) {
return
bindingbuilder.bind(autodeletequeue0).to(directexchange).with(
"orange"
);
}
/**
* 创建人:张博
* 时间:2018/3/5 上午10:48
* @param directexchange 直连交换器
* @param autodeletequeue0 自动删除队列
* @apinote 绑定使用路由键为 black 的 autodeletequeue0 队列到直连交换器上
* @return binding
*/
@bean
public
binding binding0b(directexchange directexchange, queue autodeletequeue0) {
return
bindingbuilder.bind(autodeletequeue0).to(directexchange).with(
"black"
);
}
/**
* 创建人:张博
* 时间:2018/3/5 上午10:48
* @param directexchange 直连交换器
* @param autodeletequeue1 自动删除队列
* @apinote 绑定使用路由键为 black 的 autodeletequeue1 队列到直连交换器上
* @return binding
*/
@bean
public
binding binding1a(directexchange directexchange, queue autodeletequeue1) {
return
bindingbuilder.bind(autodeletequeue1).to(directexchange).with(
"black"
);
}
/**
* 创建人:张博
* 时间:2018/3/5 上午10:48
* @param directexchange 直连交换器
* @param autodeletequeue1 自动删除队列
* @apinote 绑定使用路由键为 green 的 autodeletequeue1 队列到直连交换器上
* @return binding
*/
@bean
public
binding binding1b(directexchange directexchange, queue autodeletequeue1) {
return
bindingbuilder.bind(autodeletequeue1).to(directexchange).with(
"green"
);
}
}
|
receiver.java 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package
com.zb.rabbitmqtest.t4routing.receiver;
import
org.springframework.amqp.rabbit.annotation.rabbitlistener;
import
org.springframework.stereotype.component;
/**
* @author 张博
*/
@component
(value =
"t4receiver"
)
public
class
receiver {
@rabbitlistener
(queues =
"#{autodeletequeue0.name}"
)
public
void
receiver0(string str) {
system.out.println(
"receiver0++++++++++:"
+ str);
}
@rabbitlistener
(queues =
"#{autodeletequeue1.name}"
)
public
void
receiver1(string str) {
system.out.println(
"receiver1++++++++++:"
+ str);
}
}
|
send.java 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package
com.zb.rabbitmqtest.t4routing.send;
import
org.springframework.amqp.core.directexchange;
import
org.springframework.amqp.rabbit.core.rabbittemplate;
import
org.springframework.beans.factory.annotation.autowired;
import
org.springframework.stereotype.component;
/**
* @author 张博【zhangb@lianliantech.cn】
*/
@component
(value =
"t4send"
)
public
class
send {
@autowired
private
directexchange directexchange;
@autowired
private
rabbittemplate rabbittemplate;
private
string[] keys = {
"orange"
,
"black"
,
"green"
};
public
void
send() {
string message =
"哈哈哈"
;
for
(
int
i =
0
; i <
5
; i++) {
system.out.println(
"send++++++++++:"
.concat(message));
rabbittemplate.convertandsend(directexchange.getname(), keys[
2
], message);
}
}
}
|
sendtest.java 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package
com.zb.rabbitmqtest.t4routing.send;
import
org.junit.test;
import
org.junit.runner.runwith;
import
org.springframework.beans.factory.annotation.autowired;
import
org.springframework.boot.test.context.springboottest;
import
org.springframework.test.context.junit4.springrunner;
/**
* @author 张博
*/
@runwith
(springrunner.
class
)
@springboottest
public
class
sendtest {
@autowired
private
send send;
@test
public
void
send()
throws
exception {
send.send();
}
}
|
测试结果,如果是keys[0]那么只有receiver0,如果是keys[1]那么就是类似广播那样,有receive0和receive1,如果是keys[2]那么只有receive1 。
当keys[0]时 send++++++++++:哈哈哈 send++++++++++:哈哈哈 send++++++++++:哈哈哈 send++++++++++:哈哈哈 send++++++++++:哈哈哈 receiver0++++++++++:哈哈哈 receiver0++++++++++:哈哈哈 receiver0++++++++++:哈哈哈 receiver0++++++++++:哈哈哈 receiver0++++++++++:哈哈哈 。
当keys[1]时 send++++++++++:哈哈哈 send++++++++++:哈哈哈 send++++++++++:哈哈哈 send++++++++++:哈哈哈 send++++++++++:哈哈哈 receiver1++++++++++:哈哈哈 receiver1++++++++++:哈哈哈 receiver0++++++++++:哈哈哈 receiver0++++++++++:哈哈哈 receiver0++++++++++:哈哈哈 receiver1++++++++++:哈哈哈 receiver1++++++++++:哈哈哈 receiver0++++++++++:哈哈哈 receiver1++++++++++:哈哈哈 receiver0++++++++++:哈哈哈 。
当keys[2]时 send++++++++++:哈哈哈 send++++++++++:哈哈哈 send++++++++++:哈哈哈 send++++++++++:哈哈哈 send++++++++++:哈哈哈 receiver1++++++++++:哈哈哈 receiver1++++++++++:哈哈哈 receiver1++++++++++:哈哈哈 receiver1++++++++++:哈哈哈 receiver1++++++++++:哈哈哈 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://www.jianshu.com/p/20d9009d2db8 。
最后此篇关于spring boot中使用RabbitMQ routing路由详解的文章就讲到这里了,如果你想了解更多关于spring boot中使用RabbitMQ routing路由详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
您好,如果没有身份验证,我尝试保护路由,但它不起作用 警告:您不应在同一个 route 使用路线组件和路线渲染;路线渲染将被忽略 App.js import React, { Fragment,
几乎我见过的每个示例,app.js 都使用 require 和路径 ./。我想知道为什么我们不能只使用 /。例如,为什么我们不能执行以下操作。 var express = require('expre
如果router.all()只匹配所有方法,是否可以用router.use()代替?router.use() 和 router.route() 之间有什么区别? 最佳答案 router.all:这意味
在我的 Symfony应用程序我想根据当前用户的文化选择 routing.yml; 'en' => routing.en.yml 'no' => routing.no.yml 等等。 关于如何做到这一
我正在使用 React Router v6 并为我的应用程序创建私有(private)路由。 在文件 PrivateRoute.js 中,我有代码 import React from 'react';
这个问题在这里已经有了答案: Error "Error: A is only ever to be used as the child of element" (14 个回答) Error: [P
我正在关注 Ember Quick Start guide (ember-cli v 2.11),并按照说明构建玩具应用程序。在“定义路线”部分,说明说要运行命令 ember generate rou
这个问题在这里已经有了答案: ReactJS: [Home] is not a component. All component children of must be a or (5 个答
这个问题在这里已经有了答案: ReactJS: [Home] is not a component. All component children of must be a or (5 个答
单击“开始测验”按钮时,我试图导航到“/quiz”。 但是,当我编译我的代码时,我在网站应用程序上收到以下错误:[Home] is not a component. All component ch
我有一点咸菜。我正在使用路由保护(实现 CanActivate 接口(interface))来检查用户是否被授予访问特定路由的权限: const routes: Routes = [ {
我正在尝试测试我的应用程序正在使用的引擎内部的 Controller 。规范不在引擎中,而是在应用程序本身中(我试图在引擎中进行测试,但也遇到了问题)。 我的引擎有以下 routes.rb: Revi
我是Remix的新手,我正在尝试使用V2路由方法实现特定的路由解决方案。。这是一个人为的例子,不是真实的东西,只是为了说明这一点。。我想要的URL方案是:。我从以下几条路线开始:。App/routes
我正在尝试从 rails 2.3.x(使用 subdomain_routes 插件)转换一些子域路由,如下所示: map.subdomain :biz do |biz| biz.resources
我将 Symfony 的 3.1 路由组件用作独立组件。 我想调试路由。 据此: http://symfony.com/doc/current/routing/debug.html 这是通过运行以下命
我是 Sparkjava 的新手,总体上喜欢它。但是,是否必须在 main 方法中定义新的路由/端点?对于任何重要的 Web 应用程序,这将导致一个非常长的 main 方法,或者我需要有多个 main
我刚刚使用node.js 和express.js 开发了一个原型(prototype)。在这里,我使用了 Express 路由来对后端进行 CRUD。 server.js 文件: app.get('/
我不明白 Angular 4 中路由的一些基本概念。 index.html: 文件结构: - app |- app.routings.ts |- collections |-- collection
我在反应路线和理解合成路线方面遇到了一些困难。我尝试了一些代码,但不幸的是,它不能像预期的那样工作。“/”路径运行得很好,但是,当我尝试访问“/Child”时,它似乎不起作用。我认为包装器路由}/>可
我正在尝试使用 cakephp 3 实现 REST api。 为了给我的问题提供一个易于重现的示例,我从全新安装 cakephp 3.1.11 开始。 在 config/routes.php 中,我添
我是一名优秀的程序员,十分优秀!