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 ...
随机推荐
- Python基础-使用range创建数字列表以及简单的统计计算和列表解析
1.使用函数 range() numbers = list(range[1,6]) print (numbers) 结果: [1,2,3,4,5] 使用range函数,还可以指定步长,例如,打印1~1 ...
- UVALive 7037:The Problem Needs 3D Arrays(最大密度子图)
题目链接 题意 给出n个点,每个点有一个值,现在要选择一些点的集合,使得(选择的点生成的逆序对数目)/(选择的点的数量)的比率最大. 思路 点与点之间生成一个逆序对可以看做是得到一个边,那么就是分数规 ...
- 基于modelform和ajax的注册
forms文件 创建ModelForm组件 from django import forms from crm import models from django.core.exceptions im ...
- Python入门基础(3 下)
接着讲列表里面的一些操作吧 列表元素访问与计数 1.统计指定元素在列表中出现的次数使用count(),这就不必细说了,直接看代码,需要记住的是括号里面放的是元素 list = [1,5,5,5,5,8 ...
- mysql 免安装版本 与问题记录
将文件解压到D盘, 创建 my.ini 配置文件, ------------------复制进去--------------------- [client] port=3306 default-cha ...
- 通俗易懂 悲观锁、乐观锁、可重入锁、自旋锁、偏向锁、轻量/重量级锁、读写锁、各种锁及其Java实现!
网上关于Java中锁的话题可以说资料相当丰富,但相关内容总感觉是一大串术语的罗列,让人云里雾里,读完就忘.本文希望能为Java新人做一篇通俗易懂的整合,旨在消除对各种各样锁的术语的恐惧感,对每种锁的底 ...
- UEditor 之初体验后记
1.UEditor 基本介绍 1.1.关于 UEditor 1.2.UEditor 现状 2.UEditor 简单使用 2.1.将 UEditor 源码集成到项目中 2.2.让 UEditor 的 U ...
- PCB SQL SERVER 数据库阻塞进程关系以思维导图方式呈现的实现方法
最近公司服务数据库同步机制常发生阻塞,时不时的导致PCB工程系统卡死现象,只有找到阻塞源头并处理掉,才以消除阻塞,但数据库中查看会话阻塞是通过二维表方式展示的父子会话进程ID的,是很难清楚的展示各会话 ...
- spring mvc 拦截器的使用
Spring MVC 拦截器的使用 拦截器简介 Spring MVC 中的拦截器(Interceptor)类似于 Servler 中的过滤器(Filter).用于对处理器进行预处理和后处理.常用于日志 ...
- grep -nr "Base64Decode" * 查找含有某字符的文件
grep -nr "Base64Decode" * 查找含有某字符的文件