相关依赖

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.7.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.springframework.amqp</groupId>
  <artifactId>spring-rabbit</artifactId>
  <version>2.1.6.RELEASE</version>
</dependency>

常见工作模式示例

简单模式/工作队列模式

生产者

  • rabbitmq.properties

    rabbitmq.host=127.0.0.1
    rabbitmq.port=5672
    rabbitmq.username=heoller
    rabbitmq.password=heoller
    rabbitmq.virtual.host=spring-study
  • spring-rabbitmq-producer.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:rabbit="http://www.springframework.org/schema/rabbit"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
    
    <!-- 引入属性文件  -->
    <context:property-placeholder location="classpath:rabbitmq.properties" />
    <!-- 连接工厂 -->
    <rabbit:connection-factory id="connectionFactory"
      host="${rabbitmq.host}"
      port="${rabbitmq.port}"
      username="${rabbitmq.username}"
      password="${rabbitmq.password}"
      virtual-host="${rabbitmq.virtual.host}"
    />
    <!-- 用于管理声明的队列和交换机 -->
    <rabbit:admin id="admin" connection-factory="connectionFactory" />
    
    <!-- 简单模式/工作队列模式下的queue信息  -->
    <rabbit:queue id="spring-simple-queue" name="spring-simple-queue" auto-declare="true" />
    
    <!-- 广播(pub/sub)模式 -->
    <rabbit:queue id="spring-fanout-queue-a" name="spring-fanout-queue-a" auto-declare="true" />
    <rabbit:queue id="spring-fanout-queue-b" name="spring-fanout-queue-b" auto-declare="true" />
    <rabbit:fanout-exchange id="spring-fanout-exchange" name="spring-fanout-exchange">
      <rabbit:bindings>
        <rabbit:binding queue="spring-fanout-queue-a" />
        <rabbit:binding queue="spring-fanout-queue-b" />
      </rabbit:bindings>
    </rabbit:fanout-exchange>
    
    <!-- 路由(routing)模式 -->
    <rabbit:queue id="spring-direct-queue-a" name="spring-direct-queue-a" auto-declare="true" />
    <rabbit:queue id="spring-direct-queue-b" name="spring-direct-queue-b" auto-declare="true" />
    <rabbit:direct-exchange id="spring-direct-exchange" name="spring-direct-exchange">
      <rabbit:bindings>
        <rabbit:binding queue="spring-direct-queue-a" key="com.heoller" />
        <rabbit:binding queue="spring-direct-queue-b" key="cn.heoller" />
      </rabbit:bindings>
    </rabbit:direct-exchange>
    
    <!-- 主题(topic)模式 -->
    <rabbit:queue id="spring-topic-queue-a" name="spring-topic-queue-a" auto-declare="true" />
    <rabbit:queue id="spring-topic-queue-b" name="spring-topic-queue-b" auto-declare="true" />
    <rabbit:topic-exchange id="spring-topic-exchange" name="spring-topic-exchange">
      <rabbit:bindings>
        <rabbit:binding pattern="*.heoller" queue="spring-topic-queue-a" />
        <rabbit:binding pattern="cn.#" queue="spring-topic-queue-b" />
      </rabbit:bindings>
    </rabbit:topic-exchange>
    
    <!-- 使用template对象发布消息 -->
    <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" />
    </beans>
  • Producer.java

    public class Producer {
    
      public static void main(String[] args) {
          ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
              "classpath:spring-rabbitmq-producer.xml");
    
          RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);
          // 生产消息
          rabbitTemplate.convertAndSend("spring-simple-queue", "hello world");
      }
    }

    消费者

  • spring-rabbitmq-simple-consumer.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:rabbit="http://www.springframework.org/schema/rabbit"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
    
    <!-- 引入属性文件  -->
    <context:property-placeholder location="classpath:rabbitmq.properties" />
    <!-- 连接工厂 -->
    <rabbit:connection-factory id="connectionFactory"
      host="${rabbitmq.host}"
      port="${rabbitmq.port}"
      username="${rabbitmq.username}"
      password="${rabbitmq.password}"
      virtual-host="${rabbitmq.virtual.host}"
    />
    
    <bean id="simpleListener" name="simpleListener" class="com.heoller.simple.SimpleListener" />
    
    <rabbit:listener-container connection-factory="connectionFactory">
      <rabbit:listener ref="simpleListener" queue-names="spring-simple-queue" />
    </rabbit:listener-container>
    </beans>
  • SimpleListener.java

    public class SimpleListener implements MessageListener {
    
      @Override
      public void onMessage(Message message) {
          System.out.println("简单模式:" + message);
      }
    }
  • Consumer.java

    public class Consumer {
    
      public static void main(String[] args) {
          new ClassPathXmlApplicationContext("classpath:spring-rabbitmq-simple-consumer.xml");
      }
    }

    广播(发布订阅)模式

    生产者

  • 相关配置同简单模式

  • Producer.java

    public class Producer {
    
      public static void main(String[] args) {
          RabbitTemplate rabbitTemplate = AutowiredRabbitTemplate.getRabbitTemplate();
    
          for (int i = 0; i < 10; i++) {
              rabbitTemplate.convertAndSend("spring-fanout-exchange", "", "this is fanout message " + i);
          }
      }
    }

    消费者

  • spring-rabbitmq-fanout-consumer.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:rabbit="http://www.springframework.org/schema/rabbit"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
    
    <!-- 引入属性文件  -->
    <context:property-placeholder location="classpath:rabbitmq.properties" />
    <!-- 连接工厂 -->
    <rabbit:connection-factory id="connectionFactory"
      host="${rabbitmq.host}"
      port="${rabbitmq.port}"
      username="${rabbitmq.username}"
      password="${rabbitmq.password}"
      virtual-host="${rabbitmq.virtual.host}"
    />
    
    <bean id="fanoutListenerA" name="fanoutListenerA" class="com.heoller.fanout.FanoutListenerA" />
    <bean id="fanoutListenerB" name="fanoutListenerB" class="com.heoller.fanout.FanoutListenerB" />
    
    <rabbit:listener-container connection-factory="connectionFactory">
      <rabbit:listener ref="fanoutListenerA" queue-names="spring-fanout-queue-a" />
      <rabbit:listener ref="fanoutListenerB" queue-names="spring-fanout-queue-b" />
    </rabbit:listener-container>
    </beans>
  • FanoutListenerA.java

    public class FanoutListenerA implements MessageListener {
    
      @Override
      public void onMessage(Message message) {
          System.out.println("广播模式(A):" + message);
      }
    }
  • FanoutListenerB.java

    public class FanoutListenerB implements MessageListener {
    
      @Override
      public void onMessage(Message message) {
          System.out.println("广播模式(B):" + message);
      }
    }
  • Consumer.java

    public class Consumer {
    
      public static void main(String[] args) {
          new ClassPathXmlApplicationContext("classpath:spring-rabbitmq-fanout-consumer.xml");
      }
    }

    路由模式

    生产者

  • 同上面的两种模式的区别点

    rabbitTemplate.convertAndSend("spring-direct-exchange", "com.heoller", "this is direct message");

    消费者

    同上,配置相关Listener即可

    主题模式

    生产者

  • 同上面的两种模式的区别点

    rabbitTemplate.convertAndSend("spring-topic-exchange", "#.heoller", "this is topic message");
    rabbitTemplate.convertAndSend("spring-topic-exchange", "cn.*", "this is topic message");

    消费者

    同上,配置相关Listener即可