34.3. 管理消息服务

消息服务的管理是通过配置消息管理对象的属性完成的。消息管理对象包含了管理员生成的消息配置信息,之后由消息客户端使用。

消息服务中定义了两个管理对象:

由于消息服务包含两种消息模型,即Point-to-Point(PTP)和Publish-and-Subscribe(Pub/Sub)模型,Apusic应用服务器对这两种消息模型提供了完整的支持,因此,对于连接工厂而言,提供了两种可配置的连接工厂类型,面向PTP消息模型的QueueConnectionFactory和面向Pub/Sub模型的TopicConnectionFactory;对于消息目的地而言,同样提供了两种可配置的消息接收类型站,面向PTP的队列(Queue)站和面向Pub/Sub的主题(Topic)站。

通过对存在于Apusic应用服务器域主目录下config子目录中,名为jms.xml的配置文件进行编辑,实现对Apusic应用服务器消息服务的管理。在此文件中,可以对连接工厂、消息目的地和消息服务安全策略进行配置。

jms.xml文件是一个xml文件,其文档类型定义(DTD)为jms-config_1_2.dtd。

Apusic应用服务器提供了jms.xml

34.3.1. 配置连接工厂

在jms.xml文件中,每一个连接工厂配置信息对应一个connection-factory标记申明的xml元素,每个connection-factory元素可包含使用以下三种标记所申明的子元素:

  • description,可选标记,对此连接工厂的描述 ;

  • display-name,必须申明的标记,用于区别于其它连接工厂;

  • jndi-name,可选标记,通过JNDI,用于客户在服务器命名空间中查找此连接工厂。

实际应用中,当管理员为连接工厂分配JNDI名之后,消息客户即可使用JNDI在服务器的命名空间中对连接工厂进行查找并获得引用,之后通过连接工厂取得与消息服务的连接。

连接工厂的配置属性如下表:

属性描述值类型缺省值
pooled指定此连接工厂是否对其管理的连接使用连接池“True”或“False”“False”
secure指定连接工厂所提供连接的通讯方式“True”或“False”“False”
anonymous是否授权匿名用户访问此连接工厂“True”或“False”“True”
client-id由于标识连接客户状态的标识符,通常被用于Pub/Sub模型中的持久订阅(Durable subscription)字符串,此属性是可选的
default-delivery-mode使用由此连接工厂生成的连接发送消息时,缺省的发送方式“persistent”或“non-persistent”“non-persistent”
default-priority使用由此连接工厂生成的连接发送消息时,缺省的优先级数字(0~9)“4”
default-time-to-live使用由此连接工厂生成的连接发送消息时,对于已发送的消息,消息系统保留此消息的缺省时间长度,单位为毫秒。整型0
min-pool-size此连接工厂对应的连接池中,所保持的最少连接数整型5
max-pool-size此连接工厂对应的连接池中,所保持的最大连接数整型30
idle-timeout连接等待超时时间。当连接池中的某个连接等待被使用的实际时间超过此属性数值时,连接池自动关闭此连接整型,单位是秒300

34.3.2. 配置消息目的地(Destination)

对应于PTP和Pub/Sub消息模型,Apusic应用服务器中的消息服务提供了两种消息目的地,队列(Queue)和主题(Topic)。实际应用中,管理员为消息目的地分配JNDI名,消息客户即可使用JNDI在服务器的命名空间中对消息目的地进行查找并获得引用,在通过连接工厂取得与消息服务的连接之后,消息客户即可向消息目的地同步或异步地发送或接收消息。

在jms.xml文件中,每一个消息目的地配置信息对应一个queue标记或topic标记申明的xml元素。

34.3.2.1. 配置消息队列

在jms.xml文件中,每一个队列(Queue)配置信息对应一个queue标记申明的xml元素,每个申明的queue元素可包含三种标记所申明的子元素:

  • description,可选标记,对此队列的描述 ;

  • display-name,必须申明的标记,用于区别于其它队列;

  • jndi-name,可选标记,通过JNDI,用于客户在服务器命名空间中查找此队列。

队列的配置属性如下表:

属性描述值类型缺省值
cache-size队列缓冲中保留的消息个数整型20
expiry-check-interval系统检测消息队列中消息是否过期的时间间隔,单位是秒整型60

34.3.2.2. 配置消息主题

在jms.xml文件中,每一个主题(Topic)配置信息对应一个topic标记申明的xml元素,每个申明的topic元素可包含三种标记所申明的子元素:

  • description,可选标记,对此主题的描述 ;

  • display-name,必须申明的标记,用于区别于其它主题;

  • jndi-name,可选标记,通过JNDI,用于客户在服务器命名空间中查找此主题。

主题的配置属性如下表:

属性描述值类型缺省值
cache-size主题缓冲中保留的消息个数整型20
expiry-check-interval系统检测消息主题中消息是否过期的时间间隔,单位是秒整型60

34.3.3. 安全相关配置

JavaEE™体系中的JMS规范实际上并未包含有关安全方面的内容,因此,系统提供保证消息服务的安全和完整性的机制就极为重要。

Apusic应用服务器提供了对消息服务方面的安全管理,主要根据JavaEE™体系中的安全角色(Security Role)和消息客户的操作对消息服务进行保护。

消息服务中基于安全角色的授权方式是指,系统管理员可定义一组安全角色,每个被定义的安全角色对应于系统中的一组用户或组,然后,根据消息客户用户可对消息目的地(Destination)进行的操作(如对于队列,客户可执行发送、接收、浏览等操作)对前面定义的安全角色进行授权。

34.3.3.1. 安全角色

在jms.xml文件中,每一个安全角色(Security Role)配置信息对应一个security-role标记申明的xml元素,每个申明的security-role元素可包含四种标记所申明的子元素:

  • description,可选标记,对此安全角色的描述 ;

  • role-name,必须申明的标记,用于区别于其它安全角色申明;

  • principal或group,必须使用至少一个这两种标记申明的元素,可以是多个,用于将逻辑的安全角色对应于系统中的用户或组。

34.3.3.2. 消息目的地(Destination)访问许可

对于一个或者一组jms.xml中申明的消息目的地(Destination)和一个或者一组jms.xml中申明的安全角色,通过使用一个destination-permission标记申明的xml元素来设置这二者之间的对应关系, 每个申明的destination-permission元素可包含三种标记所申明的子元素:

  • description,可选标记,对此访问许可的描述 ;

  • role-name,必须使用至少一个这种标记申明的元素,可以是多个,用于表示此访问许可所包含的在security-role中申明的安全角色;

  • destination-method,必须使用至少一个这种标记申明的元素,可以是多个,用于表示此访问许可所包含的客户对消息目的地(Destination)能进行的操作。

    每个申明的destination-method元素可包含四种标记所申明的子元素:

    • description,可选标记,对此destination-method的描述 ;

    • queue-name或topic-name,必须有至少一个这两种标记申明的元素,而且它的值必须是对应的jms.xml中已申明的queue或topic元素,用于说明此访问许可包含的消息目的地(Destination);

    • method-name,必须使用至少一个这种标记申明的元素,可以是多个,通过方法名,指定对指定队列(queue)或主题(topic)所能进行的客户操作。对于指定的队列(queue),每个method-name元素的值可以是send、receive或browse中之一;对于指定的主题(topic),每个method-name元素的值可以是publish、subscribe、subscribe-durable或unsubscribe中之一;

34.3.3.3. 范例

下面范例授权安全角色foo可以对队列bar 进行接收和浏览:

  • 申明队列

    ...
    <queue>
      <queue-name>testQueue</queue-name>
    </queue>
    ...
  • 申明安全角色foo,并对应到管理员用户

    ...
    <security-role>
      <role-name>foo</role-name>
      <principal>admin</principal>
    </security-role>
    ...
  • 设置访问许可

    ...
    <destination-permission>
      <role-name>foo</role-name>
      <destination-method>
        <queue-name>testQueue</queue-name>
        <method-name>receive</method-name>
        <method-name>browse</method-name>
      </destination-method>
    </destination-permission>
    ...