目录

1.环境配置

2.说明

3.服务启动

4.示例

导入依赖

配置文件

service层

配置类

监听器

5.总结


1.环境配置


下载地址: https://activemq.apache.org/components/classic/download /


安装:解压缩即可


注意每个版本对应的java版本不一样,需要根据服务器的java版本来下载对应的mq的版本





Windows上部署springboot_spring



在conf文件的路径下有个activemq.xml的配置文件,文件中的这个地址需要修改一下,改成127.0.0.1,这样安全性更高。端口号有冲突的也需要修改一下,或者kill掉占用的端口号。




Windows上部署springboot_java-activemq_02


2.说明


JMS ( Java Message Service ):一个规范,等同于 JDBC 规范,提供了与消息服务相关的 API 接口


JMS 消息模型


peer-2-peer :点对点模型 , 消息发送 到一个 队列中, 队列 保存消息。队列 的消息只能被一个消费者 消费,或超时


pub lish- sub scribe :发布 订阅模型,消息可以被多个消费者消费,生产者和消费者完全独立,不需要感知对方的 存在


ActiveMQ属于JMS类型的消息队列



3.服务启动



进入到安装目录下,这是我的安装目录,点击启动脚本完成启动。



D:\queue\apache-activemq-5.16.5\bin\win64



Windows上部署springboot_点对点_03


启动成功的场合

Windows上部署springboot_activemq_04

 可以通过 http://127.0.0.1:8161/进行到消息队列的管理界面,用户名和密码都是admin。

进入之后能够看到相应的队列信息。

Windows上部署springboot_spring_05

 queues代表点对点模式发送的消息,可以看到消费者信息,消息的信息。

topics代表发布订阅模式发送的消息,也可以看到消费者的信息,消息的信息。



4.示例

导入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>

配置文件

spring:
  activemq:
    broker-url: 127.0.0.1:61616
  jms:
    pub-sub-domain: true
    template:
      default-destination: orderInfoamation

 jms的配置,主要是设置消息的类型是点对点还是发布订阅模式,默认是点对点模式,将pub-sub-domain设置为true,则表示是发布订阅模式

default-destination表示设置一个默认的名字,用来存放消息,一般不用指定,可以在代码中进行设置

service层

package com.example.demo.activemq.impl;

import com.example.demo.activemq.ActivemqService;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service;

/**
 * @author linaibo
 * @version 1.0
 * Create by 2023/1/16 13:55
 */
@Service
public class ActivemqServiceImpl implements ActivemqService {

    @Autowired
    private JmsMessagingTemplate messagingTemplate;

    @Override
    public void sendMessage(String msg) {
        System.out.println("activemq发送topic消息:"+msg);
        ActiveMQTopic topic_test = new ActiveMQTopic("topic_test");
        messagingTemplate.convertAndSend(topic_test,msg);

        System.out.println("activemq发送queue消息:"+msg);
        ActiveMQQueue queue_test = new ActiveMQQueue("queue_test");
        messagingTemplate.convertAndSend(queue_test,msg);
    }
}

注入JmsMessagingTemplate对象之后,创建对应的发布消息的模式,进行消息的发布

配置类

package com.example.demo.activemq.config;


import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

import javax.jms.ConnectionFactory;

/**
 * @author linaibo
 * @version 1.0
 * Create by 2023/1/16 14:46
 */
@Component
public class activemqConfig {
    @Bean
    ConnectionFactory connectionFactory() {
        return new ActiveMQConnectionFactory();
    }

    @Bean
    JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
        JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
        jmsTemplate.setPriority(999);
        return jmsTemplate;
    }

    @Bean(value="jmsMessagingTemplate")
    JmsMessagingTemplate jmsMessagingTemplate(JmsTemplate jmsTemplate) {
        JmsMessagingTemplate messagingTemplate = new JmsMessagingTemplate(jmsTemplate);
        return messagingTemplate;
    }

    @Bean(name="queueListenerContainerFactory")
    public JmsListenerContainerFactory queueListenerContailerFactory(ConnectionFactory connectionFactory){
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setPubSubDomain(false);
        return factory;
    }
    @Bean(name="topicListenerContainerFactory")
    public JmsListenerContainerFactory topicListenerContainerFactory(ConnectionFactory connectionFactory){
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setPubSubDomain(true);
        return factory;
    }
}

配置类中,设置JmsMessagingTemplate以及队列和主题这两种消息模式。

监听器

package com.example.demo.activemq.listener;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

/**
 * @author linaibo
 * @version 1.0
 * Create by 2023/1/16 13:58
 */
@Component
public class ActivemqListener {

    @JmsListener(destination = "topic_test",containerFactory = "topicListenerContainerFactory")
    public void reciveTopic1(String msg) {
        System.out.println("接收到active的topic消息1:" + msg);
    }

    @JmsListener(destination = "topic_test",containerFactory = "topicListenerContainerFactory")
    public void reciveTopic2(String msg) {
        System.out.println("接收到active的topic消息2:" + msg);
    }

    @JmsListener(destination = "queue_test",containerFactory = "queueListenerContainerFactory")
    public void reciveQueue(String msg) {
        System.out.println("接收到active的queue消息:" + msg);
    }
}

监听器中要对destination及 containerFactory进行设置,通过消息名称和模式来进行监听。点对点模式,只有一个消费者能够消费消息,而发布订阅模式有多个消费者可以消费这一条消息。

5.总结

按照上面这种方式来进行消息的发布,可以进行点对点或者发布订阅模式的消息发送,如果在配置文件中指定了点对点或者发布订阅模式的时候,只能进行一种消息的发送。