废话不多说直接开始
第一步:
首先是下载RabbitMQ的二进制包,在这里只提供mac系统的下载方式,其他系统网上教程有很多,在这里我只针对mac安装
brew更新到最新版本,执行:brew update
安装Erlang,执行:brew install erlang
安装RabbitMQ Server,执行:brew install rabbitmq
通过上面的命令,RabbitMQ Server的命令会被安装到/usr/local/sbin,
并不会自动加到用户的环境变量中去,所以我们需要在.bash_profile或.profile文件中增加下面内容:
PATH=$PATH:/usr/local/sbin
source ~/.bash_profile //是配置生效
这样,我们就可以通过rabbitmq-server命令来启动RabbitMQ的服务端了。
启动之后可以在浏览器中输入localhost:15672默认的登录名和密码都是guest,当看到以下界面表示启动成功
org.springframework.boot
spring-boot-starter-amqp
org.springframework.boot
spring-boot-starter-test
test
2.在application.properties中配置RabbitMQ的连接信息
spring.application.name=rabbitmq-hello
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=liguohui
spring.rabbitmq.password=liguohui
3.创建第一个消息生产者,做消息的发送:
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 通过注入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);
rabbitTemplate.convertAndSend("hello",context);
}
}
4.创建第一个消息消费者
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* 创建消息消费者Receiver。
* 通过@RabbitListener注解定义该类对hello队列的监听,
* 并用@RabbitHandler注解来指定对消息的处理方法。
* 所以,该消费者实现了对hello队列的消费,消费操作为输出消息的字符串内容
*/
@Component
@RabbitListener(queues = "hello") //监听消息队列hello
public class Receiver {
@RabbitHandler //指定对消息的处理方法,处理方法就是输出消息的字符串内容.
public void process(String hello){
System.out.println("Receiver : " + hello);
}
}
5.创建RabbitMQ的配置类RabbitConfig
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 创建RabbitMQ的配置类RabbitConfig,
* 用来配置队列、交换器、路由等高级信息。
* 这里我们以入门为主,先以最小化的配置来定义,以完成一个基本的生产和消费过程。
*/
@Configuration
public class RabbitConfig {
@Bean
public Queue helloQueue(){
return new Queue("hello");
}
}
6.接下来就是创建测试类:
import com.alibaba.rabbitmq.RabbitmqHelloApplication;
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.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = RabbitmqHelloApplication.class) //加载主类
public class HelloApplicationTests {
@Autowired
private Sender sender;
@Test
public void hello() throws Exception{
sender.send();
}
}
7.可能出现的错误:
Caused by:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No
qualifying bean of type ‘com.alibaba.sender.Sender’ available:
expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations:
{@org.springframework.beans.factory.annotation.Autowired(required=true)}
出现这种错误的原因就是,虽然你在测试类中已经加载了启动类,但是启动类和你注入的类不在同一个包中,所以需要在启动类进行包扫描,只需要在启动类上加上下面这句换就好了
@ComponentScan(basePackages = "com.alibaba") //因为启动类和其他类不在同一个包中,因此想要加载的话需要进行包扫描
8.测试:
启动启动类,然后运行hello测试方法,在该控制台中打印如下表示消息生产者已经产生了一个消息:
Sender : hello Tue Sep 11 11:36:05 CST 2018
同时控制台也打印出了监听队列的结果:
Receiver : hello Tue Sep 11 11:36:05 CST 2018