SpringBoot整合ActiveMQ入门实践

目标

  • 编写并运行一个Demo直观看出ActiveMQ的效果

步骤

下载ActiveMQ

  • 下载地址:http://activemq.apache.org/components/classic/download/
    Linux下载后解压,进入bin目录后,执行“./activemq start”即可

  • 网站管理端口:8161
    broker端口:61616

构建SpringBoot项目

  • 必要依赖:
    spring-boot-starter-web
    spring-boot-starter-activemq

  • yml配置:

    • broker地址:spring.activemq.broker-url
      注意用tcp协议而非http协议
    • 账号:spring.activemq.user
      默认为admin
    • 密码:spring.activemq.password
      默认为admin

实现Queue和Topic的生产和消费

  • ActiveMQ下有队列Queue和主题Topic之分
    1 Queue是生产者/消费者的模式
    消息不会被重复消费,当发出消息时没有消费者时,消息也会保存在broker中,等到出现消费者时供其消费。
    2 Topic是发布/订阅的模式
    消息一旦发出会被当时存在的所有订阅者消费,当发出消息时没有消费者,消息不会保存。
  • 生产者
    1 对于Destination,Queue和Topic使用的类是有区别的。
    2 框架会根据yml中的服务器信息自动注入生成jmsMessagingTemplate。
@Service
public class Producer {
     

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    //Queue消息不能被重复消费 即使没有消费者 消息也会被保存
    public void sendQueueMessage(String queueName, String message){
     
        System.out.println("==========>>>>> Queue发送消息: " + message);
        Destination destination = new ActiveMQQueue(queueName);
        jmsMessagingTemplate.convertAndSend(destination, message);
    }

    //Topic消息会被所有订阅者消费 没有订阅者时 消息不会保存
    public void sengTopicMessage(String topicName, String message){
     
        System.out.println("==========>>>>> Topic发送消息: " + message);
        Destination destination = new ActiveMQTopic(topicName);
        jmsMessagingTemplate.convertAndSend(destination, message);
    }
}
  • 消费者
    1 为了让效果明显一些,我各创建了2个Queue消费者和2个Topic消费者。
    2 消费者方法名上要加注解@JmsListener,并配置好destination即可实现消费者的功能。
    3 ActiveMQ默认pub-sub-domain=false,即不支持Topic,只支持Queue。
    4 为了兼容支持Topic,需要对JmsListenerContainerFactory进行自定义配置。
    5 Topic消费方法的@JmsListener中的参数containerFactor即为需要自定义配置的项,其值jmsTopicListenerContainer是自定义的方法名字,这个名字随便起,具体配置在下方。
@Service
public class Customer {
     

    @JmsListener(destination = "test.queue")
    public void receiveQueueMessage1(String message){
     
        System.out.println("<<<<<========== Mary消费: " + message);
    }

    @JmsListener(destination = "test.queue")
    public void receiveQueueMessage2(String message){
     
        System.out.println("<<<<<========== Jmy消费: " + message);
    }

    //要配置containerFactory 值为@Bean的方法名
    //否则会走默认的配置 默认的只支持Queue 不支持Topic
    @JmsListener(destination = "test.topic", containerFactory = "jmsTopicListenerContainer")
    public void receiveTopicMessage1(String message){
     
        System.out.println("<<<<<========== Peggy消费: " + message);
    }

    @JmsListener(destination = "test.topic", containerFactory = "jmsTopicListenerContainer")
    public void receiveTopicMessage2(String message){
     
        System.out.println("<<<<<========== Hermione消费: " + message);
    }
}
  • ActiveMQ对于支持Topic的配置
    1 主要是为了让pub-sub-domain为true。
    2 方法参数ActiveMQConnectionFactory也是框架自动帮忙注入的,而且不用通过@Autowired这样的方式,就写成下边代码所示的那样就行。
    3 如果仅仅是下边的代码,启动时还是会报错,要额外在yml中配置spring.jms.cache.enabled=false。
@Configuration
public class ActiveMQConfig {
     

    //主要是配置PubSubDomain为true
    //参数connectionFactory的值是根据yml中的配置自动注入的
    //一定要在yml中配置spring.jms.cache.enabled = false
    @Bean
    public JmsListenerContainerFactory<?> jmsTopicListenerContainer(ActiveMQConnectionFactory connectionFactory){
     
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setPubSubDomain(true);
        factory.setConnectionFactory(connectionFactory);
        return factory;
    }
}

效果

  • 测试代码
@SpringBootTest
@RunWith(SpringRunner.class)
public class ActiveMQTest {
     

    @Autowired
    private Producer producer;

    @Test
    public void TestProcess(){
     
        for(int i = 1; i <= 10; i++){
     
            producer.sendQueueMessage("test.queue", "Queue Message: Q" + i);
            producer.sengTopicMessage("test.topic", "Topic Message: T" + i);
        }
    }

}
  • 效果
==========>>>>> Queue发送消息: Queue Message: Q1
<<<<<========== Jmy消费: Queue Message: Q1
==========>>>>> Topic发送消息: Topic Message: T1
<<<<<========== Hermione消费: Topic Message: T1
<<<<<========== Peggy消费: Topic Message: T1
==========>>>>> Queue发送消息: Queue Message: Q2
<<<<<========== Mary消费: Queue Message: Q2
==========>>>>> Topic发送消息: Topic Message: T2
<<<<<========== Hermione消费: Topic Message: T2
<<<<<========== Peggy消费: Topic Message: T2
==========>>>>> Queue发送消息: Queue Message: Q3
<<<<<========== Jmy消费: Queue Message: Q3
==========>>>>> Topic发送消息: Topic Message: T3
<<<<<========== Hermione消费: Topic Message: T3
<<<<<========== Peggy消费: Topic Message: T3
==========>>>>> Queue发送消息: Queue Message: Q4
<<<<<========== Mary消费: Queue Message: Q4
==========>>>>> Topic发送消息: Topic Message: T4
<<<<<========== Hermione消费: Topic Message: T4
<<<<<========== Peggy消费: Topic Message: T4
==========>>>>> Queue发送消息: Queue Message: Q5
<<<<<========== Jmy消费: Queue Message: Q5
==========>>>>> Topic发送消息: Topic Message: T5
<<<<<========== Hermione消费: Topic Message: T5
<<<<<========== Peggy消费: Topic Message: T5
==========>>>>> Queue发送消息: Queue Message: Q6
<<<<<========== Mary消费: Queue Message: Q6
==========>>>>> Topic发送消息: Topic Message: T6
<<<<<========== Hermione消费: Topic Message: T6
<<<<<========== Peggy消费: Topic Message: T6
==========>>>>> Queue发送消息: Queue Message: Q7
<<<<<========== Jmy消费: Queue Message: Q7
==========>>>>> Topic发送消息: Topic Message: T7
<<<<<========== Hermione消费: Topic Message: T7
<<<<<========== Peggy消费: Topic Message: T7
==========>>>>> Queue发送消息: Queue Message: Q8
<<<<<========== Mary消费: Queue Message: Q8
==========>>>>> Topic发送消息: Topic Message: T8
<<<<<========== Hermione消费: Topic Message: T8
<<<<<========== Peggy消费: Topic Message: T8
==========>>>>> Queue发送消息: Queue Message: Q9
<<<<<========== Jmy消费: Queue Message: Q9
==========>>>>> Topic发送消息: Topic Message: T9
<<<<<========== Peggy消费: Topic Message: T9
<<<<<========== Hermione消费: Topic Message: T9
==========>>>>> Queue发送消息: Queue Message: Q10
<<<<<========== Mary消费: Queue Message: Q10
==========>>>>> Topic发送消息: Topic Message: T10
<<<<<========== Hermione消费: Topic Message: T10
<<<<<========== Peggy消费: Topic Message: T10

你可能感兴趣的:(java)