后端精进笔记11:AcitveMQ安装与基础使用

559 阅读4分钟

一、ActiveMQ安装

1.0 JDK安装(略)

1.1 下载并解压

# yum install -y wget
# 下载
wget https://mirrors.tuna.tsinghua.edu.cn/apache//activemq/5.15.12/apache-activemq-5.15.12-bin.tar.gz
# 解压到/var
tar -zxf apache-activemq-5.15.12-bin.tar.gz
# 重命名
mv /var/apache-activemq-5.15.12-bin.tar.gz /var/activemq

1.2 配置ActiveMQ的JDK环境

修改activemq安装目录(/var/activemq/bin/env)下的配置

# JAVA_HOME=""
JAVA_HOME="/usr/local/java/jdk1.8.0_201"
JAVACMD="auto"

1.3 启动与停止

# cd /var/activemq
# 启动
./bin/activemq start
# 停止
./bin/activemq stop

访问服务器对应的8161端口,可以看到activemq的页面(需要开启端口或关闭防火墙):

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动

20200331153642

点击管理ActiveMQ示例,默认用户名密码admin/admin:

20200331153721

可以看到ActiveMQ实例的各种详细数据:

20200331153835

1.3 将activeMQ注册为Linux系统服务并开机自动启动

  • 停止ActiveMQ服务;

  • 创建ActiveMQ的systemd服务文件

    vim /usr/lib/systemd/system/activemq.service
    
  • 文件内容:

    [Unit]
    Description=Apache ActiveMQ
    After=network-online.target
    
    [Service]
    Type=forking
    WorkingDirectory=/var/activemq/bin
    ExecStart=/var/activemq/bin/activemq start
    ExecStop=/var/activemq/bin/activemq stop
    Restart=always
    User=root
    Group=root
    StandardOutput=syslog
    StandardError=syslog
    SyslogIdentifier=activemq
    
    [Install]
    WantedBy=multi-user.target
    
  • 启动ActiveMQ服务

    systemctl start activemq
    
  • 查看ActiveMQ服务状态

    [root@localhost ~]# systemctl status activemq
    ● activemq.service - Apache ActiveMQ
       Loaded: loaded (/usr/lib/systemd/system/activemq.service; disabled; vendor preset: disabled)
       Active: active (running) since 二 2020-03-31 03:52:13 EDT; 1min 19s ago
      Process: 17700 ExecStart=/var/activemq/bin/activemq start (code=exited, status=0/SUCCESS)
     Main PID: 17750 (java)
       CGroup: /system.slice/activemq.service
               └─17750 /usr/local/java/jdk1.8.0_201/bin/java -Xms64M -Xmx1G -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.confi...
    
    3月 31 03:52:13 localhost.localdomain systemd[1]: Starting Apache ActiveMQ...
    3月 31 03:52:13 localhost.localdomain activemq[17700]: INFO: Loading '/var/activemq//bin/env'
    3月 31 03:52:13 localhost.localdomain activemq[17700]: INFO: Using java '/usr/local/java/jdk1.8.0_201/bin/java'
    3月 31 03:52:13 localhost.localdomain activemq[17700]: INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get details
    3月 31 03:52:13 localhost.localdomain activemq[17700]: INFO: pidfile created : '/var/activemq//data/activemq.pid' (pid '17750')
    3月 31 03:52:13 localhost.localdomain systemd[1]: Started Apache ActiveMQ.
    Hint: Some lines were ellipsized, use -l to show in full.
    
  • 新建软连接,设置服务器开机启动:

    ln -s /usr/lib/systemd/system/activemq.service /etc/systemd/system/multi-user.target.wants/activemq.service
    
    systemctl enable activemq
    
  • 重启服务器后,可以看到,activemq自动启动

    # 重启
    reboot -h now
    # 查看ActiveMQ服务状态
    systemctl status activemq
    

二、基础使用

2.1 原生基础使用

这里所谓的原生使用,就是基于maven的activemq依赖,使用producer发送一个消息到activemq实例,然后在用cosumer消费掉该存量消息。

2.1.1 添加maven依赖

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-all</artifactId>
    <version>5.15.12</version>
</dependency>

2.1.2 使用生产者发送消息到ActiveMQ Broker

public class MyProducer {

    private static String brokerUrl = "tcp://192.168.2.191:61616";
    private static String destinationUrl = "my-queue1";

    public static void main(String[] args) throws Exception {

        ActiveMQConnectionFactory connectionFactory;
        Connection conn;
        Session session;

        try {
            // 1、创建连接工厂
            connectionFactory = new ActiveMQConnectionFactory(brokerUrl);
            // 2、创建连接对象md
            conn = connectionFactory.createConnection();
            conn.start();
            // 3、创建会话
            session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
            // 4、创建点对点发送的目标
            Destination destination = session.createQueue(destinationUrl);
            // 5、创建生产者消息
            MessageProducer producer = session.createProducer(destination);
            // 设置生产者的模式,有两种可选 持久化 / 不持久化
            producer.setDeliveryMode(DeliveryMode.PERSISTENT);
            // 6、创建一条文本消息
            String text = "Hello world!";
            TextMessage message = session.createTextMessage(text);
            // 7、发送消息
            producer.send(message);
            // 8、 关闭连接
            session.close();
            conn.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

可以看到,ActiveMQ Broker已接收到一条消息:

20200331170009

2.1.3 使用Consumer消费掉该信息

public class MyConsumer {

    private static String brokerUrl = "tcp://192.168.2.191:61616";
    private static String destinationUrl = "my-queue1";

    public static void main(String[] args) {
        ActiveMQConnectionFactory connectionFactory;
        Connection conn;
        Session session;
        MessageConsumer consumer;

        try {
            // 1、创建连接工厂
            connectionFactory = new ActiveMQConnectionFactory(brokerUrl);
            // 2、创建连接对象
            conn = connectionFactory.createConnection();
            conn.start(); // 一定要启动
            // 3、创建会话(可以创建一个或者多个session)
            session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
            // 4、创建点对点接收的目标,queue - 点对点
            Destination destination = session.createQueue(destinationUrl);
            // 5、创建消费者消息
            consumer = session.createConsumer(destination);
            // 6、接收消息(没有消息就持续等待)
            Message message = consumer.receive();
            if (message instanceof TextMessage) {
                System.out.println("收到文本消息:" + ((TextMessage) message).getText());
            } else {
                System.out.println(message);
            }
            consumer.close();
            session.close();
            conn.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

可以看到,ActiveMQ Broker的消息已被消费掉:

20200331170415

2.2 基于SpringBoot的基础使用

2.2.1 添加maven依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.6.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<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>

2.2.2 配置文件

spring.activemq.broker-url=tcp://192.168.2.191:61616
spring.activemq.user=admin
spring.activemq.password=admin

2.2.3 新建生产者模块启动类

@SpringBootApplication
public class MyProducer {

    @Autowired
    private JmsTemplate jmsTemplate;

    @PostConstruct
    public void init() {
        jmsTemplate.convertAndSend("my-queue-spring", "Hello Spring!");
    }

    public static void main(String[] args) {
        SpringApplication.run(MyProducer.class, args);
    }
}

执行后运行起来可以看到,有一个生产者注册到了ActiveMQ Broker,且消息已发送:

20200331171505

2.2.4 新建消费者模块启动类

执行后运行起来可以看到,有一个消费者注册到了ActiveMQ Broker,且存量消息已被消费:

20200331171849