消息中间件activeMQ

1.什么是消息中间件?

通过查阅百度百科后得知消息中间件是一款免费并且非常实用的企业及时通讯软件可以与OA(办公自动化),ERP(企业资源计划)集成使用,消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通讯来进行分布式系统的集成,通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。讲了这么多实际上它就是在我们分布式系统下的系统间通讯的一种方式,解决了分布式系统的数据传输问题.

2.什么是activeMQ?

activeMQ是Apache下的一个消息中间件的开源项目,完全支持JMS1.1和J2EE1.4,由于它是一个纯java程序,所以只要我们的操作系统支持JVM,activeMQ就可以执行.

3.JMS简介

JMS(Java Message Service)是java平台面向消息中间件的技术规范,它便于消息系统中java应用程序进行信息交换,并通过提供标准的产生,发送,接收消息的接口来简化企业应用的开发.JMS 本身只定义了一系列的接口规范,是一种与厂商无关的 API,用来访问消息收发系统。
JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JML 客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。JMS定义了五种不同的消息数据格式:1.TextMessage 一个文本对象 2.MapMessage 属性集合对象,键值对 3.ObjectMessage 一个序列化的java对象 4.ByteMessage 一个字节数据 5.StreamMessage 一个流对象

4.JMS消息传递类型

有两种,第一种是点对点模式:即一个消息的生产者对应一个消息的消费者,他们是一一对应的关系,另一种是发布/订阅模式,即一个消息的生产者对应多个消费者,而且他们同时在线才能接收到消息或者建立一种持久的订阅状态(虽然消费者不在线,但建立了持久订阅,则等消费者上线后,生产者会把消息重新发送),类似于广播的机制.

5.ActiveMQ下载与安装

官方网站下载:下载地址
安装(Linux )
(1)将 apache-activemq-5.12.0-bin.tar.gz 上传至服务器
(2)解压此文件
tar zxvf apache-activemq-5.12.0-bin.tar.gz
(3)为 apache-activemq-5.12.0 目录赋权
chmod 777 apache-activemq-5.12.0
(4)进入 apache-activemq-5.12.0\bin 目录
(5)赋与执行权限
chmod 755 activemq
( 6 ) 启动
./activemq start
( 7 ) activeMQ的运行,它的默认访问端口是8161,所以通过自己部署的服务器IP和端口号就能访问,截图如下:
访问的首页
如果想要进入管理界面,可以点击首页上的"Manager ActiveMQ broker",然后它的默认用户名和密码都是admin
管理页面的Queues
列表的各字段含义:
Number Of Pending Messages : 等待消费的消息 这个是当前未出队列的数量(上图因为我以前用过了,如果新安装的都是0)
Number Of Consumers : 消费者 这个是消费者端的消费者数量
Messages Enqueued : 进入队列的消息 进入队列的总数量,包括出队列的
Messages Dequeued : 出了队列的消息 可以理解为是消费这消费掉的数量

6.activeMQ入门程序

6.1点对点模式

生产者和消费者在同一个队列上,生成者负责发送消息,它不关心消费者是否能接收到消息,如果有消费者监听,则会发送给消费者,如果没有的话会保存在activeMQ服务器上,直到消费者接收到消息.点对点的模式可以有多个生产者和消费者,但是一个生产者发送的消息只能被一个消费者接收,而且那个接收端先连上activeMQ则会先接受到,而后来的接收端就接受不到这个消息了.

创建消息生产者:
1.创建maven工程,引入依赖:

  <dependencies>
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-client</artifactId>
        <version>5.13.4</version>
    </dependency>
    </dependencies>

2.创建类 QueueProducer main 方法代码如下:

package com.study;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class QueueProducer {
    public static void main(String[] args) throws JMSException {
        //1.创建连接工厂(IP地址根据你自己的服务器替换)
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");
        //2.获取连接
        Connection connection = connectionFactory.createConnection();
        //3.启动连接
        connection.start();
        //4.获取 session (参数 1:是否启动事务,参数2:消息确认模式:
        //  AUTO_ACKNOWLEDGE = 1 自动确认
        //  CLIENT_ACKNOWLEDGE = 2 客户端手动确认
        //  DUPS_OK_ACKNOWLEDGE = 3 自动批量确认
        //  SESSION_TRANSACTED = 0 事务提交并确认)
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5.创建队列对象
        Queue queue = session.createQueue("queue");
        //6.创建消息生产者
        MessageProducer producer = session.createProducer(queue);
        //7.创建消息
        TextMessage textMessage = session.createTextMessage("生产者发送了一个消息");
        //8.发送消息
        producer.send(textMessage);
        //9.释放资源
        producer.close();
        session.close();
        connection.close();
    }
}

创建消息消费者:
创建类 QueueConsumer ,main 方法代码如下:

package com.study;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;
import java.io.IOException;

public class QueueConsumer {
    public static void main(String[] args) throws JMSException, IOException {
        //1.创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");
        //2.获取连接对象
        Connection connection = activeMQConnectionFactory.createConnection();
        //3.启动连接
        connection.start();
        //4.获取session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5.创建队列对象
        Queue queue = session.createQueue("queue");
        //6.创建消息消费者
        MessageConsumer consumer = session.createConsumer(queue);
        //7.监听消息
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                TextMessage textMessage =(TextMessage)message;
                try {
                    System.out.println(textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
        //8.等待键盘录入,为了不让程序往下面执行释放资源,有利于我们做测试
        System.in.read();
        //9.释放资源
        consumer.close();
        session.close();
        connection.close();

    }
}

经过测试,消费者正常输出我们生产者发送的消息"生产者发送了一个消息".如果同时运行了两个消费者,但生产者只发送了一次消息,则可以看出只有一个消费者接收到消息.

6.2发布/订阅模式

一个生产者发送消息,可以同时被多个消费者接收到消息,类似于我们生活中的广播方式.如果生产者发送消息时接收端不在线,则消费者就接受不到消息了,当然我们可以通过持久化的处理,当消费者不在线时接收不到消息,但是一旦消费者上线后生产者会重新发送消息,则此时就能接收到消息了.

此模式的生产者和消费者代码的编写基本和点对点模式类似,我们需要修改创建队列的代码
Queue queue = session.createQueue(“queue”);改成 Topic topic = session.createTopic(“topic”);
还有创建生产者或消费者的参数改成topic即可.
ps:暂时就写这么多,等后面有时间再写spring整合JMS和activeMQ.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值