Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件;由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。它能很好地支持J2EE提出的JMS(Java Message Service,即Java消息服务)规范。

端口

ActiveMQ默认配置下启动会启动816161616两个端口,其中8161是mq自带的管理后台的端口,61616是mq服务默认端口 。

8161是后台管理系统,61616是给java用的tcp端口

依赖

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

队列

  1. 当一个消息进入队列,进入队列的消息是1,等待消费的消息是1
  2. 当消息消费后,进入队列的消息是1,等待消费的消息是0,出队列的消息是1
  3. 再来一条消息,进入队列的消息是2,等待消费的消息是1

生产者

import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*; public class JmsProduce { private static final String ACTIICEMQ_URL = "tcp://192.168.211.128:61616"; public static void main(String[] args) throws JMSException { //创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIICEMQ_URL);
//获取连接
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
//创建会话session(第一个参数是事务,第二个参数是(自动)签收)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); /**
* Queue:队列
* “负载均衡”模式,平均交替分配(1.3.5 / 2.4.6)
* 如果当前没有消费者,消息不会丢失,消费者上线后,继续发送
* 一条消息只会发送给一个消费者
*/
//创建目的地
Queue queue = session.createQueue("name1");
//创建消息生产者
MessageProducer producer1 = session.createProducer(queue);
//通过消息生产者发送消息到mq队列
for (int i = 1; i <=3; i++) {
//创建消息
TextMessage textMessage = session.createTextMessage("Queue---" + i);
//通过消息生产者发送消息
producer1.send(textMessage);
}
producer1.close(); /**
* Topic:主题(发布)
* 消费者必须在线
* 如果没有消费者,消息会丢失
* 消费者多,性能会降低
*/
//创建目的地
Topic topic = session.createTopic("name2");
//创建消息生产者
MessageProducer producer2 = session.createProducer(topic);
//通过消息生产者发送消息到mq队列
for (int i = 1; i <=3; i++) {
//创建消息
TextMessage textMessage = session.createTextMessage("Topic---" + i);
//通过消息生产者发送消息
producer2.send(textMessage);
}
//关闭资源
producer2.close(); session.close();
connection.close();
}
}

生产者持久化

持久化传输:消息会先保存到磁盘中,然后再转发给订阅者,即“储存转发”。
非持久化传输:消息会保存到内存中 Queue:队列(默认就是持久化,不必设置)
持久化:messageProducer.setDeliveryDode(DeliveryMode.PERSISTENT) Topic:主题(发布)
订阅者不需一直在线,不在线,消息可以在上线时重新派发:
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT); //持久化
connection.start(); //连接MQ服务器(放在 durableSubscriber 后面)

消费者

import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import java.io.IOException; public class JmsConsumer { private static final String ACTIICEMQ_URL = "tcp://192.168.211.128:61616"; public static void main(String[] args) throws JMSException, IOException { //创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIICEMQ_URL);
//获取连接
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
//创建会话session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); /**
* Query:队列
* 如果有多个消费者消费同一个消息生产者:平均交替分配(1.3.5/2.4.6)
*/
//创建目的地
Queue queue = session.createQueue("name1");
//创建消费者
MessageConsumer consumer1 = session.createConsumer(queue); /**
* receive()获取消息(同步阻塞)
*/
while (true){
//不加参数,一直等着
//加参数,过时不候
TextMessage receive = (TextMessage) consumer1.receive(4000l);
if(null != receive){
System.out.println(receive.getText());
}else {
break;
}
}
consumer1.close(); /**
* 通过监听方式获取消息(异步)
* 当消息到达后,自动调用onMessage(Message message)方法
*/
consumer1.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
if (null != message && message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("消息监听器:" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
//保证控制台不关(不加此句,还未消费程序就结束了)
System.in.read();
consumer1.close(); /**
* Topic:主题(消费)
* 接收者必须在线
* 先启动接收,再启动生产,不然发布的消息就是废消息
*/
Topic topic = session.createTopic("name2");
//创建消费者
MessageConsumer consumer2 = session.createConsumer(topic);
consumer2.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
if (null != message && message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("消息监听器:" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
//保证控制台不关(不加此句,还未消费就关了)
System.in.read();
//关闭资源
consumer2.close(); session.close();
connection.close(); }
}

消费者持久化(订阅)

Topic:主题(订阅)
订阅者不需一直在线,不在线,消息可以在上线时重新派发: connection.setClientID("ld"); //向MQ注册成为订阅者(注册后,下线后再上线仍可以收到)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("name2");
TopicSubscriber durableSubscriber =
session.createDurableSubscriber(topic, "topic2"); //创建持久化订阅,订阅的主题:Topic
connection.start(); //连接MQ服务器(放在 durableSubscriber 后面)
Message message = durableSubscriber.receive(); //订阅者接收主题

事务与签收

  • PERSISTENT:持久性

    - 持久:服务器宕机,数据存在(默认)

    - 非持久:服务器宕机,数据不存在

  • 事务:connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

    - 如果是true,开启事务,生产者需要先执行send,再执行commit,消息才会正真提交到队列中

    - 消费者开启事务,如果事务回滚或者未提交,会再次接收到消息

  • 签收(Acknowledge):connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

    - 默认自动签收:Session.AUTO_ACKNOWLEDGE

    - 手动签收需要反馈:message.acknowledge();

    - 有事务的签收:自动手动一样,没有区别,但是必须comment()提交

ActiveMQ 基础的更多相关文章

  1. ActiveMQ基础教程----简单介绍与基础使用

    概述 ActiveMQ是由Apache出品的,一款最流行的,能力强劲的开源消息总线.ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,它非常快速,支持多 ...

  2. ActiveMQ基础使用

    概述 ActiveMQ是由Apache出品的,一款最流行的,能力强劲的开源消息总线.ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,它非常快速,支持多 ...

  3. ActiveMQ基础教程(四):.net core集成使用ActiveMQ消息队列

    接上一篇:ActiveMQ基础教程(三):C#连接使用ActiveMQ消息队列 这里继续说下.net core集成使用ActiveMQ.因为代码比较多,所以放到gitee上:https://gitee ...

  4. ActiveMQ基础教程(三):C#连接使用ActiveMQ消息队列

    接上一篇:ActiveMQ基础教程(二):安装与配置(单机与集群) 安装部署好集群环境:192.168.209.133:61616,192.168.209.134:61616,192.168.209. ...

  5. 成小胖学习ActiveMQ·基础篇

    过了个春节,回到公司的成小胖变成了成大胖.但是你们千万别以为他那个大肚子里面装的都是肥肉,里面的墨水也多了不少嘞,毕竟成小胖利用春节的半个月时间专心学习并研究了 ActiveMQ,嘿嘿……这不,为了检 ...

  6. ActiveMQ基础教程(二):安装与配置(单机与集群)

    因为本文会用到集群介绍,因此准备了三台虚拟机(当然读者也可以使用一个虚拟机,然后使用不同的端口来模拟实现伪集群): 192.168.209.133 test1 192.168.209.134 test ...

  7. ActiveMQ基础教程(一):认识ActiveMQ

    ActiveMQ是Apache软件基金会所研发开源的消息中间件,为应用程序提供高效的.可扩展的.稳定的和安全的企业级消息通信. 现在的消息队列有不少,RabbitMQ.Kafka.RocketMQ,Z ...

  8. ActiveMQ基础

    消息队列的作用 为什么使用ActiveMQ,不使用其他工具 下载安装包并启动 http://localhost:8161/admin/ (账号:admin:admin) Java实现步骤: // 1. ...

  9. ActiveMQ基础简介

    1. 什么是ActiveMQ ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现 ...

  10. ActiveMQ基础01——Linux下载安装ActiveMQ

    1.下载 下载地址:http://activemq.apache.org/ 点击按钮 下载Linux下最新版安装包,点击即可下载 2.安装ActiveMQ 将之前下载的安装包上传到linux当中,一般 ...

随机推荐

  1. Python3 From Zero——{最初的意识:006~数据编码与处理}

    一.读写CSV数据: #!/usr/bin/env python3 #-*- coding=utf8 -*- import csv with open('kxtx.csv', 'rt') as f: ...

  2. 『BASH』——Learn BashScript from Daniel Robbins——[001-002]

    ABSTRACT: Daniel Robbins is best known as the creator of Gentoo Linux and author of many IBM develop ...

  3. 2019-2020 ACM-ICPC Latin American Regional Programming Contest

    代码见:戳 easy: EIM medium-easy: BDFKL medium: ACJ medium-hard: H A - Algorithm Teaching 题意 给一些集合,现从每个集合 ...

  4. 将数据写到kafka的topic

    package test05 import java.util.Propertiesimport org.apache.kafka.clients.producer.{KafkaProducer, P ...

  5. Apache Spark 2.2.0 中文文档 - Spark Streaming 编程指南

    Spark Streaming 编程指南 概述 一个入门示例 基础概念 依赖 初始化 StreamingContext Discretized Streams (DStreams)(离散化流) Inp ...

  6. Java oop创建自定义异常

    package com.test; /** *不管是在方法定义时就使用try catch,还是在定义方法时将异常抛出在调用方法时使用try catch都能达到效果 * */public class M ...

  7. Java带头节点单链表的增删合并以及是否有环

    带头节点单链表 1.优势: 1)当链表为空时,指针指向头结点,不会发生null指针异常 2)方便特殊操作(删除第一个有效节点或者插入一个节点在表头) 3)单链表加上头结点之后,无论单链表是否为空,头指 ...

  8. 【JZOJ6273】欠钱

    description analysis 读懂题就可知\(b\)的收益即为\(a\)到\(b\)这一条链上边权的最小值 那么就是动态维护一个森林,询问链上最小值,同时必须满足儿子走向父亲 明显\(LC ...

  9. C/C++ 公有函数无法返回私有的类对象解决方案

    { 能出这种错的说明还需要提升C++,增强对类的理解 解决方案:把你的私有的对象的私有的拷贝构造或者同类赋值改为公开的 }

  10. thinkphp 获取内容

    如果需要获取渲染模板的输出内容而不是直接输出,可以使用fetch方法. fetch方法的用法和display基本一致(只是不需要指定输出编码和输出类型): 大理石平台规格 fetch('模板文件') ...