基于达梦数据库与XmlBlaster的消息缓存

日期: 2008-06-09 来源:TechTarget中国

  XmlBlaster简介


  XMLBlaster是一种免费的并且开放源码的、具有众多特性的消息中间件产品(message-oriented middleware以下简称MOM)。XMLBlaster是点对点的基于发布和订阅(publish and subscribe)模式的消息中间件服务器,它在发布者和订阅者之间起交换消息的作用,这些消息被描绘成用XML编码的元信息。它们可以是任何种类的信息,包括GIF图片、Java对象、Python脚本、XML数据、Word文档、纯文本等等。发布/订阅模式的特点是非直接的通过消息代理者通信,无连接,异步传输(通过轮流查询和对调机制)。如图1所示:



  图1 XMLBlaster发布/订阅模式


  使用XMLBlaster服务器的通信能够基于各种协议,如CORBA、RMI、XML-RPC等。其他像Email、Socket、Soap也能被嵌入其中。客户端可以选用最合适的一种,在XMLBlaster的客户端Perl、Python、Java、C++都是可以使用的。使用者可以用其最熟悉的语言来开发客户端。XMLBlaster还提供了浏览器回调框架,允许浏览器在一个持久的HTTP连接上接受立即的回调信号。归纳所得,XMLBlaster的主要特点为:


  可以免费使用。


  面向消息的中间件(point to point, publish/subscribe)。


  支持多平台(服务器用Java编写)。


  支持多协议 (CORBA, RMI, XML-RPC, Raw Socket, Email, Native Access)。


  支持多客户端(java,C++/C,Python,PHP,Javascript,Perl,C#, Basic.net )


  语言独立性。


  可扩展性。


  安全的系统独立性,支持鉴定、授权、消息拦截。


  XmlBlaster体系结构



  图2 XMLBlaster的应用体系结构


  从图2可以清楚的看到作为消息中间件的XMLBlaster在整个应用环境中作用和地位。客户端无论用什么编写,总之它首先将消息按XML的格式发送到消息服务器,发送过程中所运用的协议可以在客户端程序中设定,主要有 IIOP、Email、HTTP、FTP等。当消息通过因特网到达XMLBlaster时,JACORB将其交给XMLBlaster引擎,XMLBlaster引擎在根据消息中的元数据即关键字Key把接收到的消息存放到一个树型结构中去,以便于管理和查找。XMLBlaster还有大量的外部接口,包括MIME类型接口(XML,Java,GIF,MPEG),数据库接口。可以实现对各类数据,应用程序的访问。同样的,客户端根据关键字Key向XMLBlaster订阅信息,XMLBlaster引擎也是根据消息中的元数据即关键字Key查找有无对应的信息内容,若有,则把信息回调给客户,若无,则等待。此后,若有该关键字Key关联的信息发布,则XMLBlaster会即时把信息回调给客户。从中也可看出,信息的发布和订阅是异步的。


  XmlBlaster编程快速入门


  编写客户端的主要流程可分为:获得输入参数、连接服务器、消息通信、断开连接。对于消息通信,xmlBlaster支持典型消息中间件的通信方式:主题订阅方式和点对点方式。主题订阅方式的通信围绕主题展开,对某个主题感兴趣的客户端可以向服务器声明,那么当服务器接收到与这个主题相关的消息时,就会消息转发给所有感兴趣的客户端;向服务器发布消息时,也需要在消息中注明主题。点对点方式根据用户名来通信,在发布消息时直接指定接收消息的客户端,服务器会直接将这条消息转发给指定的客户端。xmlBlaster支持异步连接方式。客户端在发送消息后可进行其它事务,不需要等待消息发送到目的地;也不需要向服务器询问是否有新消息,由服务器通知客户端。当然,需要向服务器说明通知客户端的是哪一个对象


  全局参数


  客户端的启动参数都保存到Global类中。一般地,一个客户端在连接到客户端之前,都应当创建一个全局参数对象,并将这个对象保存为客户端的实例对象。在创建后续的很多通信相关的对象时,都要用到这个对象。Global类能够创建服务器连接对象。


  Global类接受的参数是字符串对的形式,如-参数名 参数值。常用的参数名有登录名session.name,例-session.name Jack;口令passwd,例-passwd xxxxx


  连接服务器


  由全局参数对象可以得到一个服务器连接对象。要真正连接到服务器,需要调用服务器连接对象的connect方法,而这个方法需要两个参数:连接服务质量对象和消息通知对象。


  连接服务质量对象属于ConnectQos类,创建时必须指定全局参数对象。此外,还可以指定连接的用户名和口令。消息通知对象就是在服务器通知客户端接收消息时,需要通知的那个对象。消息通知对象需要实现一个update虚函数,以便服务器调用这个方法,将消息发送到客户端。客户端也需要在这个方法中,编写消息处理代码


  消息单元


  在发送消息之前,需要创建一个消息单元对象。消息单元类是MsgUnit。创建一个消息单元要指定PublishKey对象、消息体、PublishQos对象。创建PublishKey对象需要指定全局参数对象,如果是创建主题订阅方式下的消息,那么还需要指定主题信息。消息体就是消息的内容,一般就是一个字符串。创建PublishQos对象需要指定全局参数对象。如果是创建点对点方式下的消息,那么还需要调用addDestination方法来指定消息的目的地。


  消息通信


  无论是主题订阅方式还是点对点方式,消息的发送都调用服务器连接对象的publish方法。这两种通信方式的区别主要体现在构造消息单元的时候。


  订阅主题需要调用服务器连接对象的subscribe方法,这个方法需要指定SubscribeKey和SubscribeQos对象。前者通过全局参数对象和主题信息来构造,后者用全局参数对象就可以创建了。


  断开连接


  调用服务器连接对象的disconnect方法即可断开客户端与服务器的连接。这个方法需要指定一个DisconnectQos对象,可以用全局参数对象来创建。


  Java客户端开发流程


  客户端使用到的包在xmlBlaster.jar文件中都能找到,因此需要把这个文件配置到CLASSPATH环境变量中。其中主要使用org.xmlBlaster.util和org.xmlBlaster.client两个包.


  1. 构造一个Global变量,将参数传入该变量。参数格式参见”全局参数”。如果需要远程连接到服务器,可以将服务器IP作为参数传入,例如-bootstrapHostname xxx.xxx.x.x。


  2. 调用Global对象的getXmlBlasterAccess方法,可以得到一个I_XmlBlasterAccess接口,这是与服务器连接的对象。


  3. 调用该接口的connect方法连接服务器,需要指定ConnectQos对象和一个实现I_Callback接口的对象。I_Callback接口只有一个update方法,消息处理代码可以编写在这个方法中。


  4. 调用该接口的subscribe方法订阅主题。


  5. 调用publish方法发布消息。


  a) 构造消息单元,指定PublishKey和PublishQos对象。主题信息在构造PublishKey对象时指定。


  b) 如果是点对点方式,需要在PublishQos中加入目的地信息,也就是Destination对象。一般是先构造一个SessionName(Global, String username)对象,然后将它作为参数来构造Destination对象。


  c) 构造MsgUnit对象和发布消息的进一步信息还可以参见“消息单元”和“消息通信”。


  6. 退出客户端时,调用该接口的disconnect方法断开连接,指定DisconnectQos对象。


  XmlBlaster消息缓存


  Xmlblaster在默认情况下是利用HSQLDB来进行系统消息队列的保存或交换消息,通过更改Xmlblaster安装目录的config目录下的xmlBlaster.properties文件可以进行默认数据库的修改操作。


  打开xmlBlaster.properties,


  1. 增加对应的消息持久化插件的达梦数据库选项。  


  JdbcStorage[DM]  =org.xmlBlaster.util.queue.jdbc.JdbcQueueCommonTablePlugin,
  url= jdbc:dm://localhost:12345/数据库名,
  user=连接数据库用户名,
  password=连接数据密码,
  connectionPoolSize=5,
  connectionBusyTimeout=90000,
  maxWaitingThreads=300,
  tableNamePrefix=XB_,
  entriesTableName=ENTRIES,
  colNamePrefix=XB_,
  dbAdmin=true,
  configurationIdentifier=DM
 
  在这里必须对configurationIdentifier=DM进行配置,否则找mapping的时候,就会默认去DM驱动中获取,取回来的带中文”达梦数据库管理系统”,导致下面mapping[中文]需要编码一致的问题。


  2. 更改消息存储插件和消息队列插件的数据选项  


  StoragePlugin[JDBC][1.0]=${JdbcStorage[DM]}
  QueuePlugin[JDBC][1.0] = ${JdbcStorage[DM]}


  3. 进行自动建表配置  


  JdbcDriver.mapping[DM]=string=VARchar(128),longint=BIGINT,boolean=char,blob=BLOB,blobVarName=datablob
  create TABLE XB_ENTRIES (XB_dataId BIGINT , queueName VARchar(128) , prio integer, flag VARchar(128), durable char, XB_byteSize BIGINT, datablob BINARY, PRIMARY KEY (XB_dataId, queueName))


  通过以上步骤就可以利用达梦数据库来支持XmlBlaster进行消息缓存。客户端在服务器断开连接后,客户端会在内存里面缓存队列,以下是对应的参数设置。


  queue/connection/defaultPlugin=RAM,1.0 内存队列


  queue/connection/defaultPlugin=CATCH,1.0 持久化保存于数据库


  queue/connection/maxEntriesCache = 1 客户端消息内存缓存


  queue/connection/maxEntries = 10000000 客户端消息数据库中最大缓存


  总结 利用XmlBlaster可以很容易实现不同操作系统与不同语言进行消息交换,通过达梦数据库来支持消息缓存机制,可以进行数据复制,消息缓存等不同的异步消息应用。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐