当前位置:编程学习 > JAVA >>

应用服务器-JBoss技术支持文档(三)

1、介绍

本章介绍在Jboss中使用Java Messageing Service (JMS). 不是JMS指南,而是JBoss和JMS如何一起使用,如果你想看JMS的介绍,请参考 JMS Specification 或 JMS turorial.

最近随着JBoss版本不断更新,对JMS支持越来越成熟,也造成JBoss各个版本之间的不同。在这里我主要介绍JBoss3.0.X版本。

本章给出的例子比较简单,并指出了如何使用JMS的原理。所有的例子可以通过ant build file 来建立。

为了能建立和运行此例子。我们使用两种方式来进行:一是使用Ant命令,二是使用JAR和JAVA基本命令。必须有下面的环境变量:

w JAVA_HOME 安装JDK1.4的目录。

w JBOSS_DIST 安装JBoss的目录。

你必须安装JDK, 如果使用Ant必须安装 Ant。可以参考我前面文档的介绍。

2、概述

1) 什么是JMS

JMS是Java API, 允许应用程序来建立、接收和读取消息。程序依靠这些API, 在运行时需要一个JMS实现接口,来提供管理和控制,这被称为JMS provider, 现在有几种不同的JMS Provider; 在JBoss中的叫做JbossMQ。

2) JMS 和J2EE

JMS是在EJB和J2EE框架开发之前进行开发的,所以在JMS说明书中没有涉及到EJB或J2EE。

EJB 和J2EE第一代版本中也没有涉及到JMS,一直到EJB1.1,在生成一个可用Beand的容器provider中JMS也不是必须的API。在 J2EE1.2中JMS接口是必需的情况,但并不是非得要包含一个JMS Provider;在EJB2.0和J2EE1.3中又进行改变,应用服务器包含了一个JMS Provider,自从J2EE1。3需要EJB2.0,增加了以下两个JMS特性:

w 一种新Bean类型定义, 也就是消息驱动Beam (MDB), 这种bean做为JMS消息监听者,可以异步地处理JMS消息。

w JMS处理作为资源,来自一个Bean 的JMD 发布(发送)必须能和其他bean的全局事务环境共享。这个需要把JMS认为是一个容器管理资源,象JDBC的连接。

3) JMS 和JBoss

JBoss从2.0版本以后都支持JMS。 在2.1中增加了MDB,从2.4版本开始JMS作为一个事务资源。

JBoss中JMS的体系结构如下:

w JMS Provider, 叫做JbossMQ 。 是JBoss实现JMS 1.0.2规范的一部分,包括可选部分,象ASF(Application Service Facvility)。 JbossMQ处理和普遍JMS一样:建立 queues (队列)或topic(标题),持久性等。

w MDB (Message Driven Beans),

w 资源适配器。

3、JMS Provider

JBoss有它自己的JMS Provider 叫做JbossMQ。 适合与JMS 1.0.2 的JMS Provider,并且能用在所有平常的JMS程序中。为了清楚在JBoss中JMS是如何工作的,首先要清楚在JMS中涉及到的概念和术语,最好的办法 是阅读JMS规范,下面给出了简单的JMS介绍。

1) JMS的简单介绍

当你发送一个消息,你不能直接发送到对此消息感兴趣的接受者。而是你发送到一个目的地。对此消息感兴趣的接受者必须连接到目的地,得到此消息或在目的地设置订阅。

在JMS中有两种域:topics 和queues 。

w 一个消息发送到一个topics ,可以有多个客户端。用topic发布允许一对多,或多对多通讯通道。消息的产生者被叫做publisher, 消息接受者叫做subscriber。

w queue 是另外一种方式,仅仅允许一个消息传送给一个客户。一个发送者将消息放在消息队列中,接受者从队列中抽取并得到消息,消息就会在队列中消失。第一个接受者抽取并得到消息后,其他人就不能在得到它。

为了能发送和接收消息,必须得到一个JMS连接。该连接是使用JMS Provider得到连接的,在得到连接之后,建立一个会话(Session)。然后再建立publisher/sender 来发送消息或subscriber/receiver来接收消息。

运行时,如果使用topic 那么publisher 或subscriber 通过一个topic来关联,如果使用queue ,则sender 或receiver通过queue来关联起来。

通常,在JMS框架中运转的方法如下:

(1) 得到一个JNDI初始化上下文(Context);

(2) 根据上下文来查找一个连接工厂TopicConnectFactory/ QueueConnectionFactory (有两种连接工厂,根据是topic/queue来使用相应的类型);

(3) 从连接工厂得到一个连接(Connect 有两种[TopicConnection/ QueueConnection]);

(4) 通过连接来建立一个会话(Session);

(5) 查找目的地(Topic/ Queue);

(6) 根据会话以及目的地来建立消息制造者(TopicPublisher/QueueSender)和消费者(TopicSubscriber/ QueueReceiver).

为了得到一个连接和得到一个目的地(用来关联publisher/sender 或subscriber/receiver),必须用provider-specific参数。

通过JNDI来查找相应的连接工厂或目的地,JNDI适合于任何JMS Provider。但是查找用的名字是provider使用的。因此,在你使用的JMS Provider(其中包括JBossMQ),必须学会如何进行指定。JMS Provider中的任何设置,象连接特性,用到目的地等,在用到的Provider都有明确描述。

2) 配置

当使用一个JMS Provider时,有三个Provider-specific因素:

w 得到一个JNDI初始化上下文

w 用到的连接工厂的名字。

w 对目的地的管理和命名协定。

JBoss同它的JNDI一起执行。为了简单的JMS client, 配置和查找初始化上下文,同实现其他J2EE客户端一样。

JMS-specific 来约束JBoss 的JMS provider (JBossMQ)。JbossMQ是通过xml 文件jbossmq-service.xml进行配置的,该文件放在在serverdefaultdeploy下。

在xml文件中最基本的三件事情:

w 增加一个新的目的地

w 配置用户

w 获得可用连接工厂的名字。

(1) 增加新的目的地

w 在目的地的xml文件在jboss 3.x中是jbossmq-destinations-service.xml(server/../deploy)。在文件中已经存在几个缺省的目的 地,所以你比较容易明白怎样增加到文件中。在例子中你需要一个topic目的地 spool,所以增加下面的语句到jbossmq-destinations-service.xml中。这种方式是长久存在的,不随着JBoss服务器 关闭而消失。

name="jboss.mq.destination:service=Topic,name=spool">

jboss.mq:service=DestinationManager

w 另外一种方法是可以通过JMX HTML管理界面。通过http://localhost:8080/jmx-console 来访问。在jboss.mq 下查找service=DestinationManager 的连接。然后在createTopic()或createQueue()来建立,这种方法建立的目的地是临时性的,随着服务器开始存在,当当JBoss 服务器重新启动时,动态建立的目的地将会不存在。在JbossMQ中所有目的地都有一个目的地类型的前缀。对于topic前缀是topic ,对于queues前缀是queue。例如查找一个testTopic目的地,需要查找名字为“topic/testTopic”。

在此种方法中有createTopic()或createQueue()分别有两 种方法:一是有两个参数,二是有一个参数的。两个参数分别是:建立的目的地名称和JNDI名称。一个参数的只是目的地名称,对于JNDI名称默认是:[目 的地类型(topic/queue) ]/目的地名称。

在这里我们使用的是第一种方法。直接修改jbossmq-destinations-serv

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,