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 ...
随机推荐
- POJ 1113:Wall(凸包)
http://poj.org/problem?id=1113 Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 346 ...
- 事务的隔离级别,mysql默认的隔离级别是什么?
读未提交(Read uncommitted),一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证. (1)所有事务都可以看到其他未提交事务的执行结果 (2)本隔离级别很少用于实际应用 ...
- 20131221-Dom练习-第二十六天(未完)
[1] //总结,写代码,一要动脑,理解用脑 //二要练,要动手,要有用身体记忆代码的觉悟,记忆用手 //三学编程最快的方法是,直接接触代码,用脑,用手接触代码 //面向对象的编码方式,对象还是对象, ...
- STM32F072从零配置工程-串口USART配置
也是使用HAL库进行配置,通过STMCube生成代码,可以通过这个简单的配置过程看到STMCube生成代码的一种规范: 从main函数入手观察其外设配置结构: 首先是HAL_Init()进行所有外设的 ...
- Java编程思想:擦除的补偿(数组泛型处,我有很多细节没有研究)
import sun.net.www.content.text.Generic; import java.lang.reflect.Array; import java.util.ArrayList; ...
- mysql数据库建表分类字段--尽量少用字符串--原因探索
虽然一直都知道,类型 之类的字段 直接用字符窜会很方便,不过最好还是不要用字符串:但是也不是特别清楚为什么不要用,时间久了 就忍不住用一下字符窜试试,这一试 还挺好用的,吓得我 感觉探究了一下 为什么 ...
- [PTA] 数据结构与算法题目集 6-7 在一个数组中实现两个堆栈
//如果堆栈已满,Push函数必须输出"Stack Full"并且返回false:如果某堆栈是空的,则Pop函数必须输出"Stack Tag Empty"(其中 ...
- 【微信小程序】微信小程序-实现tab
一.前言 小程序开发中,有很多封装好的控件供开发者使用,但是,很常见的tab选项卡居然没有,只能自己搞一个. 实现原理也很简单,无非是用给view(tab)设置一个点击事件bintap,并且给view ...
- Java EE.JSP.指令
JSP的指令是从JSP向Web容器发送消息,它用来设置页面的全局属性,如输出内容类型等. JSP的指令的格式为:<%@ 指令名 属性="属性值"%> 1.page指令 ...
- 浅谈CMDB
CMDB和运维自动化 一.运维 运维,指的是对已经搭建好的网络,软件,硬件进行维护.运维领域也是细分的,有硬件运维和软件运维 硬件运维主要包括对基础设施的运维,比如机房的设备,主机的硬盘,内存这些物理 ...