《消息中间件实战篇一》springboot整合activeMQ

笔者最近负责部门的招聘面试,最近在boss上查看很多候选人的简历都有各类mq的使用经。但是面试过程中缺发现很多人都是没有实战经验随意写上去的,这显然是过不了面试的。抛开底层架构和原理不说,其实消息中间件的使用还是很简单的。

接下来的一段时间笔者将会对常用的几大消息中间件,比如RocketMQ、ActiveMQ、RabbitMQ、Kafka等一系列都做下介绍,希望能够帮助大家更快接触和学习使用

现如今微服务普遍推广的年代,分布式系统中消息中间件的运用也越来越重要,那么今天就让我们来了解下ActiveMQ吧 
  • 首先什么是ActiveMQ呢?

    activeMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提>>供高效的、可扩展的、稳定的和安全的企业级消息通信。
    MOM的总体思想是它作为消息发送器和接收器之间的消息中介,具体来说是一个实现了JMS规范的系统间远程通信的消息代理。

  • 名词解释

    Provider:纯 Java 语言编写的 JMS 接口实现(比如 ActiveMQ 就是)
    Domains:消息传递方式,包括点对点(P2P)、发布/订阅(Pub/Sub)两种
    Connection factory:客户端使用连接工厂来创建与 JMS provider 的连接
    Destination:消息被寻址、发送以及接收的对象

  • activeMQ的作用和原理

    作用
    异步处理、数据同步、流量削峰、缓冲、限流等
    原理
    生产者生产消息发送给activemq
    activemq 接收到消息然后查看有多少个消费者,
    然后把消息转发给消费者,此过程中生产者无需参与
    消费者接收到消息后做相应的处理和生产者没有任何关系

  • activemq的几种通信方式

    publish(发布)-subscribe(订阅)(发布-订阅方式)
    发布/订阅方式用于多接收客户端的方式.作为发布订阅的方式,
    可能存在多个接收客户端,并且接收端客户端与发送客户端存在时间上的依赖
    一个接收端只能接收他创建以后发送客户端发送的信息
    作为subscriber ,在接收消息时有两种方法,
    destination的receive方法,和实现message listener 接口的onMessage方法

  • 如何使用activeMQ?首选注入依赖
    ps:笔者当前springboot版本为2.2.0RELEASE

<dependencies>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
  </dependency>
    
  <dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-pool</artifactId>
    <version>5.15.5</version>
  </dependency>

</dependencies>

  • 项目架构图如下
    在这里插入图片描述

  • 编写MQ的配置类,这里我们声明queue和topic类型的bean

/**
 * @description:  ActiveMQConfig
 * @author: elegant
 * @date: 2020/5/8
 */
@Configuration
public class ActiveMQConfig {

    public static final String ACTIVE_QUEUE = "queue_test";
    public static final String ACTIVE_TOPIC = "topic_test";


    @Bean(name="queue")
    public Destination getQueue(){
        return new ActiveMQQueue(ACTIVE_QUEUE);
    }

    @Bean(name="topic")
    public Destination getTopic(){
        return new ActiveMQTopic(ACTIVE_TOPIC);
    }

    @Bean
    public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory activeMQConnectionFactory) {
        DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
        bean.setPubSubDomain(true);
        bean.setConnectionFactory(activeMQConnectionFactory);
        return bean;
    }
}


  • MQ的生产者
/**
 * @description:  activeMQ生产者
 * @author: elegant
 * @date: 2020/5/8
 */
@Component
public class ActiveMQProducer {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Resource(name="queue")
    private Destination queue;
    @Autowired
    @Qualifier(value="topic")
    private Destination topic;

    /**
     * ActiveMQConfig
     * @param destination
     * @param message
     */
    public void sendMessage(Destination destination, final String message) {
        jmsMessagingTemplate.convertAndSend(destination, message);
    }

    /**
     * sendQueueMessage
     * @param message
     */
    public void sendQueueMessage(final String message) {
        jmsMessagingTemplate.convertAndSend(queue, message);
    }

    /**
     * sendTopicMessage
     * @param message
     */
    public void sendTopicMessage(final String message) {
        jmsMessagingTemplate.convertAndSend(topic, message);
    }


  • MQ的消费端
/**
 * @description:  ActiveMQ消费者
 * @author: elegant
 * @date: 2020/5/8
 */
@Component
public class ActiveMQConsumer {

    //接收queue消息
    //如果只指定destination那么只会监听queue中的队列的
    @JmsListener(destination = ActiveMQConfig.ACTIVE_QUEUE)
    public void handler(String message){
        System.out.println("接收queue消息成功");
        System.out.println(message);
    }

    //配置多实例消费

    //接收topic消息
    @JmsListener(destination = ActiveMQConfig.ACTIVE_TOPIC, containerFactory = "jmsListenerContainerTopic")
    public void handlerTopic(String msessage){
        System.out.println("接收topic消息成功");
        System.out.println(msessage);
    }
    //接收topic消息
    @JmsListener(destination = ActiveMQConfig.ACTIVE_TOPIC, containerFactory = "jmsListenerContainerTopic")
    public void handlerTopic1(String msessage){
        System.out.println("接收topic1消息成功");
        System.out.println(msessage);
    }
}

  • 测试我们的代码
/**
 * @description:  activemq测试
 * @author: elegant
 * @date: 2020/5/8
 */
@Slf4j
@RestController
public class ActiveMQController {

    @Autowired
    private ActiveMQProducer activeMQProducer;

    @RequestMapping("/send")
    public void sendQueue(){
        log.info("test activemq send message start");
        activeMQProducer.sendQueueMessage("发送Queue消息");
        activeMQProducer.sendTopicMessage("发送Topic消息");
        log.info("test activemq send message end ");
    }
}

  • 启动我们的应用效果如图
    在这里插入图片描述
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值