[摘要]本文概述的介绍了RMI和消息中间件技术,分析了RMI技术所存在的弱点,并提出应用开源消息中间件解决RMI技术弱点的思想,最后给出了如何选取开源消息中间件以及如何应用开源中间件解决RMI技术局限性的方案。
  [关键字]RMI 消息中间件 开源中间件 JMS JNDI
  
  1.RMI技术简介
  
  RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。RMI目前使用Java远程消息 交换协议JRMP(Java Remote Messaging Protocol)进行通信。JRMP是专为Java的远程对象制定的协议。所以,Java RMI具有Java的"Write Once,Run Anywhere"的优点,是分布式应用系统的一种Java解决方案。
  
  2.消息中间件简介
  
  中间件是位于平台(硬件和操作系统)和应用之间的通用服务。这些服务具有标准的程序接口和协议。针对不同的操作系统和硬件平台,它们可以有符 合接口和协议规范的多种实现。基于目的和实现机制不同,可以将中间件分为消息中间件、分布式面向对象中间件和事务处理中间件等几大类。
  消息中间件最重要的功能是及时提供可靠的消息通信手段。为了能够完成消息的可靠传输,一般情况下,使用队列的方式进行消息管理,也就是说,能常在进行数据传输时,将数据按照用户定义的大小,拆分成若干消息放入消息队列,按照同步或异步的通信方式发送或者接收消息。
  
  3.应用消息中间件解决RMI的局限性
  
  (1)同步通信:客户发出调用后,必须等待服务对象完成处理并返回结果后才能继续执行;
  (2)客户和服务对象的生命周期紧密耦合:客户进程和服务对象进程都必须正常运行;如果由于服务对象崩溃或者网络故障导致客户的请求不可达,客户会接收到异常;
  (3)点对点通信:客户的一次调用只发送给某个单独的目标对象。
  当应用了消息中间后,消息的发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。这种模式 下,发送和接收是异步的,发送者无需等待;二者的生命周期未必相同:发送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行;一对多通信:对 于一个消息可以有多个接收者。
  
  4.开源消息中间件的选择
  
   应用开放源代码的消息中间件不但可以借鉴消息中间件的具体实现方法,而且我们可以随时跟踪发现问题,最重要的是可以免去购买商用消息中间件的费用。在选择的时候应该注意如下几点:
  (1)该开源软件是否经常被更新,经常被更新的开源软件可以不断的解决其自身存在的一些问题,并且意味着其开发小组对其有一个较好的维护,通常这样的软件文档比较全。
  (2)最好采用NIO,因为这样弹性会很高,在满足项目的性能需求上没有什么问题。
  (3)持久化支持是否良好,如果,持久化做的不还,在关闭JMS服务器再重启启动后,会把保存在JMS中的信息全部丢掉,这样无法满足实际的应用中的稳定性的要求。
  (4)最好,开源的消息中间件有自带的管理软件,自带的管理工具,这样就可以方便的添加ConnectionFactory和Destination并绑定到JNDI,这点对实现动态管理来说非常有用;
  
  5.利用消息中间件解决RMI局限性的方案
  
  我们可以应用JMS(Java Message Service)、Java命名和目录接口(Java Naming and Directory Interface,简称JNDI)和精心设计的特性文件结合在一起对开源消息中间件作一个封装。这样做的目的是便于对消息中间件的更换。
   值得注意的是虽然在书写程序时没有特定于消息中间件供应商的代码,但必须知道初始的上下文工厂和命名服务的供应商URL以及 QueueConnectionFactory的绑定名称。对于JNDI上下文,通常的做法是将参数字符串存储在特性文件中然后在需要时读取。用这种方 法,改变JMS供应商只需改变特性文件即可。接下来看看如何设置特性文件以及它在启用JNDI连接中所起的作用。进行JNDI连接的基类是 javax.naming.InitialContext。尽管有一些特定于目录操作的InitialContext子类(如 InitialDirContext),但通用类将完成此任务。构造InitialContext后,它可以从环境(系统特性或 applet 参数)派生JNDI参数值或查找特定jndi.properties文件。将应用程序所有的运行时配置参数都放在一个应用程序特性文件中并将JNDI参数 包含在该文件中,然后为资源束装入。
  上述的工作都是为了能够正确的连接到JNDI服务,下面要进行的工作就是接到JNDI服务,链接工作很容易,通常就是建立一个InitialContext的实例。
  在建立了Context后,可以继续查询JMS对象,查询只是调用Context的lookup(String name)方法,然后传入希望绑定对象的位置的名称。
  最后,只要订阅事先确定的topic name(主题)就可以了,而订阅的时候,也是与消息中间件的供应商是无关的。

posted on 2014-07-05 11:19  jessen163  阅读(623)  评论(0)    收藏  举报