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 ...
随机推荐
- leetcode的Hot100系列--461. 汉明距离
求两个数的二进制位不同的位置,最先想到的就是异或操作, 异或:按位运算,相同为0,不同为1. 比如: a = 6 对应的二进制表示为: 0 0 1 1 1 b = 9 对应的二进制表示为: 0 1 ...
- HDU 6058:Kanade's sum(思维)
题目链接 题意 给出一个n和一个k,求1~n的每个区间的第k大的总和是多少,区间长度小于k的话,贡献为0. 思路 首先有一个关系:当一个数是第k大的时候,前面有x个比它大的数,那么后面就有k-x-1个 ...
- Python 的8个关键要素
1.数据类型 2.对象引用 3.组合数据类型 4.逻辑操作符 5.控制流语句 6.算术操作符 7.输入/输出 8.函数的创建与调用
- gePlugin封装成winform控件,一行代码即可加载。
将插件直接封装为控件,大大简化了GEPlugin的使用.多数常用功能也已经封装完毕,其他功能全部开放接口,直接调用即可. 1. GepluginControl控件传送门: 链接:https://pan ...
- kuangbin专题 专题一 简单搜索 Prime Path POJ - 3126
题目链接:https://vjudge.net/problem/POJ-3126 题意:给你两个四位的素数N,M,每次改变N四位数中的其中一位,如果能经过有限次数的替换变成四位数M,那么求出最少替换次 ...
- @ApiImplicitParam注解
@Api:用在请求的类上,表示对类的说明 tags="说明该类的作用,可以在UI界面上看到的注解" value="该参数没什么意义,在UI界面上也看到,所以不需要配置&q ...
- Spring Cloud Alibaba | Nacos集群部署
目录 Spring Cloud Alibaba | Nacos集群部署 1. Nacos支持三种部署模式 2. 集群模式下部署Nacos 2.1 架构图 2.2 下载源码或者安装包 2.3 配置集群配 ...
- 使用kubectl管理k8s集群(二十九)
前言 在搭建k8s集群之前,我们需要先了解下kubectl的使用,以便在集群部署出现问题时进行检查和处理.命令和语法记不住没有关系,但是请记住主要的语法和命令以及帮助命令的使用. 在下一篇,我们将讲述 ...
- C程序中可怕的野指针
一.疑问点指针是C语言一个很强大的功能,同时也是很容易让人犯错的一个功能,用错了指针,轻者只是报个错,重者可能整个系统都崩溃了.下面是大家在编写C程序时,经常遇到的一种错误的使用方法,也许在你的学习和 ...
- 视频4K技术的解读
前几年4K技术就已经有人提及,今年更是成了一个非常热门的词汇,而且4K技术已经普遍应用于各类终端,如电视机.机顶盒.手机等.那么如何来理解4K这个东东呢?今天博主就谈谈自己对4K技术的认识. 博主认为 ...