SpringBoot整合ActiveMQ入门实践

java1234

共 1942字,需浏览 4分钟

 ·

2020-09-23 18:28

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

66套java从入门到精通实战课程分享

目标

  • 编写并运行一个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


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:

http://blog.csdn.net/m0_37676106/article/details/108683244




粉丝福利:108本java从入门到大神精选电子书领取

???

?长按上方锋哥微信二维码 2 秒
备注「1234」即可获取资料以及
可以进入java1234官方微信群



感谢点赞支持下哈 

浏览 18
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报