在学习了RabbitMq之后,我们知道当打开RabbitMq服务时,访问15672
端口可以进入web管理界面,并且可以在里面操作,如发送消息,从某个队列中接受消息。但是我们平时在程序实际运行中,不可能一直手动地来完成这些操作(因为我们不知道什么时候需要发送接受消息,而且这样效率很低)。在基于消息队列的程序中,我们需要编写程序来完成从消息队列自动收发消息的操作,这一篇就来记录怎么使用java来完成这一操作
在此之前我们现在web管理界面创建好一些exchange
和queue
,并且绑定好它们之间的路由规则。
exchange
:
接着需要引入一个maven依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
引入之后就可以操作RabbitMq了,这里要介绍一个类RabbitTemplate
,顾名思义,这个类的作用和JdbcTemplate
、RedisTemplate
作用大致相同,只不过操作的是RabbitMq。接下来我们就要去使用它。
在我们引入maven相关依赖后,SpringBoot会自动帮我们注入RabbitTemplate
,在RabbitAutoConfiguration中可以看到相关源码:
@Bean //帮我们注入了该对象,可以直接使用
@ConditionalOnSingleCandidate(ConnectionFactory.class)
@ConditionalOnMissingBean({
RabbitOperations.class})
public RabbitTemplate rabbitTemplate(RabbitProperties properties, ObjectProvider<MessageConverter> messageConverter, ObjectProvider<RabbitRetryTemplateCustomizer> retryTemplateCustomizers, ConnectionFactory connectionFactory) {
在测试类中编写方法进行测试:
@SpringBootTest
class SpringRabbitmqApplicationTests {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
void contextLoads() {
rabbitTemplate.convertAndSend("exchange.direct","leslie",new User("leslie","1234567"));
}
}
rabbitTemplate的convertAndSend()
方法可以给指定队列发送消息,函数有三个参数,第一个是**交换机(exchange)的名字,第二个是路由键(routing-key)**的名字,第三个则为消息的内容。 我们这里给名叫exchange.direct的交换机发送一个User对象,其中路由键为leslie
,因为交换机类型是direct
,所以是点对点的消息队列,只会发送到名叫leslie
的队列中,运行程序,去web管理界面查看是否发送成功:
可以看到消息以及发送成功了,只不过它把我们消息的内容序列化了,这里因为它默认使用的还是jdk的序列化,和之前介绍redis
时一样,我们需要把它的默认序列化器更改为json类型的序列化器(可以翻看以前的博客)。
这里直接说方法,直接编写一个配置类,并往容器内注入MessageConverter
接口的实现类对象:
@Configuration
public class RabbitMqConfiguration {
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
其中返回的Jackson2JsonMessageConverter
其实就是我们需要的json类型的序列化器,当容器中有MessageConverter
类型的组件时,SpringBoot就会调用我们自己编写的序列化器了,接着在运行一次,在web管理界面查看消息:
可以看到以及成功转为json类型的数据了,这样观看更加直观。
接着介绍RabbitTemplate
的另外一个方法,我们说完发消息,那肯定需要一个取消息了,receiveAndConvert()
方法用来取消息,里面有一个参数是队列(queue)的名字,表示要从那个队列中取数据
在测试方法的后面加上:
Object leslie = rabbitTemplate.receiveAndConvert("leslie");
System.out.println(leslie);
它的返回值是object类型的,当然也可以强转,这里就省略了,我们看看运行,看看控制台是否有显示:
可以看到操作成功.
在导入maven相关依赖后,它不仅帮我们注入了RabbitTemplate
对象用来操作RabbitMq发送接受消息,还帮我们注入了AcmqAdmin
对象用来管理RabbitMq,它的作用是创建一些exchange
、queue
或者移动,删除它们。具体的操作可以查看它类上的方法命名去使用它们,这里不做介绍了。