1. JMS的API结构

  

  其实上图中的五个API在第一节中我们都已经使用到了。本节将会讲非持久化和持久化topic的使用。

2. JMS的基本开发步骤

  1. 创建一个JMS工厂,  ConnectionFactory

  2.  通过Connection Factory来创建JMS的Connection

  3. 启动JMS connection

  4. 通过JMS connection来创建JMS Session

  5. 创建JMS destination

  6. 创建JMS producer或JMS Message,并设置destination

  7. 创建一个JMS consumer或注册一个JMS message listener

  8. 发送或接受JMS message(s);

  9. 关闭所有JMS资源(connection,session,producer,consumer)

3. 非持久的topic消息实例

  1.  非持久化topic消息的发送。

    基本跟第一节中的发送队列消息一致,只需要将创建Destination的地方由创建queue(队列)改为创建Topic即可。例如:

  Topic topic = session.createTopic("myTopic");

  2. 非持久化的topic消息的接收

    1). 接收方必须要在线,因为消息不会存储起来,然后客户端在发送消息,接收方才能收到消息。

    2) 同样将创建Destination的地方由创建queue替换成创建Topic

    3) 使用while循环接受消息

 完整代码如下:

  生产者

package com.wangx.activemq.topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class NoPersistenceSender {

    /**
* 默认访问路径
*/
private static final String DEFAULT_URL = ActiveMQConnectionFactory.DEFAULT_BROKER_URL;
/**
* 默认用户名
*/
private static final String DEFAULT_USER = ActiveMQConnectionFactory.DEFAULT_USER;
/**
* 默认密码
*/
private static final String DEFAULT_PASSWORD = ActiveMQConnectionFactory.DEFAULT_PASSWORD; private Session getSession() throws JMSException {
ConnectionFactory factory = new ActiveMQConnectionFactory(DEFAULT_USER, DEFAULT_PASSWORD, DEFAULT_URL);
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
return session;
} public void send() throws JMSException {
Session session = getSession();
//创建topic
Topic topic = session.createTopic("myTopic");
MessageProducer messageProducer = session.createProducer(topic); for (int i = 0; i < 9; i++) {
TextMessage textMessage = session.createTextMessage("Message NoPersistence" + i);
messageProducer.send(textMessage);
System.out.println("发送者发送的消息" + textMessage.getText());
}
session.commit();
session.close();
} public static void main(String[] args) throws JMSException {
NoPersistenceSender sender = new NoPersistenceSender();
sender.send();
}
}

  消费者 

package com.wangx.activemq.topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class NoPersistenceReceiver {

    /**
* 默认访问路径
*/
private static final String DEFAULT_URL = ActiveMQConnectionFactory.DEFAULT_BROKER_URL;
/**
* 默认用户名
*/
private static final String DEFAULT_USER = ActiveMQConnectionFactory.DEFAULT_USER;
/**
* 默认密码
*/
private static final String DEFAULT_PASSWORD = ActiveMQConnectionFactory.DEFAULT_PASSWORD; private Session getSession() throws JMSException {
ConnectionFactory factory = new ActiveMQConnectionFactory(DEFAULT_USER, DEFAULT_PASSWORD, DEFAULT_URL);
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
return session;
} public void receive() throws JMSException {
Session session = getSession();
//创建非持久化的topic
Destination destination = session.createTopic("myTopic");
MessageConsumer messageConsumer = session.createConsumer(destination);
Message message = messageConsumer.receive();
//使用while接受消息
while (message != null) {
TextMessage textMessage = (TextMessage) message;
System.out.println("接收者接受到的消息:" + textMessage.getText());
message = messageConsumer.receive(); session.commit();
} 
session.close();
}
public static void main(String[] args) throws JMSException { NoPersistenceReceiver receiver = new NoPersistenceReceiver(); receiver.receive(); } }

4. 持久化Topic实例

  1. 持久化消息发送

    它与非持久化消息发送的示例区别主要有以下两点

    1)必须要设置使用MessageProducer.setDeliveryMode()方法设置持久化,它默认是不持久化的。

      例如: 

  //设置持久化消息
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);

    2)connection的start()方法必须放在持久化设置之后。

  2. 持久化消息的接收

    跟非持久化相比, 主要注意一下四点:

    1. 需要在连接上设置消费者客户端id,用来识别消费者

    2. 需要创建TopicSubscriber来订阅

    3. 需要设置好了TopicSubscriber和客户端id后才调用connection.start()方法

    4. 一定要先运行一次,等于想像消息中间件注册这个消费者,然后再运行生产者发送消息,这个时候,无论消费者是否在线,都将会受到消息,不在线的话,下次连接的时候,会把没有收到过的消息都接收下来。

  完整代码如下

  生产者: 

package com.wangx.activemq.topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class PersistenceSender {

    /**
* 默认访问路径
*/
private static final String DEFAULT_URL = ActiveMQConnectionFactory.DEFAULT_BROKER_URL;
/**
* 默认用户名
*/
private static final String DEFAULT_USER = ActiveMQConnectionFactory.DEFAULT_USER;
/**
* 默认密码
*/
private static final String DEFAULT_PASSWORD = ActiveMQConnectionFactory.DEFAULT_PASSWORD; public void send() throws JMSException {
ConnectionFactory factory = new ActiveMQConnectionFactory(DEFAULT_USER, DEFAULT_PASSWORD, DEFAULT_URL);
Connection connection = factory.createConnection();
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//创建topic
Destination destination = session.createTopic("myTopic2");
MessageProducer messageProducer = session.createProducer(destination);
//设置持久化消息, 默认是非持久化
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
//start()放在设置持久化之后
connection.start(); for (int i = 0; i < 9; i++) {
TextMessage textMessage = session.createTextMessage("Message Persistence" + i);
messageProducer.send(textMessage);
System.out.println("发送者发送的消息" + textMessage.getText());
}
session.commit();
session.close();
connection.close();
} public static void main(String[] args) throws JMSException {
PersistenceSender sender = new PersistenceSender();
sender.send();
}
}

  消费者: 

package com.wangx.activemq.topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class PersistenceReceiver {

    /**
* 默认访问路径
*/
private static final String DEFAULT_URL = ActiveMQConnectionFactory.DEFAULT_BROKER_URL;
/**
* 默认用户名
*/
private static final String DEFAULT_USER = ActiveMQConnectionFactory.DEFAULT_USER;
/**
* 默认密码
*/
private static final String DEFAULT_PASSWORD = ActiveMQConnectionFactory.DEFAULT_PASSWORD; public void receive() throws JMSException {
ConnectionFactory factory = new ActiveMQConnectionFactory(DEFAULT_USER, DEFAULT_PASSWORD, DEFAULT_URL);
Connection connection = factory.createConnection();
//注册客户端id
connection.setClientID("wangx1");
connection.start();
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//创建topic
Topic topic = session.createTopic("myTopic2");
//创建topicSubscriber
TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic, "wangx1");
//启动connection
connection.start();
Message message = topicSubscriber.receive();
while (message != null) {
TextMessage textMessage = (TextMessage) message;
System.out.println("接收者接受到的消息:" + textMessage.getText());
message = topicSubscriber.receive();
session.commit();
}
session.close();
connection.close();
} public static void main(String[] args) throws JMSException {
PersistenceReceiver receiver = new PersistenceReceiver();
receiver.receive();
}
}

5. 关于持久化和非持久化消息

  5.1 持久化消息

    这是ActiveMQ的默认传送方式,此模式保证这些消息制备传送一次和成功使用一次,对于这些消息,可靠性是优先考虑的,可靠性的另一个重要的另一个方面是确保持久性消息传至目标后,消息服务在向消费者传送他们之前不会丢失这些消息。

  这意味着在持久性消息传至目标时,消息服务将其放入持久性数据存储,如果消息服务由于某种原因导致失败,它可以恢复次消息并将此消息传送至相应的消费者。虽然增加了消息传送的开销,但是却增加了可靠性。

  5.2 非持久化消息

    保证这些消息最多被传送一次,对于这些消息,可靠性并不是主要的考虑因素。并不要求持久性的存储数据,也不保证消息服务由于某种原因导致失败后消息不会丢失。

 有两种方法制定传送模式

 使用setDeliveryMode方法,这样所有的消息都采用此种传送模式,例如:

//设置持久化消息, 默认是非持久化
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);

 也可以使用send()方法为每一条消息设置传送模式,例如:

 messageProducer.send(textMessage, DeliveryMode.PERSISTENT,20,20);

ActiveMQ学习笔记(4)----JMS的API结构和开发步骤的更多相关文章

  1. ActiveMQ学习笔记(二) JMS与Spring

    上文可见,JMS Native API使用起来不是特别方便.好在Spring提供了很好的JMS支持. (一)配置ConnectionFactory 如果使用连接池的话,不要忘记activemq-poo ...

  2. ActiveMQ学习笔记(一) JMS概要

    (一)什么是JMS jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  3. Android(java)学习笔记262:JNI之工具快速开发步骤

    下面通过一个案例说明一下,利用工具jni快速开发步骤 1.新建一个Android工程,命名为"03_对int数组加1",如下: 2. 在MainActivity.java中对add ...

  4. Android(java)学习笔记206:JNI之工具快速开发步骤

    下面通过一个案例说明一下,利用工具jni快速开发步骤 1.新建一个Android工程,命名为"03_对int数组加1",如下: 2. 在MainActivity.java中对add ...

  5. ActiveMQ学习笔记(5)——使用Spring JMS收发消息

      摘要 ActiveMQ学习笔记(四)http://my.oschina.net/xiaoxishan/blog/380446 中记录了如何使用原生的方式从ActiveMQ中收发消息.可以看出,每次 ...

  6. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  7. VSTO 学习笔记(十)Office 2010 Ribbon开发

    原文:VSTO 学习笔记(十)Office 2010 Ribbon开发 微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个R ...

  8. mybatis 学习笔记(三):mapper 代理开发 dao 层

    mybatis 学习笔记(三):mapper 代理开发 dao 层 优势 通过使用mapper 代理,我们可以不需要去编写具体的实现类(使用 getMapper() 方法自动生成),只需编写接口即可, ...

  9. AMQ学习笔记 - 02. JMS客户端编程模型

    概述 客户端编程模型,是讲如何使用JMS API实现Java应用程序和JMS Provider的通信. 消息传送模式 消息传送模式又称为消息传送域,JMS API定义了两种模式:PTP和Pub/Sub ...

随机推荐

  1. JS装饰器模式

    装饰器模式:在不改变原对象的基础上,通过对其进行包装拓展(添加属性或者方法),保护原有功能的完整性需要条件:原对象,新内容(属性/方法)个人理解:重新实现一下,原对象的方法,在方法内容,先执行原对象的 ...

  2. ajax的post提交方式和传统的post提交方式哪个更快?

    如果同时用ajax和post提交先执行哪个呢?是ajax返回后再执行post呢还是同时执行? ajax的post提交方式和传统的post提交方式哪个更快? >> php这个答案描述的挺清楚 ...

  3. C++ should define all local variable outside the loop?

    see the following two examples, the conclusion is that we should define variable in the loop if it c ...

  4. 01《UML大战需求分析》阅读笔记之一

    在大二的时候就已经在课堂上对UML也就是统一建模语言有了初步的了解,但是却不怎么明白,虽然可以画图可以完成任务,但是有些糊里糊涂.所以特地把这门书作为精读书籍,想要更加深度地学习UML.很多内容只用语 ...

  5. GCC中的弱符号与强符号

    GCC中的弱符号与强符号 我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误.比如我们在目标文件A和目标文件B都 ...

  6. iproute2+tc notes

    iproute2+tc notes The iproute2+tc package allows access to the variety of neat new networking featur ...

  7. Lost Cows POJ - 2182 二分 + 树状数组

    Code: #include<cstdio> #include<stack> #include<cstring> #include<algorithm> ...

  8. IOS - 总结(网络状态变更)

    - (void)initNetworkMonitor { NSURL *baseURL = [NSURL URLWithString:@"http://www.baidu.com/" ...

  9. 【NOI2001】食物链

    [NOI2001]食物链 题意 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B ...

  10. [luogu3369] 普通平衡树(splay模板)

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1.插入 xx 数 2.删除 xx 数(若有多个相同的数,因只删除一个) 3.查询 xx 数的排名(排名定义为比 ...