此处将为大家介绍关于如何让SpringRabbitMQ创建一个新的队列?的详细内容,并且为您解答有关rabbitmq添加队列的相关问题,此外,我们还将为您介绍关于RabbitMQ(三)SpringBo
此处将为大家介绍关于如何让Spring RabbitMQ创建一个新的队列?的详细内容,并且为您解答有关rabbitmq添加队列的相关问题,此外,我们还将为您介绍关于RabbitMQ (三) SpringBoot2.x 集成 RabbitMQ、rabbitmq 中有没有类似 redis 中 set 类型的队列?、RabbitMQ 入门 与 RabbitMQ 在 Spring Boot 中的使用、RabbitMQ 入门:在 Spring Boot 应用中整合 RabbitMQ的有用信息。
本文目录一览:- 如何让Spring RabbitMQ创建一个新的队列?(rabbitmq添加队列)
- RabbitMQ (三) SpringBoot2.x 集成 RabbitMQ
- rabbitmq 中有没有类似 redis 中 set 类型的队列?
- RabbitMQ 入门 与 RabbitMQ 在 Spring Boot 中的使用
- RabbitMQ 入门:在 Spring Boot 应用中整合 RabbitMQ
如何让Spring RabbitMQ创建一个新的队列?(rabbitmq添加队列)
根据我对Rabbit-mq的(有限的)经验,如果您为尚不存在的队列创建新的侦听器,则会自动创建该队列。我试图将Spring AMQP项目与rabbit-
mq一起使用来设置侦听器,但是却出现错误。这是我的xml配置:
<rabbit:connection-factory id="rabbitConnectionFactory" host="172.16.45.1" username="test" password="password" /><rabbit:listener-container connection-factory="rabbitConnectionFactory" > <rabbit:listener ref="testQueueListener" queue-names="test" /></rabbit:listener-container><bean id="testQueueListener"> </bean>
我在RabbitMq日志中得到了这个:
=ERROR REPORT==== 3-May-2013::23:17:24 ===connection <0.1652.0>, channel 1 - soft error:{amqp_error,not_found,"no queue ''test'' in vhost ''/''",''queue.declare''}
还有来自AMQP的类似错误:
2013-05-03 23:17:24,059 ERROR [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer] (SimpleAsyncTaskExecutor-1) - Consumer received fatal exception on startuporg.springframework.amqp.rabbit.listener.FatalListenerStartupException: Cannot prepare queue for listener. Either the queue doesn''t exist or the broker will not allow us to use it.
从堆栈跟踪中可以看出,队列是在“被动”模式下创建的-任何人都可以指出我如何不使用被动模式来创建队列,这样我就不会看到此错误?还是我想念其他东西?
答案1
小编典典解决我问题的方法似乎是添加一个管理员。这是我的xml:
<rabbit:listener-container connection-factory="rabbitConnectionFactory" > <rabbit:listener ref="orderQueueListener" queues="test.order" /></rabbit:listener-container><rabbit:queue name="test.order"></rabbit:queue><rabbit:admin id="amqpAdmin" connection-factory="rabbitConnectionFactory"/><bean id="orderQueueListener"> </bean>
RabbitMQ (三) SpringBoot2.x 集成 RabbitMQ
3-1 RabbitMQ 整合 SpringBoot2.x 生产者发送消息
创建 SpringBoot 项目
application.properties 配置
spring.rabbitmq.host=192.168.152.128
spring.rabbitmq.port=5672
spring.rabbitmq.username=root
spring.rabbitmq.password=root
创建 SendService.java
SpringBoot 主运行类
3-2 RabbitMQ 整合 SpringBoot2.x 消费者接受消息
创建 SpringBoot 项目
application.properties 配置和上面项目一样 导入 rabbitmq 依赖
创建 ReveiveService.java
SpringBoot 主运行类
3-3 使用 JSON 传递消息
发送和接收的 SpringBoot 工程添加 fastjson 依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.36</version>
</dependency>
发送和接收的 SpringBoot 工程添加 User 实体类
修改 SendService.java
修改 ReceiveService.java
3-4 使用监听器接收消息 (否则 ReceiveService 无法实时接收消息)
接收消息的 SpringBoot 工程添加 RabbitMQListener.java
@Component("rabbitMQListener")
public class RabbitMQListener {
//指定当前方法是RabbitMQ的一个监听器的方法,用于监听某些队列,如果队列中拥有新的消息则直接进行消息的接收
@RabbitListener(queues = {"myQueue"})//参数 queues 是一个数组的参数,用于指定被监听的消息队列名称
public void listenerReceive(Message message){//自定义的接收消息的方法,参数是一个Message对象,这个对象就是我们的消息数据
try {
//使用消息对象调用getBody方法获取具体的消息数据,并转换成对应的json字符串
String jsonData=new String(message.getBody(),"UTF-8");
//使用FastJSON将json字符串转换成对象
User user= JSONObject.parseObject(jsonData,User.class);
System.out.println(user.getId()+" "+user.getName());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
修改消息接收的主运行类
rabbitmq 中有没有类似 redis 中 set 类型的队列?
RabbitMQ 入门 与 RabbitMQ 在 Spring Boot 中的使用
##Message Broker 与 AMQP 简介
Message Broker 是一种消息验证、传输、路由的架构模式,其设计目标主要应用于下面这些场景:
-
消息路由到一个或多个目的地
-
消息转化为其他的表现方式
-
执行消息的聚集、消息的分解,并将结果发送到他们的目的地,然后重新组合相应返回给消息用户
-
调用 Web 服务来检索数据
-
响应事件或错误
-
使用发布 - 订阅模式来提供内容或基于主题的消息路由
-
AMQP 是 Advanced Message Queuing Protocol 的简称,它是一个面向消息中间件的开放式标准应用层协议。AMQP 定义了这些特性:
-
消息方向
-
消息队列
-
消息路由(包括:点到点和发布 - 订阅模式)
-
可靠性
-
安全性 ##RabbitMQ
本文要介绍的 RabbitMQ 就是以 AMQP 协议实现的一种中间件产品,它可以支持多种操作系统,多种编程语言,几乎可以覆盖所有主流的企业级技术平台。
## 安装
在 RabbitMQ 官网的下载页面 https://www.rabbitmq.com/download.html 中,我们可以获取到针对各种不同操作系统的安装包和说明文档。这里,我们将对几个常用的平台一一说明。
下面我们采用的 Erlang 和 RabbitMQ Server 版本说明:
Erlang/OTP 19.1 RabbitMQ Server 3.6.5 ##Windows 安装
1、安装 Erland,通过官方下载页面 http://www.erlang.org/downloads 获取 exe 安装包,直接打开并完成安装。 2、安装 RabbitMQ,通过官方下载页面 https://www.rabbitmq.com/download.html 获取 exe 安装包。 3、下载完成后,直接运行安装程序。 4、RabbitMQ Server 安装完成之后,会自动的注册为服务,并以默认配置启动起来。
##Mac OS X 安装
在 Mac OS X 中使用 brew 工具,可以很容易的安装 RabbitMQ 的服务端,只需要按如下命令操作即可:
1、brew 更新到最新版本,执行:brew update 2、安装 Erlang,执行:brew install erlang 3、安装 RabbitMQ Server,执行:brew install rabbitmq 4、通过上面的命令,RabbitMQ Server 的命令会被安装到 /usr/local/sbin,并不会自动加到用户的环境变量中去,所以我们需要在.bash_profile 或.profile 文件中增加下面内容:
PATH=$PATH:/usr/local/sbin 这样,我们就可以通过 rabbitmq-server 命令来启动 RabbitMQ 的服务端了。
##Ubuntu 安装
在 Ubuntu 中,我们可以使用 APT 仓库来进行安装
1、安装 Erlang,执行:apt-get install erlang
echo ''deb http://www.rabbitmq.com/debian/ testing main''
sudo tee /etc/apt/sources.list.d/rabbitmq.list
3、更新 APT 仓库的 package list,执行 sudo apt-get update 命令
4、安装 Rabbit Server,执行 sudo apt-get install rabbitmq-server 命令 ##Rabbit 管理
我们可以直接通过配置文件的访问进行管理,也可以通过 Web 的访问进行管理。下面我们将介绍如何通过 Web 进行管理。
- 执行 rabbitmq-plugins enable rabbitmq_management 命令,开启 Web 管理插件,这样我们就可以通过浏览器来进行管理了。
-> rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch
amqp_client
rabbitmq_management_agent
rabbitmq_management
Applying plugin configuration to rabbit@PC-201602152056... started 6 plugins.
- 打开浏览器并访问:http://localhost:15672/,并使用默认用户 guest 登录,密码也为 guest。我们可以看到如下图的管理页面:
从图中,我们可以看到之前章节中提到的一些基本概念,比如:Connections、Channels、Exchanges、Queue 等。第一次使用的读者,可以都点开看看都有些什么内容,熟悉一下 RabbitMQ Server 的服务端。
- 点击 Admin 标签,在这里可以进行用户的管理。 ##Spring Boot 整合
下面,我们通过在 Spring Boot 应用中整合 RabbitMQ,并实现一个简单的发送、接收消息的例子来对 RabbitMQ 有一个直观的感受和理解。
在 Spring Boot 中整合 RabbitMQ 是一件非常容易的事,因为之前我们已经介绍过 Starter POMs,其中的 AMQP 模块就可以很好的支持 RabbitMQ,下面我们就来详细说说整合过程:
- 新建一个 Spring Boot 工程,命名为:“rabbitmq-hello”。
- 在 pom.xml 中引入如下依赖内容,其中 spring-boot-starter-amqp 用于支持 RabbitMQ。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- 在 application.properties 中配置关于 RabbitMQ 的连接和用户信息,用户可以回到上面的安装内容,在管理页面中创建用户。
spring.application.name=rabbitmq-hello
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=spring
spring.rabbitmq.password=123456
- 创建消息生产者 Sender。通过注入 AmqpTemplate 接口的实例来实现消息的发送,AmqpTemplate 接口定义了一套针对 AMQP 协议的基础操作。在 Spring Boot 中会根据配置来注入其具体实现。在该生产者,我们会产生一个字符串,并发送到名为 hello 的队列中。
@Component
public class Sender {
@Autowired
private AmqpTemplate rabbitTemplate;
public void send() {
String context = "hello " + new Date();
System.out.println("Sender : " + context);
this.rabbitTemplate.convertAndSend("hello", context);
}
}
- 创建消息消费者 Receiver。通过 @RabbitListener 注解定义该类对 hello 队列的监听,并用 @RabbitHandler 注解来指定对消息的处理方法。所以,该消费者实现了对 hello 队列的消费,消费操作为输出消息的字符串内容。
@Component
@RabbitListener(queues = "hello")
public class Receiver {
@RabbitHandler
public void process(String hello) {
System.out.println("Receiver : " + hello);
}
}
- 创建 RabbitMQ 的配置类 RabbitConfig,用来配置队列、交换器、路由等高级信息。这里我们以入门为主,先以最小化的配置来定义,以完成一个基本的生产和消费过程。
@Configuration
public class RabbitConfig {
@Bean
public Queue helloQueue() {
return new Queue("hello");
}
}
- 创建应用主类:
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
}
- 创建单元测试类,用来调用消息生产:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = HelloApplication.class)
public class HelloApplicationTests {
@Autowired
private Sender sender;
@Test
public void hello() throws Exception {
sender.send();
}
}
-
完成程序编写之后,下面开始尝试运行。首先确保 RabbitMQ Server 已经开始,然后进行下面的操作:
-
启动应用主类,从控制台中,我们看到如下内容,程序创建了一个访问 127.0.0.1:5672 中 springcloud 的连接。
o.s.a.r.c.CachingConnectionFactory : Created new connection: SimpleConnection@29836d32 [delegate=amqp://springcloud@127.0.0.1:5672/]
-
同时,我们通过 RabbitMQ 的控制面板,可以看到 Connection 和 Channels 中包含当前连接的条目。
-
运行单元测试类,我们可以看到控制台中输出下面的内容,消息被发送到了 RabbitMQ Server 的 hello 队列中。
Sender : hello Sun Sep 25 11:06:11 CST 2016
- 切换到应用主类的控制台,我们可以看到类似如下输出,消费者对 hello 队列的监听程序执行了,并输出了接受到的消息信息。
Receiver : hello Sun Sep 25 11:06:11 CST 2016
- 通过上面的示例,我们在 Spring Boot 应用中引入 spring-boot-starter-amqp 模块,进行简单配置就完成了对 RabbitMQ 的消息生产和消费的开发内容。然而在实际应用中,我们还有很多内容没有演示,这里不做更多的讲解,读者可以自行查阅 RabbitMQ 的官方教程,有更全面的了解。
完整示例:Chapter5-2-1
开源中国:http://git.oschina.net/didispace/SpringBoot-Learning/tree/master/Chapter5-2-1 GitHub:https://github.com/dyc87112/SpringBoot-Learning/tree/master/Chapter5-2-1
RabbitMQ 入门:在 Spring Boot 应用中整合 RabbitMQ
在上一篇随笔中我们认识并安装了 RabbitMQ,接下来我们来看下怎么在 Spring Boot 应用中整合 RabbitMQ。
先给出最终目录结构:
搭建步骤如下:
- 新建 maven 工程 amqp
- 修改 pom 文件,引入 spring-boot-starter-amqp 和 spring-boot-starter-test
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sam</groupId> <artifactId>amqp</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </parent> <properties> <javaVersion>1.8</javaVersion> </properties> <dependencies> <!-- 引入amqp依赖,它能很好的支持RabbitMQ --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <!-- 引入test依赖,这次需要用到JUnit --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> </dependencies> </project>
- 新建 application.properties 配置文件,主要就是配置下连接 RabbitMQ 的信息:
spring.application.name=rabbitmq-hello #config rabbitmq info spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest
- 新建启动类,这里没什么特殊的,就是普通的 spring boot 启动类
/** * 这里没什么特殊的地方,就是普通的spring boot 配置 * */ @SpringBootApplication public class RabbitMQApp { public static void main(String[] args) { SpringApplication.run(RabbitMQApp.class, args); } }
- 创建生产者类,通过 AmqpTemplate 实现消息的发送,AmqpTemplate 接口定义了一套针对 AMQP 协议的基础操作。在 Spring Boot 中会根据配置来注入具体的实现。这里我们会产生一个字符串,并发送到名为 hello 的队列中。
@Component public class Sender { @Autowired AmqpTemplate rabbitmqTemplate; /** * 发送消息 */ public void send() { String content = "Sender says:" + "''hello, I''m sender''"; System.out.println(content); rabbitmqTemplate.convertAndSend("hello", content); } }
- 创建消费者类,需要用到 @RabbitListener 来定义对 hello 队列的监听,并用 @RabbitHandler 注解来指定对消息处理的方法。我们这里实现了对 hello 队列的消费。
/** * 通过@RabbitListener对hello队列进行监听 * */ @Component @RabbitListener(queues="hello") public class Receiver { /** * 通过@RabbitHandler声明的方法,对hello队列中的消息进行处理 */ @RabbitHandler public void receiver(String str) { System.out.println("Receiver says:[" + str + "]"); } }
- 编写 RabbitMQ 的配置类,配置类可以配置队列、交换器、路由等高级信息。我们这里为了简单,只配置队列,其他的采用默认配置。
/** * rabbitmq配置类, * 为了简单,我们这里只配置了Queue * 至于exchanges、brokers等用的默认配置 * */ @Configuration public class RabbitConfig { @Bean public Queue helloQueue() { return new Queue("hello"); } }
- 编写测试类,用来调用消息生产者
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes=RabbitMQApp.class) public class HelloTest { @Autowired private Sender sender; /** * 调用生产者进行消息发送 */ @Test public void hello() throws Exception{ sender.send(); } }
- 运行启动类,启动后控制台会有下面的提示内容:
- 执行测试类,在测试类的控制台会打印我们打的 log 内容
切换到 amqp 应用的控制台,能看到打印:
在管理页面中我们能看到 Connections 和 Channels 中包含了当前连接的条目:
在整个生产和消费的过程中,生产和消费是一个异步操作,这是分布式系统中要使用消息代理的重要原因。
关于如何让Spring RabbitMQ创建一个新的队列?和rabbitmq添加队列的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于RabbitMQ (三) SpringBoot2.x 集成 RabbitMQ、rabbitmq 中有没有类似 redis 中 set 类型的队列?、RabbitMQ 入门 与 RabbitMQ 在 Spring Boot 中的使用、RabbitMQ 入门:在 Spring Boot 应用中整合 RabbitMQ的相关知识,请在本站寻找。
本文标签: