

Active是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。AC-tiveMQ使用Apache提供的授权,任何人都可以对其实现代码进行修改。
ActiveMQ的设计目标是提供标准的,面向消息的,能够跨越多语言和多系统的应用集成消息通信中间件。ActiveMQ实现了JMS标准并提供了很多附加的特性。本文将带大家详细介绍ActiveMQ的API的使用。
公众号:「浅羽的IT小屋」
「什么是JMS呢:」
「JMS能干什么呢:」
「队列的通信概念:」
「主题的通信模型:」
3. MQ的实现产品
「实现产品:」
「常见的名词:」
「消息队列简单的说就是用来存放临时数据的地方:」
「消息队列类似于快递公司:」
6. ActiveMQ是什么
「含义:」
「主要作用:」
「ActiveMQ的安装和配置:」
1、官网下载Linux版的ActiveMQ(最新版本为5.13.4)https://activemq.apache.org/download.html2、解压安装tar -zxvf apache-activemq-5.13.4-bin.tar.gz3、配置(这里采用默认配置,无需修改)vim /usr/lical/activemq-1/conf/activemq.xml4、启动cd /usr/local/activemq-1/bin./activemq start5、打开管理界面(管理界面可以查看并管理所有队列及消息)http://192.168.1.100:8161启动成功后,可以浏览 http://localhost:8161/admin/默认用户名、密码:admin/admin管理界面是用jetty做容器的,如果想修改管理界面的端口,可以编辑../conf/jetty.xml,找到下面这一段:<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"><!-- the default port number for the web console --><property name="host" value="0.0.0.0"/><property name="port" value="8161"/></bean>用户名/密码是在 ../conf/jetty-realm.properties 里,比如要增加一个管理员jimmy/123456,可参考下面修改:123admin: admin, adminjimmy: 123456, adminuser: user, user注:管理界面有一个小坑,ActiveMQ 5.13.2与jdk1.8兼容性有点问题,如果使用jdk1.8,管理界面进入Queues标签页时,偶尔会报错,但是并不影响消息正常收发,只是无法从界面上查看队列情况,如果出现该问题,可将jdk版本降至1.7,同时最好清空data目录下的所有数据,再重启activemq即可。
9. ActiveMQ的API的使用
「AcatveMQ的API使用:」
package com.qy.mq.queue;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.Message;
import javax.jms.*;
/**
* @Auther: qianyu
* @Date: 2020/11/04 14:12
* @Description:生产者
*/
public class Producer {
//准备发布的这个地址
private static final String PATH="tcp://10.7.182.87:61616";
//ActiveMQ下的用户名
private static final String userName="admin";
//ActiveMQ下的密码
private static final String password="admin";
public static void main(String[] args) throws JMSException {
//第一步:创建连接的工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(userName, password, PATH);
//通过这个工厂获取连接
Connection connection = activeMQConnectionFactory.createConnection();
//第三步:打开这个连接
connection.start();
//第四步:创建操作MQ的这个会话
/**
* 第一个参数:是否使用事务
* 第二个参数:客户端的应答模式
* 第一种:自动应答
* 第二种:客户端手动应答
*/
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//需要发送消息的目的地(queue操作的是队列)
Destination destination=session.createQueue("wqqq");
//生产者来生产这个消息
//要有生产者
MessageProducer messageProducer = session.createProducer(destination);
//发送很多的消息到消息队列中去
// for (int i=0;i<100;i++){
//需要准备发送的消息
// TextMessage textMessage = session.createTextMessage("我是浅羽:"+i);
//研究消息的类型
/* BytesMessage bytesMessage = session.createBytesMessage();
bytesMessage.setByteProperty("www",new Byte("123"));
//接下来就可以发送消息了
messageProducer.send(bytesMessage);*/
//创建map类型的message
/*MapMessage mapMessage = session.createMapMessage();
mapMessage.setInt("www1",123);
messageProducer.send(mapMessage);*/
ObjectMessage objectMessage = session.createObjectMessage(new User(1, "qianyu", "123"));
messageProducer.send(objectMessage);
// }
}
}
package com.qy.mq.queue;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import java.io.Serializable;
/**
* @Auther: qianyu
* @Date: 2020/11/04 14:13
* @Description:消费者
*/
public class Consumer {
//准备发布的这个地址
private static final String PATH="tcp://10.7.182.87:61616";
//ActiveMQ下的用户名
private static final String userName="admin";
//ActiveMQ下的密码
private static final String password="admin";
public static void main(String[] args) throws JMSException {
//第一步:创建连接的工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(userName, password, PATH);
//通过这个工厂获取连接
Connection connection = activeMQConnectionFactory.createConnection();
//第三步:打开这个连接
connection.start();
//第四步:创建操作MQ的这个会话
/**
* 第一个参数:是否使用事务
* 第二个参数:客户端的应答模式
* 第一种:自动应答
* 第二种:客户端手动应答
*/
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
//需要发送消息的目的地(queue操作的是队列)
Destination destination=session.createQueue("wqqq");
//创建我们的消费者了
MessageConsumer messageConsumer = session.createConsumer(destination);
//接下来就可以接收我们的消息了
//Message message = messageConsumer.receive();
//接收消息并指定这个超时的时间
// Message message = messageConsumer.receive(5000);
//接收消息没有就不等待了 直接over了 不接收了
// Message message = messageConsumer.receiveNoWait();
//给定当前的路径设置监听器
messageConsumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
/* BytesMessage bytesMessage= (BytesMessage) message;
try {
System.out.println("获取到的数据是:"+bytesMessage.getByteProperty("www"));
} catch (JMSException e) {
e.printStackTrace();
}*/
/*MapMessage mapMessage= (MapMessage) message;
try {
System.out.println("获取到的数据是:"+mapMessage.getInt("www1"));
} catch (JMSException e) {
e.printStackTrace();
}*/
//测试对象类型的消息的发送和接收
ObjectMessage objectMessage= (ObjectMessage) message;
try {
User user = (User) objectMessage.getObject();
System.out.println("接收到的数据是:"+user);
} catch (JMSException e) {
e.printStackTrace();
}
/* //我们知道是一个字符串类型的消息
TextMessage textMessage= (TextMessage) message;
//接下来就可以打印这个消息了
try {
System.out.println("消费者1---接收到的消息是:"+textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}*/
try {
//这句话就表示的是客户端来手动的进行应答
message.acknowledge();
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}
package com.qy.mq.topic;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @Auther: qianyu
* @Date: 2020/11/04 15:17
* @Description:
*/
public class Producer {
//准备发布的这个地址
private static final String PATH="tcp://10.7.182.87:61616";
//ActiveMQ下的用户名
private static final String userName="admin";
//ActiveMQ下的密码
private static final String password="admin";
public static void main(String[] args) throws JMSException {
//第一步:创建连接的工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(userName, password, PATH);
//通过这个工厂获取连接
Connection connection = activeMQConnectionFactory.createConnection();
//第三步:打开这个连接
connection.start();
//第四步:创建操作MQ的这个会话
/**
* 第一个参数:是否使用事务
* 第二个参数:客户端的应答模式
* 第一种:自动应答
* 第二种:客户端手动应答
*/
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
//需要发送消息的目的地(下面创建的就应该是主题模型的地址)
Destination destination=session.createTopic("topic222");
//生产者来生产这个消息
//要有生产者
MessageProducer messageProducer = session.createProducer(destination);
//发送很多的消息到消息队列中去
for (int i=0;i<100;i++){
//需要准备发送的消息
TextMessage textMessage = session.createTextMessage("我是浅羽:"+i);
//接下来就可以发送消息了
messageProducer.send(textMessage);
}
}
}
package com.qy.mq.topic;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @Auther: qianyu
* @Date: 2020/11/04 15:19
* @Description:
*/
public class Consumer {
//准备发布的这个地址
private static final String PATH="tcp://10.7.182.87:61616";
//ActiveMQ下的用户名
private static final String userName="admin";
//ActiveMQ下的密码
private static final String password="admin";
public static void main(String[] args) throws JMSException {
//第一步:创建连接的工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(userName, password, PATH);
//通过这个工厂获取连接
Connection connection = activeMQConnectionFactory.createConnection();
//第三步:打开这个连接
connection.start();
//第四步:创建操作MQ的这个会话
/**
* 第一个参数:是否使用事务
* 第二个参数:客户端的应答模式
* 第一种:自动应答
* 第二种:客户端手动应答
*/
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
//需要发送消息的目的地(queue操作的是队列)
Destination destination=session.createTopic("topic222");
//创建我们的消费者了
MessageConsumer messageConsumer = session.createConsumer(destination);
//接下来就可以接收我们的消息了
//给定当前的路径设置监听器
messageConsumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
//我们知道是一个字符串类型的消息
TextMessage textMessage= (TextMessage) message;
//接下来就可以打印这个消息了
try {
System.out.println("消费者1---接收到的消息是:"+textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
try {
message.acknowledge();
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}

如果你觉得浅羽的文章对你有帮助的话,请在微信搜索并关注「 浅羽的IT小屋 」微信公众号,我会在这里分享一下计算机信息知识、理论技术、工具资源、软件介绍、后端开发、面试、工作感想以及一些生活随想等一系列文章。所见所领,皆是生活。慢慢来,努力一点,你我共同成长...

我建立了一个技术群,如果你想了解到更多关于IT行业的技术以及生活中遇到的问题,欢迎小伙伴进群交流,只需添加我的微信,备注进群即可,期待你们的加入。

往期推荐

彻底了解|利用Apache CXF框架开发WebService

极速上手使用Docker,这篇文章就够了!

关于项目中使用Druid数据库监控的配置

IntelliJ IDEA热部署工具JRebel的使用教程

关于Maven,我是如何理解并使用的

一文带你了解Spring框架的基本使用

Java泛型需要注意的问题

如何在Java中创建优雅的对象来提升程序性能
浅羽
留言区

点个赞,证明你还爱我
原文作者:浅羽的IT小屋;如有侵权,请联系管理员删除。