JMS入门简介
一、JMS是什么
1.JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
2.JMS是一种与厂商无关的 API,用来访问收发系统消息,它类似于JDBC(Java Database Connectivity)。这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。
二、对象模型
三、两种通用类型特点
点对点消息模型有如下特性:
1.每个消息只有一个接受者
2.消息发送者和消息接受者并没有时间依赖性
3.当消息发送者发送消息的时候,无论接收者程序在不在运行,都能获取到消息
发布/订阅消息模型有如下特性:
1.一个消息可以传递给多个订阅者
2.发布者和订阅者有时间依赖性,只有当客户端创建订阅后才能接受消息,且订阅者需一直保持活动状态以接收消息

四、上代码
1.点对点模式:
1).消息的生产者
package com.jinchi.jms;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JMSProducer {
private static final String USERNAME=ActiveMQConnection.DEFAULT_USER; // 默认的连接用户名
private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD; // 默认的连接密码
private static final String BROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL; // 默认的连接地址
private static final int SENDNUM=10; // 发送的消息数量
/**
* 消息生产者
* @param args
*/
public static void main(String[] args) {
//连接工厂
ConnectionFactory cFactory;
//连接
Connection connection = null;
//会话
Session session;
//消息目的地
Destination destination;
//消息生产者
MessageProducer messageProducer;
//实例化工厂
cFactory=new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKEURL);
try {
//通过工厂获得连接
connection=cFactory.createConnection();
//启动连接
connection.start();
//创建session
session=connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//创建消息队列
destination=session.createQueue("FirstQueue1");
//创建消息生产者
messageProducer=session.createProducer(destination);
//发送消息
sendMessage(session,messageProducer);
session.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
if (connection!=null) {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
public static void sendMessage(Session session, MessageProducer messageProducer)throws Exception {
for (int i = 0; i < SENDNUM; i++) {
TextMessage textMessage=session.createTextMessage("ActiveMQ发送次数:"+i);
System.out.println("发送消息:"+"ActiveMQ发送次数:"+i);
messageProducer.send(textMessage);
}
}
}
2).消息的消费者
package com.jinchi.jms;
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 org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JMSconsumer2 {
private static final String USERNAME=ActiveMQConnection.DEFAULT_USER;
private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
private static final String BORK_STRING=ActiveMQConnection.DEFAULT_BROKER_URL;
public static void main(String[] args) {
//连接工厂
ConnectionFactory cFactory;
//连接
Connection connection;
//会话
Session session;
//消费的目的地
Destination destination;
//消息的消费者
MessageConsumer messageConsumer;
//实例化工厂
cFactory=new ActiveMQConnectionFactory(USERNAME,PASSWORD,BORK_STRING);
try {
//通过工厂获取连接对象
connection=cFactory.createConnection();
//启动连接
connection.start();
//创建会话
session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建连接的消息队列
destination=session.createQueue("FirstQueue1");
//创建消息消费者
messageConsumer=session.createConsumer(destination);
//注册消息监听
messageConsumer.setMessageListener(new JMSListenre());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3).消息消费者监听事件
package com.jinchi.jms;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* 消息监听
* @author Admin
*
*/
public class JMSListenre implements MessageListener{
@Override
public void onMessage(Message message) {
try {
System.out.println("收到的消息:"+((TextMessage)message).getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.发布/订阅消息模型:
1).消息的发布者
package com.jinchi.jms2;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JMSProducer {
private static final String USERNAME=ActiveMQConnection.DEFAULT_USER;
private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
private static final String BORK=ActiveMQConnection.DEFAULT_BROKER_URL;
private static final int SEND=10;
public static void main(String[] args) {
// 连接工厂
ConnectionFactory cFactory;
//连接
Connection connection = null;
//会话
Session session;
//消息的目的地
Destination destination;
//消息的生产者
MessageProducer messageProducer;
//实例化工厂
cFactory=new ActiveMQConnectionFactory(USERNAME,PASSWORD,BORK);
try {
//通过工厂获取连接对象
connection=cFactory.createConnection();
//连接
connection.start();
//会话
session=connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//创建消息队列
destination=session.createTopic("FirstQueue2");
//创建消息生产者
messageProducer=session.createProducer(destination);
//发送消息
sendMessage(session,messageProducer);
session.commit();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if (connection!=null) {
try {
connection.close();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void sendMessage(Session session, MessageProducer messageProducer) {
for (int i = 0; i < SEND; i++) {
try {
TextMessage textMessage=session.createTextMessage("ActiveMQ发送次数:"+i);
System.out.println("发送消息:"+"ActiveMQ发送次数:"+i);
//发送
messageProducer.send(textMessage);
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
2).消息的订阅者,需要创建两个订阅者,用于查看发布的消息是否都能被两个订阅者消费
①第一个订阅者:
package com.jinchi.jms2;
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 org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JMSconsumer {
private static final String USERNAME=ActiveMQConnection.DEFAULT_USER;
private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
private static final String BORKURL=ActiveMQConnection.DEFAULT_BROKER_URL;
public static void main(String[] args) {
//连接工厂
ConnectionFactory cFactory;
//连接
Connection connection;
//会话
Session session;
//消费目的地
Destination destination;
//消息消费者
MessageConsumer messageConsumer;
//实例化工厂
cFactory =new ActiveMQConnectionFactory(USERNAME,PASSWORD,BORKURL);
try {
//通过工厂获取连接对象
connection=cFactory.createConnection();
//启动
connection.start();
//会话
session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//消费目的地
destination=session.createTopic("FirstQueue2");
//创建消息消费者
messageConsumer=session.createConsumer(destination);
//创建消费者监听
messageConsumer.setMessageListener(new JMSListener1());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
第一个订阅者监听事件:
package com.jinchi.jms2;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
public class JMSListener1 implements MessageListener{
@Override
public void onMessage(Message message) {
try {
System.out.println("订阅者一收到的消息:"+((TextMessage)message).getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
②第二个订阅者:
package com.jinchi.jms2;
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 org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JMSconsumer2 {
private static final String USERNAME=ActiveMQConnection.DEFAULT_USER;
private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
private static final String BORKURL=ActiveMQConnection.DEFAULT_BROKER_URL;
public static void main(String[] args) {
//连接工厂
ConnectionFactory cFactory;
//连接
Connection connection;
//会话
Session session;
//消息目的地
Destination destination;
//消息消费者
MessageConsumer messageConsumer;
//实例化工厂
cFactory=new ActiveMQConnectionFactory(USERNAME,PASSWORD,BORKURL);
try {
//通过工厂获取连接对象
connection=cFactory.createConnection();
//连接
connection.start();
//会话
session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//消费的目的地
destination=session.createTopic("FirstQueue2");
//创建消息消费者
messageConsumer=session.createConsumer(destination);
//创建消息监听
messageConsumer.setMessageListener(new JMSListener2());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
第二个订阅者监听事件:
package com.jinchi.jms2;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
public class JMSListener2 implements MessageListener{
@Override
public void onMessage(Message message) {
try {
System.out.println("订阅者二收到的消息:"+((TextMessage)message).getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
测试发布/订阅消息模型时,先启动两个订阅者,然后再启动发布者,否则无法达到真正的测试。
JMS入门简介的更多相关文章
- 消息中间件 JMS入门
1. JMS入门 1.1消息中间件 什么是消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,它可以在分布式环 ...
- 掌握 Ajax,第 1 部分: Ajax 入门简介
转:http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html 掌握 Ajax,第 1 部分: Ajax 入门简介 理解 Ajax 及其工作 ...
- MongoDB入门简介
MongoDB入门简介 http://blog.csdn.net/lolinzhang/article/details/4353699 有关于MongoDB的资料现在较少,且大多为英文网站,以上内容大 ...
- (转)Web Service入门简介(一个简单的WebService示例)
Web Service入门简介 一.Web Service简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从I ...
- NodeJS入门简介
NodeJS入门简介 二.模块 在Node.js中,以模块为单位划分所有功能,并且提供了一个完整的模块加载机制,这时的我们可以将应用程序划分为各个不同的部分. const http = require ...
- ASP.NET Core学习之一 入门简介
一.入门简介 在学习之前,要先了解ASP.NET Core是什么?为什么?很多人学习新技术功利心很重,恨不得立马就学会了. 其实,那样做很不好,马马虎虎,联系过程中又花费非常多的时间去解决所遇到的“问 ...
- webservice入门简介
为了梦想,努力奋斗! 追求卓越,成功就会在不经意间追上你 webservice入门简介 1.什么是webservice? webservice是一种跨编程语言和跨操作系统平台的远程调用技术. 所谓的远 ...
- Web Service入门简介(一个简单的WebService示例)
Web Service入门简介 一.Web Service简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从I ...
- Android精通教程-第一节Android入门简介
前言 大家好,给大家带来Android精通教程-第一节Android入门简介的概述,希望你们喜欢 每日一句 If life were predictable it would cease to be ...
随机推荐
- 并发编程-concurrent指南-计数器CountDownLatch
java.util.concurrent.CountDownLatch 是一个并发构造,它允许一个或多个线程等待一系列指定操作的完成. CountDownLatch 以一个给定的数量初始化.count ...
- Docker-Compose搭建单体SkyWalking
SkyWalking简介 SkyWalking是一款高效的分布式链路追踪框架,对于处理分布式的调用链路的问题定位上有很大帮助 有以下特点: 性能好 针对单实例5000tps的应用,在全量采集的情况下, ...
- HDU 1565:方格取数(1)(最大点权独立集)***
http://acm.hdu.edu.cn/showproblem.php?pid=1565 题意:中文. 思路:一个棋盘,要使得相邻的点不能同时选,问最大和是多少,这个问题就是最大点权独立集. 可以 ...
- SpringBoot 的过滤器
在Springboot里面读封装的一些常用的API,当然对过滤器也不类外了. 首先讲下Spring中的AOP的理解: AOP不是一种具体的技术,而是一种编程思想.在面向对象编程的过程中,我们很容易通过 ...
- iOS组件化开发一使用source管理远端库升级(四)
一.克隆远端库代码到本地选择master分支 1.克隆 2.代码会显示出你所有版本的tag 二.可以在Example目录下验证代码的正确行: cd 到库的文件夹然后 pod install comma ...
- c++学习书籍推荐《Exceptional C++ Style》下载
百度云及其他网盘下载地址:点我 编辑推荐 软件“风格”所要讨论的主题是如何在开销与功能之间.优雅与可维护性之间.灵活.性与过分灵活之间寻找完美的平街点.在本书中,著名的C++大师Herb Sutter ...
- 使用wincc vbs脚本查找进程及如何运行进程
使用vbs代码查看某个进程是否在运行,本文要检查的进程名为 QRscan.exe,其代码如下: sub CheckProcess Dim WMI,Objs,Process,ObjSet WMI=Get ...
- NOIP 2004 虫食算题解
问题 E: [Noip2004]虫食算 时间限制: 1 Sec 内存限制: 128 MB 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一 ...
- js深入之call、apply和bind
一. call和apply 1. 代码完整实现 Function.prototype.mycall = function (context, ...argus) { if (typeof this ! ...
- restapi(2)- generic restful CRUD:通用的restful风格数据库表维护工具
研究关于restapi的初衷是想搞一套通用的平台数据表维护http工具.前面谈过身份验证和使用权限.文件的上传下载,这次来到具体的数据库表维护.我们在这篇示范里设计一套通用的对平台每一个数据表的标准维 ...