ActiveMq的高级特性

ActiveMq的高级特性

1 ActiveMQ传输协议
1.默认的 61616 端口如何修改?
命令如下:

vim conf/activemq.xml

进入如图所示的界面:在这里插入图片描述
修改为如图所示:在这里插入图片描述
2.生产环境上的连接协议如何配置?使用tcp吗?
如上图即可。
2 ActiveMQ传输协议有那些?
学习文档的官方:http://activemq.apache.org/configuring-transports
1.Transmission Control Protocol(TCP)默认
1)这是默认的Broker配置,TCP的Client监听端口61616。
2)在网络传输数据前,必须要序列化数据,消息是通过一个叫wire protocol的来序列化成字节流。默认情况下ActiveMQ把wire protocol叫做openwire,它的目的是促使网络上的效率和数据快速交互。
3)TCP连接的URI形式:tcp://hostname:port?key=value&key=value,后面的参数是可选。
4)TCP传输的优点:
​ 4.1)TCP协议传输可靠性高,稳定性强。
4.2)高效性:字节流方式传递,效率高。
​ 4.3)有效性、可用性:应用广泛,支持任何平台。

2.New I/O API Protocol(NIO)
1)NIO协议和TCP协议类似,但NIO更侧重于底层的访问操作。它允许开发人员对同一资源可有更多的client调用和服务端有更多的负载。
2)适合使用NIO协议的场景:
2.1)可能有大量的client连接到Broker上,一般情况下,大量的client去连接Broker是被操作系统的线程所限制的,因此,NIO的实现比TCP需要更少的线程去运行,所有建议使用NIO协议。
2.2)可能对于Broker有一个很迟钝的网络传输,NIO比TCP提供更好的性能。
3)NIO连接的URI形式:nio://hostname:port?key=value。

<transportConnector name="auto+nio" uri="auto+nio://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600&amp;org.apache.activemq.transport.nio.SelectorManager.corePoolSize=20&amp;org.apache.activemq.transport.nio.SelectorManager.maximumPoolSize=50"/>

ActiveMQ支持的网络协议总结,如图所示:在这里插入图片描述
3 NIO案例演示
1.修改 /conf/activemq.xml 配置文件,在 标签内添加一个新的节点:

<transportConnector name="nio" uri="nio://0.0.0.0:61618"/>

如图所示:在这里插入图片描述
2.修改 brokerURL
4 NIO增强案例演示
1.修改 /conf/activemq.xml 配置文件,在 标签内修改上面新添加的 nio 节点。

<transportConnector name="auto+nio" uri="auto+nio://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600&amp;org.apache.activemq.transport.nio.SelectorManager.corePoolSize=20&amp;org.apache.activemq.transport.nio.Se5lectorManager.maximumPoolSize=50"/>

5 ActiveMQ消息存储和持久化
1.ActiveMQ持久化机制?MQ服务器宕机了,消息会不会丢失?
为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制。ActiveMQ的消息持久化机制有 JDBC、AMQ、KahaDB 和 LevelDB,无论使用哪种持久化方式,消息的存储逻辑都是一致的。就是发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件、内存数据库或者远程数据库等,再试图将消息发送给接收者,成功则将消息从存储中删除,失败则继续尝试发送。消息中心启动后首先要检查指定的存储位置,如果有未发送成功的消息,则需要把消息发送出去。
2.有哪些?
2.1) http://activemq.apache.org/persistence
2.2)AMQ Message Sotre(了解)如图所示:在这里插入图片描述
2.3)KahaDB(默认)如图所示:在这里插入图片描述
2.4)LevelDB(了解)如图所示:在这里插入图片描述
2.5)JDBC
2.6)JDBC Message Store with ActiveMQ Journal
3.JDBC 消息存储 如图所示:在这里插入图片描述
3.1 实现步骤
1)添加MySQL数据库驱动包拷贝到 activemq/lib 目录。如图所示:在这里插入图片描述
2)修改 activemq.xml 配置文件。
修改之前的命令如下:

<persistenceAdapter>
    <kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>

修改之后的命令如下:

<persistenceAdapter>
    <jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="true"/>
</persistenceAdapter>

修改之后如图所示:在这里插入图片描述
数据库连接池配置的命令如下:

<bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://192.168.171.131:3306/activemq?relaxAutoCommit=true"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
    <property name="maxTotal" value="200"/>
    <property name="poolPreparedStatements" value="true"/>
  </bean>

修改之后如图所示:在这里插入图片描述
3)创建数据库和表。
1.创建数据库:CREATE DATABASE activemq,如图所示:在这里插入图片描述
2.重启activemq,会自动在activemq数据库中创建3张表。
重启activemq如图所示:在这里插入图片描述
会自动在activemq数据库中创建3张表,如图所示:在这里插入图片描述
如果报如图所示的错误。在这里插入图片描述
解决办法的步骤如下:
1).修改mysql访问权限的命令如下:

 mysql -uroot -p密码
 use mysql;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'txw4' IDENTIFIED BY '123456' WITH GRANT OPTION;
flush privileges; 

如图所示:在这里插入图片描述
2).因为txw4是虚拟机名称,修改的命令如下:

vim /etc/hostname

修改为如图所示:在这里插入图片描述
3使用如下命令进行修改域名映射关系:

 vim /etc/hosts

修改为如图所示:然后reboot重新启动虚拟机。在这里插入图片描述
4).修改mysql的配置文件命令如下:

 vim /etc/my.cnf

在配置文件中增加代码如下:

port=3306
bind-address=0.0.0.0

修改为如图所示:在这里插入图片描述
5).重新启动mysql服务的命令如下:

service mysql restart

如图所示,说明重启成功!在这里插入图片描述
3.activemq_msgs 消息表,queue和topic都存在里面。

ID:自增的数据库主键
CONTAINER:消息的Destination
MSGID_PROD:消息发送者的主键
MSGID_SEQ:发送消息的顺序,MSGID_PROD+MSG_SEQ可以组成JMS的MessageID
EXPIRATION:消息的过期时间,存储的是从1970-01-01到现在的毫秒数
MSG:消息本体的Java序列化对象的二进制数据
PRIORITY:优先级,从0-9,数值越大优先级越高

4.activemq_acks,用于存储订阅关系。如果是持久化Topic,订阅者和服务器的订阅关系在这个表保存。

CONTAINER:消息的Destination
SUB_DEST:如果是使用Static集群,这个字段会有集群其它系统的信息
CLIENT_ID:每个订阅者都必须有一个唯一的客户端ID用以区分
SUB_NAME:订阅者名称
SELECTOR:选择器,可选择只消费满足条件的消息。条件可以用自定义属性实现,可支持多属性AND和OR操作
LAST_ACKED_ID:记录消费过的消息的ID

5.activemq_acks,用于存储订阅关系。如果是持久化Topic,订阅者和服务器的订阅关系在这个表保存。
4)代码运行验证
1.Topic一定要开启持久化,Queue默认是持久化模式。

messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);

2.Queue点对点类型中的消息一旦被 Consumer 消费,消息就从 broker或数据库中删除。
3.Topic 主题消息被 Consumer 消费,消息不会从 broker 或 数据库中删除。
5)总结
1.Queue:在没有消费者消费的情况下,会将消息保存到 activemq_msgs 表中,只要有任意一个消费者已经消费过了,消费之后这些消息将会立即被删除。
2.Topic:一般是先启动消费者订阅,然后再生产的情况下,会将主题保存到activemq_acks 表中。
6)开发踩坑
1.数据库 jar 包:需要将相关数据的驱动 jar 包放到 ActiveMQ 安装目录的 lib 目录。若使用其它的连接池,还需要将连接池的 jar 包也放入。
2.createTablesOnStartup 属性:在 jdbcPersistenceAdapter 标签中设置了 createTablesOnStartup 属性为 true 时,在第一次启动 ActiveMQ 时,ActiveMQ 服务节点会自动创建所需要的数据表。启动完成后可以去掉这个属性,或者更改 createTablesOnStartup 属性为 false。
7)JDBC Message Store with ActiveMQ Journal
1.这种方式克服了 JDBC Store 的不足,JDBC 每次消息过来,都需要去写库和读库。ActiveMQ Journal 使用高速缓存写入技术,大大提高了性能。
修改之前的命令如下:

<persistenceAdapter>
    <jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="true"/>
</persistenceAdapter>

修改之后的命令如下:

<persistenceFactory>
    <journalPersistenceAdapterFactory journalLogfiles="4" journalLogfileSize="32768" useJournal="true" useQuickJournal="true" dataSource="#mysql-ds" dataDirectory="activemq-data"/>
</persistenceFactory>

6 ActiveMQ多节点集群
1.引入消息队列后如何保证其高可用性?
2.是什么呢?
基于Zookeeper和LevelDB搭建ActiveMQ集群。
集群仅提供主备方式的高可用集群功能,避免单点故障。
3.主从集群。
1)Shared File System Master Slave(KahaDB默认)。
2)JDBC Master Slave。
3)Replicated LevelDB Store。

Zookeeper + Replicated LevelDB Store的主从集群:
http://activemq.apache.org/replicated-leveldb-store

4.高级特性
1)异步投递。
2)延时投递和定时投递。
3)消费重试机制。
4)死信队列。
5)防止重复调用。
7 搭建队列环境
7.1 搭建生产者
1.导入相应的依赖jar包的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.txw</groupId>
    <artifactId>activemq-boot-produce</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>activemq-boot-produce</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2.在resources目录下创建application.yml的代码如下:

server:
  port: 8000
spring:
  activemq:
    broker-url: tcp://192.168.171.131:61616 # mq 服务器地址
    user: admin
    password: admin
  jms:
    pub-sub-domain: false # false: Queue, true: Topic, 默认 false
# 定义队列名
queue-name: boot-active-queue

3.编写Bean配置类的代码如下:

package com.txw.mq.config;

import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import javax.jms.Queue;
/**
 * Bean配置类
 * @author:Adair
 */
@SuppressWarnings("all")      // 注解警告信息
@Configuration
// 开启 JMS 适配注解
@EnableJms
public class BeanConfig {

    /* 读取 Spring Boot 配置文件中的自定义属性 */
    @Value("${queue-name}")
    private String queueName;
    @Bean
    public Queue queue () {
        return new ActiveMQQueue(queueName);
    }
}

4.编写消息发送类的代码如下:

package com.txw.mq.produce;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.jms.Queue;
import java.util.UUID;
/**
 * 消息发送类
 * @author:Adair
 */
@SuppressWarnings("all")      // 注解警告信息
@Component
public class QueueProduce {
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Autowired
    private Queue queue;
    /**
     * 发送消息
     *  触发投递(手动)
     */
    public void produceMessage () {
        jmsMessagingTemplate.convertAndSend(queue, UUID.randomUUID().toString().substring(0,6));
        System.out.println("***消息成功发送到队列");
    }
    /**
     * 每隔3m定时投递
     *  间隔定投(自动)
     */
    @Scheduled(fixedDelay = 3000)
    public void produceMessageScheduled () {
        jmsMessagingTemplate.convertAndSend(queue, "Scheduled: " + UUID.randomUUID().toString().substring(0,6));
        System.out.println("***消息定时成功发送到队列");
    }
}

5.编写主启动类的代码如下:

package com.txw.mq;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SuppressWarnings("all")      // 注解警告信息
@SpringBootApplication
// 开启定时投递
@EnableScheduling
public class ActivemqBootProduceApplication {
    public static void main(String[] args) {
        SpringApplication.run(ActivemqBootProduceApplication.class, args);
    }
}

6.编写测试的代码如下:

package com.txw.mq;

import com.txw.mq.produce.QueueProduce;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.context.web.WebAppConfiguration;
/**
 * 单元测试类
 */
@SuppressWarnings("all")      // 注解警告信息
@SpringBootTest(classes = ActivemqBootProduceApplication.class)
@ExtendWith(SpringExtension.class)
@WebAppConfiguration
public class QueueProduceTest {
    @Autowired
    private QueueProduce queueProduce;
    @Test
    void testProduceMessage () {
        queueProduce.produceMessage();
    }
}

7.2 搭建消费者
1.导入相应的依赖jar包的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.txw</groupId>
    <artifactId>activemq-boot-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>activemq-boot-consumer</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2.在resources目录下创建application.yml的代码如下:

server:
  port: 8000
spring:
  activemq:
    broker-url: tcp://192.168.171.131:61616 # mq 服务器地址
    user: admin
    password: admin
  jms:
    pub-sub-domain: false # false: Queue, true: Topic, 默认 false
# 定义队列名
queue-name: boot-active-queue

3.编写消息接收类的代码如下:

package com.txw.mq.consumer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;
import javax.jms.JMSException;
import javax.jms.TextMessage;
/**
 * 消息接收类
 * @author:Adair
 */
@SuppressWarnings("all")      // 注解警告信息
@Component
public class QueueConsumer {
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    /**
     * 消费消息
     * @param textMessage
     * @throws JMSException
     */
    @JmsListener(destination = "${queue-name}")
    public void recevie (TextMessage textMessage) throws JMSException {
        System.out.println("******" + textMessage.getText());
    }
}

4.编写主启动类的代码如下:

package com.txw.mq;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SuppressWarnings("all")      // 注解警告信息
@SpringBootApplication
public class ActivemqBootConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ActivemqBootConsumerApplication.class, args);
    }
}

8 搭建Topic环境
8.1 搭建生产者
1.导入相应的依赖jar包的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.txw</groupId>
    <artifactId>activemq-boot-topic-produce</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>activemq-boot-topic-produce</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2.在resources目录下创建application.yml的代码如下:

server:
  port: 8000
spring:
  activemq:
    broker-url: auto+nio://192.168.171.131:61619 # mq 服务器地址
    user: admin
    password: admin
  jms:
    pub-sub-domain: true # false: Queue, true: Topic, 默认 false
# 定义队列名
topic-name: boot-active-topic

3.编写Bean配置类的代码如下:

package com.txw.mq.config;

import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import javax.jms.Topic;
/**
 * Bean 配置类
 * @author:Adair
 */
@SuppressWarnings("all")      // 注解警告信息
@Configuration
@EnableJms
public class ConfigBean {
    @Value("${topic-name}")
    private String topicName;
    @Bean
    public Topic topic() {
        return new ActiveMQTopic(topicName);
    }
}

4.编写消息发送类的代码如下:

package com.txw.mq.produce;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.jms.Topic;
import java.util.UUID;
/**
 * TODO
 * @author:Adair
 */
@SuppressWarnings("all")      // 注解警告信息
@Component
public class TopicProduce {
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
        @Autowired
    private Topic topic;
    /**
     * 间隔定投消息
     */
    @Scheduled(fixedDelay = 3000)
    public void produceMessage () {
        jmsMessagingTemplate.convertAndSend(topic,"Topic: " + UUID.randomUUID().toString().substring(0,6));
        System.out.println("******主题消息已发送到MQ服务器");
    }
}

5.编写主启动类的代码如下:

package com.txw.mq;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SuppressWarnings("all")      // 注解警告信息
@SpringBootApplication
@EnableScheduling
public class ActivemqBootTopicProduceApplication {
    public static void main(String[] args) {
        SpringApplication.run(ActivemqBootTopicProduceApplication.class, args);
    }
}

8.2 搭建消费者
1.导入相应的依赖jar包的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.txw</groupId>
    <artifactId>activemq-boot-topic-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>activemq-boot-topic-consumer</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2.在resources目录下创建application.yml的代码如下:

server:
  port: 8002
spring:
  activemq:
    broker-url: auto+nio://192.168.171.131:61619 # mq 服务器地址
    user: admin
    password: admin
  jms:
    pub-sub-domain: true # false: Queue, true: Topic, 默认 false
# 定义队列名
topic-name: boot-active-topic

3.编写主题消息接收类的代码如下:

package com.txw.mq.consumer;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
import javax.jms.JMSException;
import javax.jms.TextMessage;
/**
 * 主题消息接收类
 * @author:Adair
 */
@SuppressWarnings("all")      // 注解警告信息
@Component
public class TopicConsumer {
    @JmsListener(destination = "${topic-name}")
    public void recevie (TextMessage textMessage) throws JMSException {
        System.out.println(textMessage.getText());
    }
}

4.编写主启动类的代码如下:

package com.txw.mq;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SuppressWarnings("all")      // 注解警告信息
@SpringBootApplication
public class ActivemqBootTopicConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ActivemqBootTopicConsumerApplication.class, args);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学无止路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值