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. (转载) Android Studio你不知道的调试技巧

    Android Studio你不知道的调试技巧 标签: android studio 2015-12-29 16:05 2514人阅读 评论(0) 收藏 举报  分类: android(74)    ...

  2. 用一个小的例子来说明为什么TCP采用三次握手才能保证连接成功

    关于TCP的三次握手,有很多朋友还在疑惑为什么是三次,而不是两次,LZ想了一下用一个例子来说明最好. 场景: 办公室有一名前台(服务器),若干业务员(fork出来的进程) 客户(客户端)   为什么我 ...

  3. cache(缓存)的作用

    cache的作用: 连接文件.内存与应用,为信息流在三者之间流动提供通道: 存储管理:对外与对内: 存取效率: 多线程: 一次存储:分批存储? 系统的缓存控制机制(虚拟内存)使用分段分页与命中机制. ...

  4. Debian下的内核编译

    如果你装了一台linux的机器,自己没有重新编译内核,那这台机器的效率就大打折扣了,因为默认安装的机器会生成许多不需要的东西,在启动的时候也会比较慢,而你要用的有些东西可能不能工作,比如,现在都把IP ...

  5. servlet缺省路径

    servlet缺省路径 servlet的缺省路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个路径.该路径对应的是一个Defaul ...

  6. Pyhton学习——Day51

    model(数据库模型)------ORM----- 表与表之间的关系(两张表) 一对多 多对多 一对一 ORM------object relation mapping python的类 class ...

  7. Java获取当天、本周、本月、本季度、本年等 开始及结束时间

    package com.zhaochao.utils; import java.text.SimpleDateFormat; import java.util.Calendar; import jav ...

  8. 归档 SCP SFTP RSYNC(数据同步)

    tar 选项  目标文件  源文件(1 2 3) tar cf **.tar file1 file2 file3 (默认情况下 cf选项只有归档没有压缩) tar xf 从归档中提取 创建tar的存档 ...

  9. vi 编辑器的日常使用

    命令行模式: 光标管理 text  屏幕 行 单词 gg 跳转到文档头部 H 跳转到屏幕首行 ^  或 数字0 跳转到行首 w 向前 G 跳转到文档尾部 M 跳转到屏幕中行 $ 跳转到行尾 b 向后 ...

  10. Linux之awk使用

    基本语法 $n :当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段 $0:执行过程中当前行的文本内容 \t:制表符 \n:换行符 -F'[:#/]' : 定义三个分隔符,注意有-F ...