RabbitMQ-Java-01-简单队列

说明

  • RabbitMQ-Java-01-简单队列
  • 本案例是一个Maven项目
  • 官方文档已包含绝大多数本案例内容。请移步:https://docs.spring.io/spring-amqp/docs/current/reference/html/

操作步骤

》安装RabbitMQ

  • 可自行安装,也可参考我的相关教程(CentOS7离线安装RabbitMq),本章假设你已经安装好了RabbitMQ。

》搭建环境

  • idea创建一个空项目
  • 创建一个Maven管理的module
  • pom.xml添加插件:指定JDK编译版本(为了支持lambda表达式,如果不手动添加后期idea报错根据提示会自动添加好)
    <!-- 指定JDK编译版本 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>8</source>
            <target>8</target>
        </configuration>
    </plugin>
    
  • pom.xml添加依赖:RabbitMQ相关
    <!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
    <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>amqp-client</artifactId>
        <version>5.13.1</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.11.0</version>
    </dependency>
    
    

》简单案例

  • 说明
    • 我将代码分成三部分:初始化、消费者、生产者。多一层拆分思路更清晰明朗便于理解。
  • 代码组成
    • 初始化类:Initialization
      package cn.cnyasin.rabbit.hello;
      
      import com.rabbitmq.client.Channel;
      import com.rabbitmq.client.Connection;
      import com.rabbitmq.client.ConnectionFactory;
      
      /*
       * 初始化
       *  作用:
       *      创建交换机
       *      创建队列
       *      绑定队列、交换机、路由key
       */
      public class Initialization {
          // 交换机名
          public static final String EXCHANGE_NAME = "exchange01";
      
          // 队列名
          public static final String QUEUE_NAME = "queue01";
      
          // 路由key
          public static final String ROUTING_KEY = "routing01";
      
          public static void main(String[] args) throws Exception {
              // 创建连接工厂
              ConnectionFactory factory = new ConnectionFactory();
      
              // 配置
              factory.setHost("192.168.3.202");
              factory.setPort(5672);
              factory.setUsername("admin");
              factory.setPassword("123456");
              factory.setVirtualHost("/");
      
              // 获取连接
              Connection connection = factory.newConnection();
      
              // 获取信道
              Channel channel = connection.createChannel();
      
              // 声明交换机
              channel.exchangeDeclare(EXCHANGE_NAME, "direct", true);
      
              // 声明队列
              channel.queueDeclare(QUEUE_NAME, true, false, false, null);
      
              // 绑定队列、交换机、路由key
              channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
      
              connection.close();
      
              System.out.println("初始化成功。。。");
          }
      }
      
      
    • 消费者类:Consumer
      package cn.cnyasin.rabbit.hello;
      
      import com.rabbitmq.client.*;
      
      /*
       * 消费者
       *  消费者消费消息流程
       *      建立连接(connection)
       *      获取信道(channel)
       *      消费队列中的消息,自动应答
       *          接收消息回调方法
       *          拒绝消息回调方法
       */
      public class Consumer {
      
          // 队列名
          public static final String QUEUE_NAME = "queue01";
      
          public static void main(String[] args) throws Exception {
              // 创建连接工厂
              ConnectionFactory factory = new ConnectionFactory();
      
              factory.setHost("192.168.3.202");
              factory.setPort(5672);
              factory.setUsername("admin");
              factory.setPassword("123456");
              factory.setVirtualHost("/");
      
              // 创建连接
              Connection connection = factory.newConnection();
      
              // 获取信道
              Channel channel = connection.createChannel();
      
              // 消费队列中的消息
              channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
          }
      
          // 接收消息回调方法
          public static DeliverCallback deliverCallback = (String consumerTag, Delivery message) -> {
              System.out.println(" [*] 成功处理消息:" + new String(message.getBody()));
          };
      
          // 拒绝消息回调方法
          public static CancelCallback cancelCallback = (String consumerTag) -> {
              System.out.println("消费消息失败");
          };
      }
      
    • 生产者类:Producer
      package cn.cnyasin.rabbit.hello;
      
      import com.rabbitmq.client.Channel;
      import com.rabbitmq.client.Connection;
      import com.rabbitmq.client.ConnectionFactory;
      
      /*
       * 生产者
       *  发送消息流程:
       *      建立连接(connection)
       *      获取信道(channel)
       *      通过信道将消息发送到指定交换机(exchange),并绑定路由key(routingKey),路由key可以是多个
       *  注意:
       *      生产者不需要关心队列(queue)
       *      生产者发送消息前需要准备好:
       *          创建相关交换机
       *          创建相关队列
       *          绑定队列、交换机、路由key
       */
      public class Producer {
      
          // 交换机名
          public static final String EXCHANGE_NAME = "exchange01";
      
          // 路由key
          public static final String ROUTING_KEY = "routing01";
      
          public static void main(String[] args) throws Exception {
              // 创建连接工厂
              ConnectionFactory factory = new ConnectionFactory();
      
              // 配置信息
              factory.setHost("192.168.3.202");
              factory.setPort(5672);
              factory.setUsername("admin");
              factory.setPassword("123456");
              factory.setVirtualHost("/");
      
              // 创建连接
              Connection connection = factory.newConnection();
      
              // 获取信道
              Channel channel = connection.createChannel();
      
              // 发送消息
              channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, "hello.".getBytes());
      
              connection.close();
      
              System.out.println("消息发送成功。。。");
          }
      }
      
  • 运行初始化:Initialization -> main -> run
  • 运行消费者:Consumer -> main -> run
  • 运行生产者:Producer -> main -> run

备注

  • 该教程部分内容收集自网络,感谢原作者。

附录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 Spring Boot、RabbitMQ 和 WebSocket 结合的方式主要有以下几个步骤: 1. 创建 Spring Boot 项目,添加 RabbitMQ 和 WebSocket 的相关依赖。 2. 创建 RabbitMQ 队列和交换机,用于发送消息。 3. 创建 WebSocket 配置类,配置 WebSocket 的相关参数。 4. 创建 WebSocket 处理器类,处理 WebSocket 的连接、消息发送等操作。 5. 创建 RabbitMQ 消息监听器类,监听 RabbitMQ 队列中的消息,将消息发送给 WebSocket 处理器。 下面是具体的实现步骤: 1. 创建 Spring Boot 项目,添加 RabbitMQ 和 WebSocket 的相关依赖。 在 pom.xml 中添加以下依赖: ```xml <dependencies> <!-- RabbitMQ 相关依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <!-- WebSocket 相关依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> </dependencies> ``` 2. 创建 RabbitMQ 队列和交换机,用于发送消息。 在 RabbitMQ 中创建一个交换机和一个队列,然后将队列绑定到交换机上。这里我们使用 RabbitMQ 的默认交换机和队列。 ```java @Configuration public class RabbitMQConfig { @Bean public Queue queue() { return new Queue("websocket"); } @Bean public DirectExchange exchange() { return new DirectExchange(""); } @Bean public Binding binding(Queue queue, DirectExchange exchange) { return BindingBuilder.bind(queue).to(exchange).with("websocket"); } } ``` 3. 创建 WebSocket 配置类,配置 WebSocket 的相关参数。 ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic"); registry.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/websocket").setAllowedOrigins("*").withSockJS(); } } ``` 4. 创建 WebSocket 处理器类,处理 WebSocket 的连接、消息发送等操作。 ```java @Component public class WebSocketHandler implements WebSocketHandler { private static final Logger logger = LoggerFactory.getLogger(WebSocketHandler.class); private SimpMessagingTemplate messagingTemplate; @Autowired public WebSocketHandler(SimpMessagingTemplate messagingTemplate) { this.messagingTemplate = messagingTemplate; } @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { logger.info("WebSocket connected: {}", session.getId()); } @Override public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { logger.info("WebSocket received message: {}", message.getPayload()); } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { logger.error("WebSocket transport error: {}", exception.getMessage()); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { logger.info("WebSocket disconnected: {}", session.getId()); } @Override public boolean supportsPartialMessages() { return false; } public void sendMessage(String message) { messagingTemplate.convertAndSend("/topic/messages", message); } } ``` 5. 创建 RabbitMQ 消息监听器类,监听 RabbitMQ 队列中的消息,将消息发送给 WebSocket 处理器。 ```java @Component public class RabbitMQListener { private static final Logger logger = LoggerFactory.getLogger(RabbitMQListener.class); private WebSocketHandler webSocketHandler; @Autowired public RabbitMQListener(WebSocketHandler webSocketHandler) { this.webSocketHandler = webSocketHandler; } @RabbitListener(queues = "websocket") public void handleMessage(String message) { logger.info("RabbitMQ received message: {}", message); webSocketHandler.sendMessage(message); } } ``` 至此,Spring Boot、RabbitMQ 和 WebSocket 结合的实现就完成了。我们可以通过 RabbitMQ 发送消息到队列,然后监听器会将消息发送给 WebSocket 处理器,处理器再将消息发送给 WebSocket 客户端。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值