一、消息生产者环境搭建
1.创建SpringBoot的消息生产者工程,引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<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>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2.配置application.properties
spring.rabbitmq.addresses=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
3.定义一个发送消息服务的接口
public interface MQService {
void send();
}
4.接口的实现
@Slf4j
@Service
public class RabbitMQService implements MQService {
@Autowired
private AmqpTemplate amqpTemplate;
private Integer count = 1;
@Override
@Scheduled(fixedDelay = 3000) //每隔3秒自动发送一次消息
public void send( ) {
//使用amqpTemplate来发送消息
/**
* 参数1:交换机名称
* 参数2:routing-key
* 参数3:具体的消息内容
*/
amqpTemplate.convertAndSend("directExchange","direct-routing-key","测试消息" + count);
log.info("已发送信息: 测试消息" + count++ );
}
}
如果MQ服务器上没有相应的交换机和队列,则可以通过配置来创建队列和交换机以及绑定。
配置代码:
@Configuration
public class RabbitConfig {
/**
* 创建一个直连交换机
*/
@Bean
public DirectExchange directExchange(){
return new DirectExchange("directExchange");
}
/**
* 创建一个队列
*/
@Bean
public Queue queue(){
return new Queue("directQueue");
}
/**
* 将队列与交换机进行绑定
* 注意:如果想以参数的形式将队列绑定,则形参名必须要与某个@Bean方法的方法名一致
*/
@Bean
public Binding binding(Queue queue,DirectExchange directExchange){
//将一个队列通过routing-key绑定到交换机
return BindingBuilder.bind(queue).to(directExchange).with("direct-routing-key");
}
}
结构图:
二、消息消费者环境搭建
消息消费者的pom.xml依赖的application.properties中的配置是一样的,但是要修改端口,其他的直接复制即可。
1.创建一个接收的接口
public interface ReceiveService {
void receive(); //只能在调用方法的时候接收一次消息,无法监听
void receiveAsync(String message); //异步的方式监听消息
}
2.增加实现
@Slf4j
@Service
public class ReceiveServiceImpl implements ReceiveService{
@Autowired
private AmqpTemplate amqpTemplate;
@Override //只能通过调用方法接收一次,无法异步监听
public void receive() {
//监听某个队列
String message = (String) amqpTemplate.receiveAndConvert("directQueue");
System.out.println(message);
}
/**
* 异步监听 : 如果该方法没有发生异常,则会签收该消息
* 如果该方法抛出了异常,也spring不会签收该条消息
*/
@Override
@RabbitListener(queues = {"directQueue"}) //指定监听的队列
public void receiveAsync(String message) {
log.info("接收的消息:" + message);
}
}
结构图:
三、启动测试
启动生产者项目查看日志:
这里是以定时任务的方式每3秒发送一次消息的方式来推送消息的。
启动消费者项目查看日志:
可以发现,@RabbitListener注解是可以实现异步监听的。