ActiveMQ入门(一)

本文是ActiveMQ的入门教程,首先介绍了JMS(Java消息服务)的概念和对象模型,接着详细讲解了ActiveMQ的特性,包括支持多种编程语言、传输协议和持久化方式。然后,文章详细描述了ActiveMQ在Centos7上的安装过程,包括下载、解压、启动、停止、配置系统服务以及设置开机启动。此外,还提到了如何修改用户名密码和配置JAVA_HOME。最后,提供了非Spring和SpringBoot环境下创建生产者和消费者代码的示例。

ActiveMQ是一个完全支持JMS1.2和JMS1.4规范的JMS provider实现,历史悠久。

什么是JMS

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

JMS的对象模型

ConnectionFactory连接工厂
Connection连接
Session会话
Destination目的
MessageProducer生产者
MessageConsumer消费者
Message消息
Broker消息中间件的实例

JMS 消息模型

1、Point-to-Poinit 点对点 :一对一,一条消息一个消费
2、Publish/Subscribe (Pub/Sub) /主题 (发布订阅) 一条消息多个消费,类似发布一个事件

ActiveMQ的特性

1、支持多种编程语言 (它只是个服务器,遵循通信协议即可)
2、支持多种传输协议 (多种编解码实现)
3、有多种持久化方式 (文件/数据库)

ActiveMQ安装

下载

ActiveMQ官网 下载最新版本。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我这里用linux版本,安装环境为Centos7 +JDK8
下载后上传至虚拟机解压

解压安装

tar -zxvf apache-activemq-5.15.8-bin.tar.gz
也可以直接在虚拟机用 wget下载

启动停止

服务启动 停止
启动: ./bin/activemq start
停止:./bin/activemq stop
默认端口openwire 61618,在配置文件conf/activemq.xml 里修改
在这里插入图片描述
web管理端口在 conf/jetty.xml 里修改。
在这里插入图片描述
打开防火墙
在这里插入图片描述
•或者直接关闭防火墙: systemctl stop firewalld.service
我用的虚拟机虚拟网络采用nat 方式,所以还要将两个端口给映射出来

浏览器输入http://127.0.0.1:8161/admin/
用户名:密码 admin admin
在这里插入图片描述

修改用户名密码

可以在conf/jetty-realm.properties 修改用户名密码
在这里插入图片描述

配置系统服务 开机启动

新建service 配置
vi /usr/lib/systemd/system/activemq.service


[Unit]
Description=ActiveMQ service
After=network.target

[Service]
Type=forking
#你的路径
ExecStart=/root/activemq/bin/activemq start
ExecStop=/root/activemq/bin/activemq stop
User=root
Group=root
Restart=always
RestartSec=9
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=activemq


[Install]
WantedBy=multi-user.target

JAVA_HOME 目录配置

在这里插入图片描述
在这里插入图片描述
注意路径别写错了

通过systemctl管理activemq启停

•启动activemq服务: systemctl start activemq
•查看服务状态: systemctl status activemq
在这里插入图片描述
•开机自启: systemctl enable activemq
•检测是否开启成功(enable): systemctl list-unit-files |grep activemq

代码测试

非Spring测试

maven

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

生产者代码

public class Producer {
    public static void main(String[] args) {
        ActiveMQConnectionFactory connectionFactory;
        Connection connection = null;
        Session session = null;
        try{
            //创建连接工厂
            connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.1.99:61616");
            //创建连接
            connection = connectionFactory.createConnection();
            connection.start();
            // 3、创建会话
            // 第一个参数:是否支持事务,如果为true,则会忽略第二个参数,被jms服务器设置为SESSION_TRANSACTED
            // 第一个参数为false时,第二个参数的值可为Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一个。
            // Session.AUTO_ACKNOWLEDGE为自动确认,客户端发送和接收消息不需要做额外的工作。哪怕是接收端发生异常,也会被当作正常发送成功。
            // Session.CLIENT_ACKNOWLEDGE为客户端确认。客户端接收到消息后,必须调用javax.jms.Message的acknowledge方法。jms服务器才会当作发送成功,并删除消息。
            // DUPS_OK_ACKNOWLEDGE允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;而且允许重复确认。
            session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

            // 4、创建点对点发送的目标
            Destination destination = session.createQueue("queue1");

            // 5、创建生产者消息
            MessageProducer producer = session.createProducer(destination);
            // 设置生产者的模式,有两种可选
            // DeliveryMode.PERSISTENT 当activemq关闭的时候,队列数据将会被保存
            // DeliveryMode.NON_PERSISTENT 当activemq关闭的时候,队列里面的数据将会被清空
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

            //設置消息
            TextMessage message = session.createTextMessage("hello world!");
            //發送消息
            producer.send(message);
//            session.commit();//如果开启了事物 则需要提交
            System.out.println("發送成功");
            session.close();
            connection.close();
        }catch (Exception e){
            e.printStackTrace();
        }finally {


        }

    }

消费者代码

public class Consumer {
    public static void main(String[] args) {
        ConnectionFactory connectionFactory = null;
        Connection conn = null;
        Session session = null;
        try {
            connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.1.99:61616");
            conn = connectionFactory.createConnection();
            conn.start();
            session = conn.createSession(false,Session.AUTO_ACKNOWLEDGE);
            Destination destination = session.createQueue("queue1");
            MessageConsumer consumer = session.createConsumer(destination);
            Message message = consumer.receive();
            if(message instanceof  TextMessage){
                System.out.println("收到文本消息:"+((TextMessage) message).getText());
            }else{
                System.out.println(message);
            }

        }catch (JMSException e){
            e.printStackTrace();
        }finally {
            try {
                if(session != null){
                    session.close();
                }
                if(conn != null){
                    conn.close();
                }
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
}

Web控制台查看消息状态
在这里插入图片描述

SpringBoot

maven

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
    </parent>
    <dependencies>
        <!--直接使用spring-boot-starter-activemq-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
    </dependencies>

属性配置

application.properties

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

生产者代码

@SpringBootApplication
public class Producer {

    @Autowired
    private JmsTemplate jmsTemplate;

    @PostConstruct
    public void init() {
        jmsTemplate.convertAndSend("queue1", "Hello Spring 4");
    }

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

消费者代码

@SpringBootApplication
@EnableJms
public class Consumer {

    @JmsListener(destination = "queue1")
    public void receive(String message) {
        System.out.println("收到消息:" + message);
    }

    public static void main(String[] args) {
        SpringApplication.run(Consumer.class, args);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值