SpringBoot学习之路---使用RabbitTemplate操作RabbitMq

在学习了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或者移动,删除它们。具体的操作可以查看它类上的方法命名去使用它们,这里不做介绍了。

  • 15
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
下面是一个简单的 Spring Boot + RabbitMQ + WebSocket 的实现,以注解方式完成: 1. 首先,需要在 pom.xml 中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2. 在 application.properties 中添加 RabbitMQ 和 WebSocket 的配置: ```properties # RabbitMQ配置 spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.rabbitmq.virtual-host=/ # WebSocket配置 server.port=8080 ``` 3. 创建一个 RabbitMQ 的配置类,用于定义交换机、队列、绑定等: ```java @Configuration public class RabbitMQConfig { @Bean public TopicExchange exchange() { return new TopicExchange("websocket-exchange"); } @Bean public Queue queue() { return new Queue("websocket-queue"); } @Bean public Binding binding() { return BindingBuilder.bind(queue()).to(exchange()).with("websocket.*"); } } ``` 4. 创建一个 RabbitMQ 消息发送者: ```java @Component public class RabbitMQSender { @Autowired private RabbitTemplate rabbitTemplate; public void send(String message) { rabbitTemplate.convertAndSend("websocket-exchange", "websocket.message", message); } } ``` 5. 创建一个 WebSocket 处理器,用于接收和发送消息: ```java @Component public class WebSocketHandler extends TextWebSocketHandler { private final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessions.add(session); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { sessions.remove(session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { String payload = message.getPayload(); sendMessage(payload); } public void sendMessage(String message) throws IOException { for (WebSocketSession session : sessions) { session.sendMessage(new TextMessage(message)); } } } ``` 6. 创建一个 RabbitMQ 消息接收者,用于将消息发送给 WebSocket 处理器: ```java @Component public class RabbitMQReceiver { @Autowired private WebSocketHandler webSocketHandler; @RabbitListener(queues = "websocket-queue") public void receive(String message) throws IOException { webSocketHandler.sendMessage(message); } } ``` 7. 最后,在控制器中定义一个 API,用于发送消息到 RabbitMQ: ```java @RestController public class MessageController { @Autowired private RabbitMQSender rabbitMQSender; @PostMapping("/send") public String sendMessage(@RequestBody String message) { rabbitMQSender.send(message); return "OK"; } } ``` 以上就是一个简单的 Spring Boot + RabbitMQ + WebSocket 的实现,可以通过发送 POST 请求到 /send 接口来发送消息,WebSocket 处理器会接收到消息并发送给所有连接的客户端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值