`
XinTeng2012
  • 浏览: 94600 次
社区版块
存档分类
最新评论

JMS入门学习

 
阅读更多

1.JMS简述

JMS (Java Message Service)是由SUN开发的一套API,它为开发者提供一套访问MOM(Message-Oriented Middleware:面向消息中间件)的标准方法。

JMS 分为两种消息域PTP(点对点)和Pub/Sub(发布/订阅)。PTP消息被产生者放入到一个队列中,消费者则从小消息列队中取走消息,消息一担取走,消息就从队列中移除。Pub/Sub消息和PTP最大的不同在于发布者发布一条消息后可以发送给所有订阅者,所有订阅者都拥有处理某一条消息的机会。(如图1)

(图1)

发布者A 发布者B

| |

--------MOM 消息中间件-----------------------

|娱乐/音乐 it/管理 |

________________________________

订阅者A 订阅者B 订阅者C (都能享受上面的服务,不用理会谁发布的)

2.JMS的一些重要接口

ConnectionFactory :创建一个受管理对象

Connection:连接到提供者的活动连接

Destination :一个封装消息目标地址的受管理对象,如消息的来源地和发送滴,根据消息域的不同有两个接口:Queue 和 Topic,前者对应PTP消息的目标地址,后者对应Pub/Sub消息的目标地址。

Session :发送和接受消息的单线程环境。(即一次会话)

MessageProducer:用于发送消息

MessageConsumer:用于接收消息

JMS高级接口与特定域接口(位于javax.jms包中)

高级接口

PTP域子接口

PUB/SUB域子接口

ConnectionFactory

QueueConnectionFactory

TopicConnectionFactory

Connection

QueueConnection

TopicConnection

Destination

QueueDestination

TopicDestination

Session

QueueSession

TopicSession

MessageProducer

QueueMessageProducer

TopicMessageProducer

MessageConsumer

QueueMessageConsumer

TopicMessageConsumer


3.一个典型的JMS程序要经过的步骤

一个典型的JMS程序要经过以下步骤才能开始创建和使用消息

1、通过JNDI查询ConnectionFactory

2、用ConnectionFactory创建一个Connection

3、用Connection创建一个或多个Session

4、通过JNDI查询一个或多个Destination

5、用Session和Destination创建对应的MessageProducer和MessageConsumer

6、启动Connection


4.JMS消息结构

JMS根据不同应用的用途定义了多种消息类型,由Message接口派生而来,一个Message由Header、Properties和Body三个部分组成。

Header是一组标准键值字段,客户端和提供者都用它来标识和路由消息。

Properties用于弥补Header的不足,可以通过手工设置其他的属性,Message提供了set<Type>Property(String name)和get<Type>Property()方式来让开发者任意定义属性。

Body消息正文,包括了发送给其他程序的消息内容,根据消息体内容的不同,JMS拥有5个消息类型,并分别通过Message的5个子接口来描述。

消息类型

说明

TextMessage

消息是一个字符

ObjectMessage

消息是一个实现了Serializable接口的对象

MapMessage

消息是一个MAP,包括一组键值对元素,键位一个字符,值为任意对象

BytesMessage

消息是一个二进制数组

StreamMessage

消息是一组JAVA原始类型数据,这些数据通过标准流操作按顺序进行填充和读取

5.消息收发的机制:

JMS事务使用了Session对它进行操作,分别拥有支持事务语义的3个方法,通过这些方法启动,提交和回滚一个事务,这些方法分别是begin()、commit()和rollback()。

消息确认是接收者在成功接收到消息后,将一个回执发送给MOM,告之已经成功接收到一种通知机制。确认方式有三种分别是:

1、Session.AUTO_ACKNOWLEDGE:在完成接收消息时,Session自动发送一个确认回执。

2、Session.CLIENT_ACKNOWLEDGE:由客户端程序通过手工调用Message.acknowledge()方法显示确认接收。

3、Session.DUPS_OK_ACKNOWLEDGE:让Session延迟发送确认回执。

例如:创建一个不需事务,自动确认的session方式

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

消息选择是一种选择机制,类似于SQL的查询条件。

发送消息例子:

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.MessageProducer;

import javax.jms.Session;

import javax.jms.TextMessage;

import javax.naming.InitialContext;

import javax.jms.Destination;

 

publicclass MessageSender {

   

    /**

     *发送方法

     *@parammsgText

     */

    publicvoid send(String msgText){

      

       // 获取jms连接

       Connection connection = null;

      

       try {

           // 获取JNDI上下文

           InitialContext ctx = new InitialContext();

           ConnectionFactory cFactory = (ConnectionFactory)ctx.lookup("jndi/jmsConn");

          

           // 获取Destination 目标地址

           Destination dest = (Destination)ctx.lookup("jndi/dest");

           ctx.close();

          

           // 获取一个MOM的连接

           connection = cFactory.createConnection();

          

           // 创建JMS会话

           Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

          

           // 创建一个指定特定目标地址的消息发送者

           MessageProducer sender = session.createProducer(dest);

          

           // 建立Body内容

           TextMessage message = session.createTextMessage(msgText);

          

           // 发送给服务器

           sender.send(message);

          

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

           try {

              connection.close();

           } catch (Exception e) {

              e.printStackTrace();

           }

       }

    }

}

接收消息例子:

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 javax.jms.TextMessage;

import javax.naming.InitialContext;

 

publicclass MessageReceiver {

   

    /**

     *接收方法

     */

    publicvoid receive(){

       Connection connection = null;

      

       try {

           // 创建JNDI上下文

           InitialContext ctx = new InitialContext();

           ConnectionFactory cFactory = (ConnectionFactory)ctx.lookup("jndi/jmsConn");

          

           // 获取目标地址信息

           Destination dest = (Destination)ctx.lookup("jndi/dest");

           ctx.close();

          

           // 获取连接

           connection = cFactory.createConnection();

          

           // 获取连接对话

           Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

          

           // 创建一个指向特定目标地址的消息消费者

           MessageConsumer receiver = session.createConsumer(dest);

          

           // 接收发送请求中的消息信息

           TextMessage textMsg = (TextMessage)receiver.receive();

          

           System.out.println("获取内容:" + textMsg.getText());        

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

           try {

              connection.close();

           } catch (JMSException e) {

              e.printStackTrace();

           }

       }

    }

}

出处:http://csevan.javaeye.com/blog/284610

分享到:
评论

相关推荐

    JMS消息模型 JMS学习.doc

    JMS学习好的帮助文档。需要的同学下载。 概述……………………………………………………………………………………………..3 体系结构………………………………………………………………………………………..4 JMS...

    JMS入门小例子以及weblogic安装,并且在weblogic中配置JMS服务

    本例详细介绍了如何配置JMS服务以及weblogic的安装及在weblogic中配置JMS服务,例子简单易懂,文档含代码,适合初学者学习使用

    JMS(java消息服务学习必备

    java消息服务学习必备,JMS基础知识了解

    JMS 入门之实例

    jms应用的一个实例,相信对学习有用!!!!1

    一头扎进JMS之ActiveMQ系列

    一头扎进JMS之ActiveMQ,本人亲测,没问题。需要学习ActiveMQ的,这是比较好的入门资料,带源码。

    JMS的Oreilly示例代码

    java消息服务一书示例代码,入门学习JMS的不妨look下

    非常有意义java入门学习笔记(推荐有c++基础的人看).txt

    现在java家族已经十分强大,每个分支都成为一门学问了,例如web前台开发用的applet,后台要用的servlet;做企业系统,EJB;消息中间件JMS;手机j2me开发手机、数字家电,这也是当初设计java的。

    Qpid学习文档

    Qpid入门学习,内含有全套下载、安装流程,以及原理说明

    JMS样例项目

    我自己用Eclipse写的JMS...完全是用来理解JMS的基础用法,没有太大的生产价值。 代码结构简单,只有三个java代码页,只演示基本功能。安装好jboss之后,不需要进行任何配置,在本机运行和编译代码。仅供学习JMS使用

    基于JMS的数据推送系统的设计与实现

    基于JMS的数据推送系统的设计与实现,是我做项目时所学所总结的详细设计思路,如果你还没有入门,或者已经入门了,都可以看看,快速、深入的学习。

    Mule3.4入门学习

    描述如何通过Mule实现Webservice的发布、实现JMS消息通信、ftp、File应用、协议转换等

    EJB3.0入门经典

    详细、经典。 深入了解事物管理、JMS、WebService开发。 适合EJB3.0入门学习

    j2ee基础知识

    J2EE简介及学习方法 J2EE基础技术  XML、RMI、JNDI 、JMS

    jmeter学习资料

    jmeter入门,web测试,数据库测试,JMS测试基本资料

    ActiveMQ入门.docx

    最近老板让学习JMS,找到些ActiveMQ的资料

    大数据工程师学习计划.pdf

    ⼤数据⼯程师学习计划 申明:本⽂旨在为普通程序员(Java程序员最佳)提供⼀个⼊门级别的⼤数据技术学习路径,不适⽤于⼤数据⼯程师的进阶学习,也不适⽤ 于零编程基础的同学。 前⾔ ⼀、背景介绍 本⼈⽬前是⼀名⼤...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    jms Queue Topic kafka 持久 复制 Stream Partition rocketMQ RabbitMQ ActiveMQ 常用开源框架 Spring Spring MVC Spring WebFlow spring tx aop ioc Struts ibatis Mybatis CAS Dubbo 工作...

    active mq思维导图

    Active MQ 基础知识思维导图。主要是JMS总结介绍。用于学习和复习

    springboot学习

    Spring Boot 基础教程(基于1.3.x-1.5.x) 快速入门 chapter1:基本项目构建(可作为工程脚手架),引入web模块,完成一个简单的RESTful API 使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程 ...

    J2EE学习笔记

    3.1:语言基础知识 118 3.2:声明和访问控制 120 3.3:运算符和赋值 121 3.4:流程控制、异常处理和断言 121 3.5:面向对象、重载和重写、构造函数和返回类型 121 3.6:Java.lang-----Math类、字符串和封装类 121 ...

Global site tag (gtag.js) - Google Analytics