【ActiveMQ 入门HelloWorld例子】

【启动ActiveMQ】

1.由于本人PC是64位的,选择在bin目录下的win64/activemq.bat启动。

2.启动成功后,访问http://localhost:8161/admin/ ,输入用户名密码,默认均为admin。进入ActiveMq的web页面的控制台。

【工程截图】

【生产者Sender.java】

package test.activemq.demo;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; public class Sender {
public static void main(String[] args) throws JMSException {
/**
* 1.建立ConnectionFactory工厂对象,需要填入用户名、密码、以及要连接的地址,均使用默认,端口默认为"tcp://localhost:61616"
*/
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnectionFactory.DEFAULT_USER,
ActiveMQConnectionFactory.DEFAULT_PASSWORD,
"tcp://localhost:61616"); /**
* 2.通过ConnectionFactory工厂对象创建一个Connection连接,并且调用Connection的start()方法开启连接,Connection默认是关闭的
*/
Connection connection = connectionFactory.createConnection();
connection.start(); /**
* 3.通过Connection对象创建Session会话(上下文环境对象),用于接收消息。
* 参数1:是否启用事务
* 参数2:签收模式,一般设置为自动签收
*/
Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); /**
* 4.通过Session创建Destination对象,即一个客户端用来指定 生产者目标 和 消费者来源的 对象。
* PTP模式中:Destination被称为Queue,队列
* Pub/Sub模式中:Destination被称为Topic,主题
* 在程序中可以使用多个Queue 和 Topic
*/
Destination destination = session.createQueue("queue1"); /**
* 5.需要通过Session对象创建消息的发送或接受对象(生产者或消费者,MessageProducer/MessageConsumer)
*/
MessageProducer messageProducer = session.createProducer(destination); /**
* 6.使用MessageProducer的serDeliveryMode方法为其设置持久化特性和非持久化特性(DeliveryMode)
*/
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); //设置为不持久化 /**
* 7.最后,使用JMS规范的TextMessage形式创建数据(通过Session对象),
* 发送端使用MessageProducer的Send方法发送数据。
* 接受端使用receive方法接收数据。
*/
for(int i=;i<;i++){
TextMessage testMessage = session.createTextMessage();
testMessage.setText("我的Id的是:"+i);
messageProducer.send(testMessage);
System.out.println("【生产者发送】"+testMessage.getText());
} /**
* 8.最后记得关闭Connection连接
*/
if(connection!=null){
connection.close();
}
}
}

【Sender运行结果:Eclipse控制台】

【Sender运行结果:web控制台】

Number Of Pending Messages :等待消费的队列

Messages Enqueued  : 进入队列的消息的总数量(总数量只增不减)

Messages Dequeued :出了队列的消息的总数量(即消费了的消息数量)

【Sender运行结果:点击"queue1"查看队列详情】

【消费者Receiver.java】

package test.activemq.demo;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; public class Receiver {
public static void main(String[] args) throws JMSException {
/**
* 1.建立ConnectionFactory工厂对象,需要填入用户名、密码、以及要连接的地址,均使用默认,端口默认为"tcp://localhost:61616"
*/
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnectionFactory.DEFAULT_USER,
ActiveMQConnectionFactory.DEFAULT_PASSWORD,
"tcp://localhost:61616"); /**
* 2.通过ConnectionFactory工厂对象创建一个Connection连接,并且调用Connection的start()方法开启连接,Connection默认是关闭的
*/
Connection connection = connectionFactory.createConnection();
connection.start(); /**
* 3.通过Connection对象创建Session会话(上下文环境对象),用于接收消息。参数1:是否启用事务 参数2:签收模式,一般设置为自动签收
*/
Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); /**
* 4.通过Session创建Destination对象,即一个客户端用来指定生产者目标 和 消费者来源的 对象。
* PTP模式中:Destination被称为Queue,队列
* Pub/Sub模式中:Destination被称为Topic,主题
* 在程序中可以使用多个Queue 和 Topic
*/
Destination destination = session.createQueue("queue1"); //注意要和消息生产者的队列名一致!! /**
* 5.需要通过Session对象创建消息的发送或接受对象(生产者或消费者,MessageProducer/MessageConsumer)
*/
MessageConsumer messageConsumer = session.createConsumer(destination); /**
* 7.最后,使用JMS规范的TextMessage形式创建数据(通过Session对象),
* 发送端使用MessageProducer的Send方法发送数据。
* 接受端使用receive方法接收数据。
*/
while(true){
TextMessage msg = (TextMessage)messageConsumer.receive();
if(msg==null)
break;
System.out.println("【消费者接收】"+msg.getText());
} /**
* 8.最后记得关闭Connection连接
*/
if(connection!=null){
connection.close();
}
}
}

【Receiver运行结果:Eclipse控制台】

【Receiver运行结果:Web页面控制台】

【Receiver运行结果:点击"queue1"查看队列详情】

【重点:Connection方法使用】

在成功创建ConnectionFactory后,下一步是创建一个连接,它是JMS定义的一个接口。

ConnectionFactory负责返回Connection实现。

Connection可以与底层消息传递系统进行通信,通常客户端只使用单一连接。

根据JMS文档,Connection的目的是“利用JMS提供者封装开放的连接”,以及“客户端与提供者服务例程之间的开放TCP/IP套接字”。

Connection还应该是进行客户端身份验证的地方。

当一个Connection被创建时,它的传输默认是关闭的,必须使用start方法开启。

一个Connection可以建立一个或多个Session。

当一个程序执行完成之后,必须关闭之前创建的Connection,否则ActiveMQ不能释放资源,关闭一个Connection同样也关闭了Session、MessageProducer、MessageConsumer。

ConnectingFactory有两个创建的方法:

1.Connection createConnection();

2.Connection createConnection(String username,String password,String url);

【重点:Session方法使用】

一旦从ConnectionFactory中获得一个Connection,必须从Connection中创建一个或多个Session。

Session是一个发送或者接收消息的线程,可以使用Session创建MessageProducer、MessageConsumer 和 Message。

Session可以被事务化,也可以不被事务化。通常可通过向Connection上的创建Session方法传递一个布尔参数对其进行设置。

connection.createSession( boolean transacted , int acknowledgeMode );

transacted 使用事务标记

acknowledgeMode 签收模式

[ 结束事务有两种方法:提交、回滚。]

如果一个事务提交,消息被处理。

如果事务中有一个步骤失败,事务就回滚,这个事务中的已经被执行的动作将被撤销。

在发送消息的最后也必须要使用session.commit()方法提交事务。

[ 签收模式有三种 ]

Session.AUTO_ACKNOWLEDGE:当客户端从receiver或onMessage成功返回时,Session自动签收客户端的这条消息的收条。

Session.CLIENT_ACKNOWLEDGE:客户端通过调用消息(Message)的acknowledge方法签收消息。在这种情况下,签收发生在Session层面:签收一个已经消费的消息会自动地签收这个Session所有已消费的收条。

Session.DUPS_OK_ACKNOWLEDGE:Session不必确保对传送消息的签收,这个模式可能会引起消息的重复,但是降低了Session的开销,所以只有客户端能容忍重复的消息,才可使用。

【重点:MessageProducer】

MessageProducer是一个由Session创建的对象,用来向Destination发送消息。

void send( Destination destination , Message message );

void send( Destination destination , Message message ,  int deliveryMode , int priority, long timeToLive );

void send(  Message message );

void send( Message message ,  int deliveryMode , int priority, long timeToLive );

deliveryMode:发送模式

timeToLive:消息过期时间

ActiveMQ支持两种消息传递模式:PERSISTENT(默认)、NO_PERSOSTENT两种。

如果容忍消息丢失,那么使用非持久化(NO_PESISTENT)消息可以改善性能和减少存储的开销。

priority:消息优先级

消息的优先级从0-9共10个级别,默认4。0-4是普通消息,5-9是加急消息。JMS不要求严格按照这10个优先级发送消息,但必须保证加急消息要先于普通消息到达。

timeToLive :消息存活时间

默认情况下,消息永不会过期,如果消息在特定周期内失去意义,那么可以设置过期时间,时间为毫秒。

【重点:MessageConsumer 】 

MessageConsumer是一个由Session创建的对象,用来从Destination中接收消息。

MessageConsumer createConsumer( Destionation destination ) ;

MessageConsumer createConsumer( Destionation destination , String MessageSelector ) ;

MessageConsumer createConsumer( Destionation destination , String MessageSelector , boolean noLocal) ;

MessageConsumer createConsumer( Topic topic , String name ) ;

MessageConsumer createConsumer( Topic topic , String name ,  String MessageSelector , boolean noLocal ) ;

MessageSelector:消息选择器

noLocal:默认为false,当设置为true时,限制消费者只能接收和自己相同的连接(Connection)所发布的消息,此标志适用于主题(Topic),不适用于队列(Queue)。

name :标志订阅所对应的订阅名称,持久订阅时需要设置此参数。

public final SELECTOR = "JMS_TYPE "="MY_TAG1";该选择器检查了传入消息的JMS_TYPE属性,并确定了这个属性的值是否等于MY_TAG1,如果相等,则消息被消费,否则忽略该消息。( 消息过滤可以使用 )

【重点:Message】

JMS程序的最终目的是生产和消费的消息能被其他程序使用,JMS的Message是一个即简单又不缺乏灵活性的基本格式,允许创建不同平台上符合非JMS的程序格式的消息。

Message由以下部分组成:消息头、属性、和消息体。

BlobMessage createBlobMessage(File file);

BlobMessage createBlobMessage(InputStream in) ;

BlobMessage createBlobMessage(URL url);

BlobMessage createBlobMessage(URL url , boolean deletedByBroker);

BlobMessage createBlobMessage( );

MapMessage  createBlobMessage( );

Message  createBlobMessage( );

ObjectMessage  createBlobMessage( );

ObjectMessage  createBlobMessage( Serializable object );

TextMessage createTextMessage();

TextMessage createTextMessage( String text );

注意:我们一般会在接收端使用instanceOf方法区别数据类型。

02_ActiveMQ入门的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  3. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  4. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  5. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  6. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  7. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  8. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  9. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

随机推荐

  1. (STM32F4) Real-time Clock

    老實說Real-time Clok這項功能,我也只有在PC和手機上有見過,其他的應用產品上我也很少見到. 言歸正傳在STM32F4 RTC這項功能在IC內部就有內建,在早期的8051是如果要做RCT是 ...

  2. TX2 dts、dtb编译与反编译

    设备树(Device Tree)包括DTC(device tree compiler),DTS(device tree source和DTB(device tree blob). dtc编译器能够把 ...

  3. 洛谷 P1111 修复公路(最小生成树)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P1111 这道题的关键是读懂题: 首先根据题中的一些扎眼的字眼我们可以判断这是一道用最小生成树来做的题 ...

  4. 【转】LAMBDAFICATOR: Crossing the gap from imperative to functional programming through refactorings

    Link:http://refactoring.info/tools/LambdaFicator/ Problem Description Java 8 will support lambda exp ...

  5. JavaWeb学习笔记(一)—— Http协议

    一.什么是HTTP协议 HTTP,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览 ...

  6. 【转】xml文件中加入本地的dtd约束文件

    首先,我是以加载Struts2的来演示: 1 我们可以看到,越是文件中的 显示的是PUBLIC, 即从网络中获取约束文件dtd ,此时我需要将其配置成从自己的本地来获取dit文件 首先,先要有stru ...

  7. P4331 [BOI2004]Sequence 数字序列 (左偏树)

    [题目链接] https://www.luogu.org/problemnew/show/P4331 题目描述 给定一个整数序列\(a_1, a_2, ··· , a_n,\)求出一个递增序列\(b_ ...

  8. v-model 用在组件中

    官方文档: 使用自定义事件的表单输入组件 官方也说明了,v-model只不过是一个语法糖而已,真正的实现靠的还是 1. v-bind : 绑定响应式数据 2. 触发 input 事件 并传递数据 (核 ...

  9. centeros下安装python3

    一.查看python版本及安装python3 1. which python 可以看到预装的是2.7版本 2.安装依赖包 yum -y groupinstall "Development t ...

  10. 【研究】Metasploit自动攻击模块

    环境:kali-linux-2017.3-vm-amd64 一.安装postgresql数据库 apt-get install postgresql apt-get install rubygems ...