在学习了RabbitMq之后,我们知道当打开RabbitMq服务时,访问15672端口可以进入web管理界面,并且可以在里面操作,如发送消息,从某个队列中接受消息。但是我们平时在程序实际运行中,不可能一直手动地来完成这些操作(因为我们不知道什么时候需要发送接受消息,而且这样效率很低)。在基于消息队列的程序中,我们需要编写程序来完成从消息队列自动收发消息的操作,这一篇就来记录怎么使用java来完成这一操作


在此之前我们现在web管理界面创建好一些exchangequeue,并且绑定好它们之间的路由规则。

exchange:

在这里插入图片描述
queue:

在这里插入图片描述
绑定规则这里略。

接着需要引入一个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,顾名思义,这个类的作用和JdbcTemplateRedisTemplate作用大致相同,只不过操作的是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,它的作用是创建一些exchangequeue或者移动,删除它们。具体的操作可以查看它类上的方法命名去使用它们,这里不做介绍了。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐