初识 JMS

本文介绍了Java消息服务(JMS)的基本概念和技术要点,包括其核心组件如JMS Provider、JMS Clients等,并概述了两种消息传输机制PTP和Pub/Sub的特点。此外,还提供了JMS消息发送和接收的基本步骤。

自己搞了J2EE这么久,EJB/JNDI/RMI/JTA这些都了解的七七八八。但是,对于JMS这个东东,只听说在EJB的消息bean中有用到过,一直以来俺都敬而远之。最近公司要做一个国外的外包项目,里头有涉及到JMS的技术,现在只能临时抱佛脚。互联网上关于JMS的文章少之又少,没办法,只有自力更生,硬是查看了SUN的官方技术API文档,也算是初步揭开JMS这个神秘的面纱吧。

JMS的基本概念

JMS(Java Message Service) 的主要目的是为了在我们的Java程序之间用分布式的方式实现对消息的创建、发送、接收和读取。一个典型的JMS应用,主要包含以下几个部分:
●JMS Provider -- JMS的核心模块,用来控制和管理JMS应用。如果说JMS整个是一个十字路口,那么这个Provider应该就充当交通信号灯和
交警的角色了。
●JMS Clients -- 接收和发送message的Java程序终端,简单的说应该就是交互的源/目标对象,可以有一个或多个Clients存在。
●Messages -- 在JMS Clients中间传递交互的消息对象,这是JMS最基本的媒体单元。
●Administered Objects --  由JMS Provider创建和定义,然后提供给JMS Clients使用。 JMS定义了两种 Administered Objects:
  1) ConnectionFactory:提供给Clients使用,用来建立和JMS Provider之间的连接。
  2) Destination:在Clients之间交互时,携载了消息对象的发送源与接收目标。
●JMS Clients是通过JNDI的方式来查找这些Administered Objects的。
●Non-JMS Clients -- 使用本地消息的API来实现的Clients。

此外,JMS可以在不同的域对象之间实现以下两种方式的消息传输机制:PTP(Point-to-Porint)和Pub/Sub(Publish-and-Subscribe),这两种方式可以并存于同一个应用之中。PTP是点对点传输消息,建立在消息队列的基础上,每个客户端对应一个消息队列,客户端发送消息到对方的消息队列中,从自己的消息队列读取消息。 Pub/Sub是将消息定位到某个层次结构栏目的节点上,Pub/Sub通常是匿名的并能够动态发布消息,Pub/Sub必须保证某个节点的所有发布者(Publisher)发布的信息准区无误地发送到这个节点的所有消息订阅者(Subscriber)。

我们不需要仔细去了解这两种方式的意义,JMS在此提供了一个更加统一的实现方式,该方式主要有以下几个接口:ConnectionFactory、Connection、Destination、Session(消息交互线程的上下文环境)、MessageProducer(消息的发送者)、MessageConsumer(消息的接收者)。

使用JMS API不仅使通信变得松散耦合,而且它还使通信变得:
●异步:JMS提供者将到来的消息发送给客户,客户不用发送请求接收消息。
●可靠:JMS API确保消息传送一次而且只传送一次。可靠性差的应用程序可能会丢失消息或者重复接收消息

这里,我不想详细去写一个JMS应用的Demo。简单的就其API文档所提供的资料,来总结一下吧。

JMS应用中的消息发送

1、获得一个上下文环境:
Context ctx = new InitialContext();
2、通过JNDI查找来建立一个ConnectionFactory对象:
ConnectionFactory cf = (ConnectionFactory) ctx.lookup("java:JmsXA");
3、通过JNDI查找来建立一个或多个Destination对象:
Destination dest = (Queue) ctx.lookup("queue/A");  
4、通过ConnectionFactory创建一个JMS Connection连接:
Connection conn = cf.createConnection();
5、创建一个或多个JMS Session对象:
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
6、使用一个Session对象和Destination对象,合作创建一个MessageProducer(消息发送端):
MessageProducer msgp = session.createProducer(dest);   //此处的dest已经被强制为P2P Queue对象
QueueSender sender = (QueueSender) msgp; 
//此处发送端指明采用的是 PTP的方式来实现JMS。当然你也可以用Pub/Sub的方式来实现
Destination dest = (Topic) ctx.lookup("queue/A");  
...
TopicPublisher sender = (TopicPublisher) msgp;
7、通过某个Session建立一个或多个JMS Message对象:
//此处仅以文字消息发送为例,您也可以建立和发送MapMessage, BytesMessage, ObjectMessage, StreamMessage
TextMessage msg = session.createTextMessage();
msg.setText("消息详细内容");
8、在已有的连接上,开始发布我们已经建立好的消息对象:
sender.send(msg);
9、关闭已经建立的连接:
conn.close();

JMS应用中的消息接收

1-5:同发送过程的初始化步骤1-5,因为是消息的接收方,JNDI的寻址方式应该同于发送方,这里的JNDI相当于是双方接头的暗号。
6、使用一个Session对象和Destination对象,合作创建一个MessageConsumer(消息接收端):
MessageConsumer msgconsumer = session.createConsumer(dest);
7、启动这个已经建立的连接,准备接收来自发送方的消息:
conn.start();
8、截获来自发送端的消息:
TextMessage msg = (TextMessage) msgconsumer.receive();
String message = msg.getText();
9、关闭已经建立的连接:
conn.close();

以上的消息接收端成功的接收了一条消息,如果我们要监控JMS消息的接收事件,需要在第7步之前,声明一个实现了MessageListener接口的对象:
MessageListener ml = new JmsListenner();  
msgConsumer.setMessageListener(ml); 
这里的JmsListenner是我们自定实现的一个MessageListener,其中关键的事件是:
public void onMessage(Message message);
一个Session对象可以同时控制旗下的多个Consumer对象和MessageListener对象,但是这个Session是一个单线程模式的传递机制,即:必须在当前Message对象被onMessage处理之后,才能继续接收下一条异步传送过来的Message对象。

总结

以上是我对JMS的一个初步的了解,也希望在以后的工作中对此有更进一步的认识,很乐意和大家探讨 :)

 

采用PyQt5框架Python编程语言构建图书信息管理平台 本项目基于Python编程环境,结合PyQt5图形界面开发库,设计实现了一套完整的图书信息管理解决方案。该系统主要面向图书馆、书店等机构的日常运营需求,通过模块化设计实现了图书信息的标准化管理流程。 系统架构采用典型的三层设计模式,包含数据存储层、业务逻辑层和用户界面层。数据持久化方案支持SQLite轻量级数据库MySQL企业级数据库的双重配置选项,通过统一的数据库操作接口实现数据存取隔离。在数据建模方面,设计了包含图书基本信息、读者档案、借阅记录等核心数据实体,各实体间通过主外键约束建立关联关系。 核心功能模块包含六大子系统: 1. 图书编目管理:支持国际标准书号、中国图书馆分类法等专业元数据的规范化著录,提供批量导入单条录入两种数据采集方式 2. 库存动态监控:实时追踪在架数量、借出状态、预约队列等流通指标,设置库存预警阈值自动提醒补货 3. 读者服务管理:建立完整的读者信用评价体系,记录借阅历史违规行为,实施差异化借阅权限管理 4. 流通业务处理:涵盖借书登记、归还处理、续借申请、逾期计算等标准业务流程,支持射频识别技术设备集成 5. 统计报表生成:按日/月/年周期自动生成流通统计、热门图书排行、读者活跃度等多维度分析图表 6. 系统维护配置:提供用户权限分级管理、数据备份恢复、操作日志审计等管理功能 在技术实现层面,界面设计遵循Material Design设计规范,采用QSS样式表实现视觉定制化。通过信号槽机制实现前后端数据双向绑定,运用多线程处理技术保障界面响应流畅度。数据验证机制包含前端格式校验后端业务规则双重保障,关键操作均设有二次确认流程。 该系统适用于中小型图书管理场景,通过可扩展的插件架构支持功能模块的灵活组合。开发过程中特别注重代码的可维护性,采用面向对象编程范式实现高内聚低耦合的组件设计,为后续功能迭代奠定技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值