【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. VS2010 由于缺少调试目标"xx.exe"

    有两种可能会造成这种现像.A.配制属性出了问题. 一种方法:右击“解决方案”->“属性”,在弹出的“属性页”框中,选择左边的“配置属性”,在右边,将应用程序的生成那个框框勾上,二可能是这里的属性 ...

  2. zip与unzip

  3. Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.

    分析:还是权限问题,所以给他加上权限就可以了!! 解决:chmod +s /bin/netstat

  4. redis中使用lua脚本

    lua脚本 Lua是一个高效的轻量级脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能 使用脚本的好处 1.减少网络开销,在Lua脚 ...

  5. 选择排序 Selection Sort

    选择排序 Selection Sort 1)在数组中找最小的数与第一个位置上的数交换: 2)找第二小的数与第二个位置上的数交换: 3)以此类推 template<typename T> / ...

  6. CF D - Beautiful Graph(dfs 染色问题吧)给你一个图,每个节点可以赋值1,2,3三种数字,相邻的节点的和必须是奇数,问有多少中方法。

    题意: 给你一个图,每个节点可以赋值1,2,3三种数字,相邻的节点的和必须是奇数,问有多少中方法. 分析: 很容易就可以发现如果这个图中是有奇数的环的话,那这是肯定不行的 ,否则这个环的贡献是为2^s ...

  7. HDU - 1520 树形DP入门题

    写了两种DP,第一种是按照自己习惯来xjb敲的,第二种参考别人 熟悉一下树形DP的套路 dp[i][]是维护i及以下的关系最优值的,所以我觉得两次DP记忆搜索之间不清-1应该是正确的(也就做了一次加法 ...

  8. 1149 Dangerous Goods Packaging (25 分)

    When shipping goods with containers, we have to be careful not to pack some incompatible goods into ...

  9. C. Nice Garland-------字符串

    C. Nice Garland time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  10. Phyton Flask框架学习记录。

    注意:在左侧菜单栏(在JQuery插件库下载的)右边是采用<iframe> 标签嵌入其他页面,此时标签的src应用用后台中的方法名称(本人测试用的是无参数的方法), 而页面跳转window ...