在Ubuntu上安装ActiveMQ

系统初始化

$ sudo apt update
$ sudo apt dist-upgrade
$ sudo apt autoremove
$ sudo apt clean

搭建activemq服务

$ mkdir /home/active-mq
$ cd /home/active-mq
$ wget http://www.apache.org/dist/activemq/5.15.9/apache-activemq-5.15.9-bin.tar.gz
# 具体版本请查看http://www.apache.org/dist/activemq
$ tar -zxvf apache-activemq-5.15.9-bin.tar.gz
# 如果未安装jdk,执行 sudo apt-get install openjdk-8-jdk
$ ./activemq start
INFO: Loading '/home/active-mq/apache-activemq-5.15.9//bin/env'
INFO: Using java '/usr/bin/java'
INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get details
INFO: pidfile created : '/home/active-mq/apache-activemq-5.15.9//data/activemq.pid' (pid '6356')

监控

浏览器打开http://localhost:8161/admin/,输入admin,admin

至此,ActiveMQ搭建完成。

理解JMS( Java Message Service)

Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等,用于支持JAVA应用程序开发。

JMS模型

  • 点对点(P2P)或队列模型

    • 只有一个消费者将获得消息
    • 生产者不需要在接收者消费该消息期间处于运行状态,接收者也同样不需要在消息发送时处于运行状态。
    • 每一个成功处理的消息都由接收者签收
  • 发布/订阅模型

    • 多个消费者可以获得消息
    • 在发布者和订阅者之间存在时间依赖性。发布者需要创建一个订阅(subscription),以便客户能够购订阅。订阅者必须保持持续的活动状态以接收消息,除非订阅者创建了持久的订阅。在那种情况下,在订阅者未连接时发布的消息将在订阅者重新连接时重新发布。

传统API

传统API提供的主要接口如下:

  • ConnectionFactory:客户端用来创建连接的受管对象。简化API也会使用此接口。

  • Connection:客户端到JMS提供者之间的活动连接。

  • Session:发送和接收消息的一个单线程上下文。

  • MessageProducer:由Session创建的对象,用于发送消息到Queue或Topic

  • MessageConsumer:由Session创建的对象,用于接收Queue或Topic中的消息

简化API

简化API与传统API提供的消息功能是一样的,但是它需要的接口更少、使用更方便。 简化API提供的主要接口如下:

  • ConnectionFactory:客户端用来创建连接的受管对象。传统API也会使用此接口。
  • JMSContext:客户端到JMS提供者之间的活动连接,以及发送和接收消息的一个单线程上下文。
  • JMSProducer:由JMSContext创建的对象,用于发送消息到Queue或Topic
  • JMSConsumer:由JMSContext创建的对象,用于接收Queue或Topic中的消息

在简化API中,一个JMSContext对象封装了传统API中Connection和Session两个对象的行为。

开发一个JMS客户端

一个使用传统API的JMS客户端典型的使用步骤如下:

  • 使用JNDI查找一个ConnectionFactory对象
  • 使用JNDI查找一个或多个Destination对象
  • 使用ConnectionFactory创建一个JMS Connection对象
  • 使用Connection创建一个或多个JMS Session对象
  • 使用Session和Destination对象创建需要的MessageProducer和MessageConsumer对象
  • 通知Connection对象开始投递消息

Active MQ是完全实现JMS规范的JMS客户端

Hello World

创建Hello World项目

创建gradle项目,并编辑build.gradle

    compile group: 'org.apache.activemq', name: 'activemq-all', version: '5.15.9'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.8'

创建生产者

public class HelloWorldProducer implements Runnable {
@Override
public void run() {
try {
// 1. 创建连接工厂
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
// 2. 创建连接
Connection connection = connectionFactory.createConnection();
connection.start();
// 3. 创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4. 创建目的地(主题或队列)
Destination destination = session.createQueue("TEST.FOO");
// 5. 从会话创建到目的地的消息发布者
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// 6. 创建并发布消息
String text = "Hello world! From: " + Thread.currentThread().getName() + " : " + this.hashCode();
TextMessage message = session.createTextMessage(text);
System.out.println("Sent message: " + message.hashCode() + " : " + Thread.currentThread().getName());
producer.send(message); // 7. 销毁资源
session.close();
connection.close();
} catch (JMSException e) {
System.out.println("Caught: " + e);
e.printStackTrace();
}
}
}

创建消费者

public class HelloWorldConsumer implements Runnable, ExceptionListener {
@Override
public void run() {
try {
// 1. 创建连接工厂
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
// 2. 创建连接
Connection connection = connectionFactory.createConnection();
connection.start();
// 3. 创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4. 创建目的地(主题或队列)
Destination destination = session.createQueue("TEST.FOO");
// 5. 从会话创建到目的地的消息消费者
MessageConsumer consumer = session.createConsumer(destination);
// 6. 等待接收消息
Message message = consumer.receive(1000);
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
String text = textMessage.getText();
System.out.println("Received: " + text);
} else {
System.out.println("Received: " + message);
} // 7. 销毁资源
consumer.close();
session.close();
connection.close();
} catch (JMSException e) {
System.out.println("Caught: " + e);
e.printStackTrace();
}
} @Override
public synchronized void onException(JMSException exception) {
System.out.println("JMS Exception occured. Shutting down client.");
}
}

测试类

public class App {
public static void main(String[] args) throws InterruptedException {
thread(new HelloWorldProducer(), false);
thread(new HelloWorldProducer(), false);
thread(new HelloWorldConsumer(), false);
Thread.sleep(1000);
thread(new HelloWorldConsumer(), false);
thread(new HelloWorldProducer(), false);
thread(new HelloWorldConsumer(), false);
thread(new HelloWorldProducer(), false);
Thread.sleep(1000);
thread(new HelloWorldConsumer(), false);
thread(new HelloWorldProducer(), false);
thread(new HelloWorldConsumer(), false);
thread(new HelloWorldConsumer(), false);
thread(new HelloWorldProducer(), false);
thread(new HelloWorldProducer(), false);
Thread.sleep(1000);
thread(new HelloWorldProducer(), false);
thread(new HelloWorldConsumer(), false);
thread(new HelloWorldConsumer(), false);
thread(new HelloWorldProducer(), false);
thread(new HelloWorldConsumer(), false);
thread(new HelloWorldProducer(), false);
thread(new HelloWorldConsumer(), false);
thread(new HelloWorldProducer(), false);
thread(new HelloWorldConsumer(), false);
thread(new HelloWorldConsumer(), false);
thread(new HelloWorldProducer(), false);
} public static void thread(Runnable runnable, boolean daemon) {
Thread brokerThread = new Thread(runnable);
brokerThread.setDaemon(daemon);
brokerThread.start();
}
}

运行我们的测试程序,控制台将会打印:

Sent message: 507732978 : Thread-6
Sent message: 2056557229 : Thread-0
Sent message: 39234146 : Thread-8
Sent message: 1100925878 : Thread-13
Sent message: 1566392082 : Thread-17
Sent message: 1329793151 : Thread-1
Sent message: 988436874 : Thread-16
Received: Hello world! From: Thread-6 : 1442537083
Received: Hello world! From: Thread-1 : 1531760310
Received: Hello world! From: Thread-0 : 1817576164
Received: Hello world! From: Thread-8 : 262381200
Received: Hello world! From: Thread-17 : 1647178742
Received: Hello world! From: Thread-13 : 1610404140

消息队列(三)Apache ActiveMQ的更多相关文章

  1. 消息队列MQ - Apache ActiveMQ

    Apache ActiveMQ是Apache软件基金会所研发的开放源码消息中间件:由于ActiveMQ是一个纯Jave程式,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行. 1.que ...

  2. 关于消息队列的使用----ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ

    一.消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有ActiveMQ,RabbitM ...

  3. Java消息队列-Spring整合ActiveMq

    1.概述 首先和大家一起回顾一下Java 消息服务,在我之前的博客<Java消息队列-JMS概述>中,我为大家分析了: 消息服务:一个中间件,用于解决两个活多个程序之间的耦合,底层由Jav ...

  4. 消息系统之Apache ActiveMQ

    一.下载运行MQ服务 1.下载ActiveMQ :http://activemq.apache.org/ 2.解压缩: 进入bin目录 win32和win64对应不同位的操作系统,选择进入 点击act ...

  5. 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)

    Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...

  6. OpenStack 安装数据库和rabbitmq消息队列 (三)

    一)安装配置数据库 1.1.安装包 # yum install mariadb mariadb-server python2-PyMySQL -y 1.2.配置数据库 # vim /etc/my.cn ...

  7. 消息队列RabbitMq、ActiveMq、ZeroMq、kafka之间的比较

    MQ框架非常之多,比较流行的有RabbitMq.ActiveMq.ZeroMq.kafka.这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求.下面我列出这些MQ之间的对比数据和资料. 第一部 ...

  8. 转载:关于消息队列的使用----ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ

    转载: http://blog.csdn.net/konglongaa/article/details/52208273

  9. 【ActiveMQ】持久化消息队列的三种方式

    1.ActiveMQ消息持久化方式,分别是:文件.mysql数据库.oracle数据库 2.修改方式: a.文件持久化: ActiveMQ默认的消息保存方式,一般如果没有修改过其他持久化方式的话可以不 ...

  10. RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

    消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...

随机推荐

  1. Day2-Python3基础-文件操作

    1. 字符编码与转码 需知: 1.在python3默认编码是unicode 2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so ut ...

  2. PDO和Mysqli的区别

    参考:http://www.cnblogs.com/feng18/p/6523646.html 人家写的不错

  3. zerotier 远程办公方案

    武汉新肺炎疫情下,搞得人心惶惶.很多公司都要求前期远程办公 我厂日常有在家远程应急支持的情况,所以公司很早就有VPN服务.只需要申请VPN服务,开通之后就可以连上公司各种公共资源. 然而对于一些非公共 ...

  4. 【WPF学习】第四章 加载和编译XAML

    前面已经介绍过,尽管XAML和WPF这两种技术具有相互补充的作用,但他们也是相互独立的.因此,完全可以创建不使用XAML和WPF应用程序. 总之,可使用三种不同的编码方式来创建WPF应用程序: 只使用 ...

  5. SpringBoot + Mybatis 和ssm 使用数据库的区别

    积少成多 ----  仅以此致敬和我一样在慢慢前进的人儿 相关内容: https://www.cnblogs.com/h-c-g/p/10252121.html 引 言 接触SpringBoot 后, ...

  6. CDH 离线安装 CM

    CDH支持Yum包,Tar包,RPM包,Cloudera Manager(CM)四种安装方式 Cloudera Manager(CM) 用于CDH集群管理,可进行节点安装,配置,服务管理等,提供Web ...

  7. Jpofiler

    参考链接: https://blog.csdn.net/u010638673/article/details/81703942

  8. C语言寒假大作战03

    这个作业属于哪个课程 软件4班 这个作业要求在哪里 C语言寒假大作战03 这个作业的目标 增加菜单程序各年级题目操作函数 参考文献 随机数rand 2.2.2 设计思路和遇到的问题 这次作业写好没多久 ...

  9. 如何更改Jframe里Jpanel的大小

    先贴代码: package xiya; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; ...

  10. Codeforces_723_B

    http://codeforces.com/problemset/problem/723/B 求括号内单词数和括号外最大单词长度,注意细心,尤其是ok和sum的置0. #include<iost ...