ActiveMQ学习总结——相关集成

ActiveMQ集成

一、ActiveMQ集成Spring

1. 创建项目

在这里插入图片描述

2. 配置POM

	<properties>
        <activemq.version>5.15.5</activemq.version>
        <slf4j.version>1.7.25</slf4j.version>
        <lombok.version>1.16.20</lombok.version>
        <spring.version>4.3.29.RELEASE</spring.version>
    </properties>
    <dependencies>
        <!--        ActiveMQ配置-->
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>${activemq.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-pool</artifactId>
            <version>${activemq.version}</version>
        </dependency>
        <!--        jms-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--        slf4j通用配置-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <!--        lombok配置-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
    </dependencies>

3. 队列模式(Queue)

3.1 创建application-queue.xml

在这里插入图片描述

3.2 配置连接工厂
<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
    <property name="connectionFactory">
        <bean class="org.apache.activemq.ActiveMQConnectionFactory">
            <property name="brokerURL" value="tcp://**.**.**.**:61616"/>
        </bean>
    </property>
    <!-- 最大连接数 -->
    <property name="maxConnections" value="100"/>
</bean>
3.3 配置目的地
<bean id="destinationQueue" class="org.apache.activemq.command.ActiveMQQueue">
    <!--   使用构造方法的参数注入队列名称     -->
    <constructor-arg index="0" value="MQ-Queue"/>
</bean>
3.4 配置操作MQ对象的jmsTemplate
<bean id="JmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <!-- 注入工厂-->
    <property name="connectionFactory" ref="jmsFactory" />
    <!-- 注入消息发送的默认目的地-->
    <property name="defaultDestination" ref="destinationQueue" />
    <!--  消息转换器-->
    <property name="messageConverter">
        <bean lass="org.springframework.jms.support.converter.SimpleMessageConverter" />
    </property>
</bean>
3.5 生产者
public class QueueProducer {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application-queue.xml");
        JmsTemplate jmsTemplate= context.getBean(JmsTemplate.class);
//        发消息(发送到默认的目的地)
        jmsTemplate.send(new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
//                创建消息
                TextMessage message = session.createTextMessage("MQ-Spring-Queue");
                message.setStringProperty("String","StringProperty");
                return message;
            }
        });
        System.out.println("发送成功!");
    }
}
3.6 消费者
public class QueueConsumer {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application-queue.xml");
        JmsTemplate jmsTemplate= context.getBean(JmsTemplate.class);
        try {
// 如果不设置目的地,迷人监听的是默认的目的地 -jmsTemplate.receive(destination)->监听指定目的地
            TextMessage message = (TextMessage) jmsTemplate.receive();
            System.out.println("接收消息: "+message.getText()+" "+message.getStringProperty("String"));
        } catch (JMSException e) {
            e.printStackTrace();
        }
        /* 消息转换器接收
        Object o = jmsTemplate.receiveAndConvert();
        System.out.println(o);
         */
    }
}

4.主题/订阅模式(Topic)

4.1 修改目的地配置
<bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic">
    <!--   使用构造方法的参数注入队列名称     -->
    <constructor-arg index="0" value="MQ-Topic"/>
</bean>
4.2 修改操作jmsTemplate对象配置
<bean id="JmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <!-- 注入工厂-->
    <property name="connectionFactory" ref="jmsFactory" />
    <!-- 注入消息发送的默认目的地-->
    <property name="defaultDestination" ref="destinationTopic" />
    <!--  消息转换器-->
    <property name="messageConverter">
        <bean lass="org.springframework.jms.support.converter.SimpleMessageConverter" />
    </property>
</bean>

5.监听器模式

5.1 创建Listener并集成MessageListener接口
// 监听器相当于消费者
public class ListenerHandler implements MessageListener {
    public void onMessage(Message message) {
        if (message instanceof TextMessage){
            try {
                System.out.println("监听器收到:"+((TextMessage) message).getText());
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
}
5.2 配置监听器对象
<bean id="listener" class="com.csl.listener.ListenerHandler" />
5.3 配置监听器容器
<bean id="queueListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="jmsFactory" />
    <property name="destination" ref="destinationQueue" />
    <property name="messageListener" ref="listener" />
</bean>

二、ActiveMQ集成SpringBoot

1. 创建项目

在这里插入图片描述

重点:

  • 在主程序上添加@EnableJms注解,即ActivemqSpringApplication
  • 添加@EnableScheduling注解,即开启延时

2. 配置POM

<dependencies>
<!--        mq-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-activemq</artifactId>
    </dependency>
<!--        devtools-热部署-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
<!--         configuration -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
<!--        lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
<!--        test-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

3. 队列模式(Queue)

3.1 配置application.yaml
spring:
  activemq:
    broker-url: tcp://**.**.**.**:61616
    user: admin
    password: admin
    pool:
      max-connections: 100
  jms:
    pub-sub-domain: false #false代表队列,true代表主题
#声明队列的名称
queue: activemq-boot-queue #@Value()
3.2 配置队列
@Component
public class QueueConfig {
    @Value("${queue}")
    private String queue;
    @Bean
    public Queue queue(){
        return new ActiveMQQueue(queue);
    }
}
3.3 生产者
@Component
public class QueueProducer {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Autowired
    private Queue queue;

    @SuppressWarnings("deprecation")
    public void produceMsg(){
        jmsMessagingTemplate.convertAndSend(queue,"Queue-message==="+new Date().toString());
    }

    Integer i;
    /**
     * 延时发送
     */
    @SuppressWarnings("deprecation")
    @Scheduled(fixedDelay = 5000)
    public void producerMsgScheduled(){
        jmsMessagingTemplate.convertAndSend(queue,"****Queue-Scheduled***"+i++);
    }
}
3.4 消费者
@Service
public class QueueConsumer {

    @JmsListener(destination = "${queue}")
    public void receive(TextMessage message) throws JMSException {
        System.out.println("接收消息:"+message.getText());
    }
}

监听到的延时发送的消息结果为
在这里插入图片描述

4. 主题模式(Topic)

4.1修改application.yaml
	jms:
    	pub-sub-domain: true #false代表队列,true代表主题
#声明主题的名称
topic: activemq-boot-topic #@Value()
4.2 配置主题
@Component
public class TopicConfig {
    @Value("${topic}")
    private String topic;
    @Bean
    public Topic topic(){
        return new ActiveMQTopic(topic);
    }
}
4.3 生产者
@Component
public class TopicProducer {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Autowired
    private Topic topic;
    @SuppressWarnings("deprecation")
    public void produceMsg(){
//        设置主题发送方式
        jmsMessagingTemplate.getJmsTemplate().setPubSubDomain(true);
        jmsMessagingTemplate.convertAndSend(topic,"Topic-message==="+new Date().toString());
    }

    Integer i=0;

    /**
     * 延时发送
     */
    @SuppressWarnings("deprecation")
    @Scheduled(fixedDelay = 5000)
    public void producerMsgScheduled(){
        jmsMessagingTemplate.getJmsTemplate().setPubSubDomain(true);
        jmsMessagingTemplate.convertAndSend(topic,"****Topic-Scheduled***"+i++);
    }
}
4.4 消费者
@Service
public class TopicConsumer {
    @JmsListener(destination = "${topic}")
    public void receive(TextMessage message) throws JMSException {
        System.out.println("接收消息:"+message.getText());
    }
}

监听到的延时发送的消息结果为
在这里插入图片描述

三、分布式集成(Web充当发送者及同时监听多个队列和主题)

1. 创建项目

在这里插入图片描述

2. 添加依赖

<properties>
        <activemq.version>2.3.5.RELEASE</activemq.version>
        <java.version>1.8</java.version>
        <lombok.version>1.18.16</lombok.version>
    </properties>

    <dependencies>
        <!--        mq-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
            <version>${activemq.version}</version>
        </dependency>

        <!--        devtools-热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <version>${activemq.version}</version>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <!--         configuration -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>${activemq.version}</version>
            <optional>true</optional>
        </dependency>
        <!--        lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <optional>true</optional>
        </dependency>
        <!--        test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>${activemq.version}</version>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

3. 创建子项目-生产者(ActiveMQ-Producer)

在这里插入图片描述

重点:在主程序添加@EnableJms注解

3.1 导入父项目的依赖并添加Web模块的依赖
<parent>
    <artifactId>ActiveMQ-Parent</artifactId>
    <groupId>org.example</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.3.5.RELEASE</version>
    </dependency>
</dependencies>
3.2 配置application.yaml
spring:
  activemq:
    broker-url: tcp://**.**.**.**:61616
    user: admin
    password: admin
    pool:
      max-connections: 100
  jms:
    pub-sub-domain: false
3.3 Controller发送消息队列和主题
@RestController
@RequestMapping("/send")
public class ProducerController {

    @Autowired
    private JmsTemplate jmsTemplate;

    /**
     * 发送队列1
     * @return 返回成功信息
     */
    @RequestMapping("/sendQueue1")
    public Map<String,Object> sendQueue1(){
        Map<String,Object> map = new HashMap<String, Object>(12);
        jmsTemplate.setDefaultDestination(new ActiveMQQueue("queue-1"));
        jmsTemplate.send(new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                TextMessage message = session.createTextMessage("queue1-producer-msg");
                return message;
            }
        });
        map.put("success","发送成功!");
        return map;
    }

    /**
     * 发送队列2
     * @return 返回成功信息
     */
    @RequestMapping("/sendQueue2")
    public Map<String,Object> sendQueue2(){
        Map<String,Object> map = new HashMap<String, Object>(12);
        jmsTemplate.setDefaultDestination(new ActiveMQQueue("queue-2"));
        jmsTemplate.send(new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                TextMessage message = session.createTextMessage("queue2-producer-msg");
                return message;
            }
        });
        map.put("success","发送成功!");
        return map;
    }

    /**
     * 发送主题1
     * @return 返回成功信息
     */
    @RequestMapping("/sendTopic1")
    public Map<String,Object> sendTopic1(){
        Map<String,Object> map = new HashMap<String, Object>(12);
        jmsTemplate.setDefaultDestination(new ActiveMQTopic("topic-1"));
        jmsTemplate.send(new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                TextMessage message = session.createTextMessage("topic1-producer-msg");
                return message;
            }
        });
        map.put("success","发送成功!");
        return map;
    }

    /**
     * 发送主题2
     * @return 返回成功信息
     */
    @RequestMapping("/sendTopic2")
    public Map<String,Object> sendTopic2(){
        Map<String,Object> map = new HashMap<String, Object>(12);
        jmsTemplate.setDefaultDestination(new ActiveMQTopic("topic-2"));
        jmsTemplate.send(new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                TextMessage message = session.createTextMessage("topic2-producer-msg");
                return message;
            }
        });
        map.put("success","发送成功!");
        return map;
    }
}

4. 创建子项目-消费者(ActiveMQ-Consumer)

在这里插入图片描述

重点:在主程序添加@EnableJms注解

4.1 导入父项目的依赖
<parent>
    <artifactId>ActiveMQ-Parent</artifactId>
    <groupId>org.example</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
4.2 配置application.yaml
spring:
  activemq:
    broker-url: tcp://**.**.**.**:61616
    user: admin
    password: admin
    pool:
      max-connections: 100
  jms:
    pub-sub-domain: false
4.3 配置主题创建工厂(队列默认为false,可以不用配置)
@Configuration
public class JmsContainerFactoryConfig {

    @Bean("jmsTopicContainerFactory")
    public DefaultJmsListenerContainerFactory listenerTopicContainer(@Qualifier("jmsConnectionFactory") ConnectionFactory connectionFactory) {
        DefaultJmsListenerContainerFactory container = new DefaultJmsListenerContainerFactory();
        container.setConnectionFactory(connectionFactory);
//        设置对主题的监听(false为队列,true为主题)
        container.setPubSubDomain(true);
        return container;
    }
}
4.4 创建消息监听
@Component
public class MsgListener {

    /**
     * 监听队列1
     * containerFactory可以不配置--》因为默认监听队列
     * @param message
     * @throws JMSException
     */
    @JmsListener(destination = "queue-1")
    public void getQueue1(TextMessage message) throws JMSException {
        System.out.println("接收消息:"+message.getText());
    }

    /**
     * 监听队列2
     * @param message
     * @throws JMSException
     */
    @JmsListener(destination = "queue-2")
    public void getQueue2(TextMessage message) throws JMSException {
        System.out.println("接收消息:"+message.getText());
    }

    /**
     * 监听主题1
     * @param message message
     * @throws JMSException
     */
    @JmsListener(destination = "topic-1",containerFactory = "jmsTopicContainerFactory")
    public void getTopic1(TextMessage message) throws JMSException {
        System.out.println("接收消息:"+message.getText());
    }

    /**
     * 监听主题2
     * @param message
     * @throws JMSException
     */
    @JmsListener(destination = "topic-2",containerFactory = "jmsTopicContainerFactory")
    public void getTopic2(TextMessage message) throws JMSException {
        System.out.println("接收消息:"+message.getText());
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值