02_ActiveMQ入门
【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入门的更多相关文章
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- Oracle分析函数入门
一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- Angular2入门系列教程4-服务
上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- wepack+sass+vue 入门教程(二)
六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...
- wepack+sass+vue 入门教程(一)
一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...
随机推荐
- 【转】xml文件中加入本地的dtd约束文件
首先,我是以加载Struts2的来演示: 1 我们可以看到,越是文件中的 显示的是PUBLIC, 即从网络中获取约束文件dtd ,此时我需要将其配置成从自己的本地来获取dit文件 首先,先要有stru ...
- Android 单选按钮(RadioButton)和复选框(CheckBox)的使用
1.RadioButton (1)介绍 (2)单选按钮点击事件的用法 (3)RadioButton与RadioGroup配合使用实现单选题功能 (4)xml布局及使用 <?xml version ...
- Nginx负载均衡详解
upstream mysvr { server 192.168.10.121:3333; server 192.168.10.122:3333; } server { .... location ...
- A. Right-Left Cipher Round #528 (Div. 2)【字符串】
一.题面 题目链接 二.分析 该题就是一个字符串的还原.长度为奇数时从左边开始,长度为偶数时从右边开始. 三.AC代码 #include <bits/stdc++.h> using nam ...
- SiteServer CMS简介
SiteServer CMS 是中国在.NET平台下.强大的企业站开源CMS内容管理系统和网站群系统. 能够最低的成本.最少的人力投入在最短的时间内架设好一个功能齐全.性能优异.规模庞大并易于维护的网 ...
- Phyton pymssql连接数据库
import pymssql # conn = pymssql.connect(server='longdabing',user='sa',password='sasa',database='long ...
- phantomjs的和谷歌浏览器的简单使用
一.phantomjs的简单使用 ''' 什么是phantomJs:无界面的浏览器 ''' from selenium import webdriver from time import sleep ...
- 【网络】访问控制列表(ACL)
目的:172.16.12.1可以telnet到172.16.12.254,但是无法ping通172.16.12.254 Router0配置: 配置enable密码(必须,否则无法进入特权模式): r1 ...
- Maven-常规问题
1.编译(compile)Maven项目时,报错: -Dmaven.multiModuleProjectDirectory system property is not set. 处理方案:Windo ...
- docker 解决容器时间与主机时间不一致的问题
环境: 1.阿里云ecs服务器 2.docker 3.docker镜像 centos7.4.1708 方法一: 查看主机时间: [root@iZbp1625jeg61bc2zzfcotZ docker ...