Application Server 通过将 Sun Java System Message Queue(以前的 SUN ONE Message Queue)集成到 Application Server 中,实现了 Java 消息服务 (Java Message Service, JMS) API。对于基本的 JMS API 管理任务,请使用 Application Server 管理控制台。对于高级任务(包括管理 Message Queue 群集),请使用 MQ-as-install /imq/bin 目录中提供的工具。有关管理 Messge Queue 的详细信息,请参见 Message Queue Administration Guide。
本章介绍了如何为使用 Java 消息服务 (Java Message Service, JMS) 的应用程序配置资源。它包含以下小节:
Java 消息服务 (Java Message Service, JMS) API 使用两种受管对象:
连接工厂,允许应用程序以编程方式创建其他 JMS 对象的对象。
目标,充当消息的系统信息库
这些对象是以管理方式创建的,创建对象的方式特定于每个 JMS 实现。在 Application Server 中,执行以下任务:
应用程序使用来访问连接工厂和目标资源。通常,JMS 应用程序至少使用一个连接工厂和一个目标。要了解所需创建的资源,请仔细研究应用程序或向应用程序开发者进行咨询。
连接工厂分为三种类型:
QueueConnectionFactory 对象,用于点对点通信
TopicConnectionFactory 对象,用于发布-订阅通信
ConnectionFactory 对象,可用于点对点通信和发布-订阅通信;建议将这些对象用于新的应用程序
目标有两种类型:
Queue 对象,用于点对点通信
Topic 对象,用于发布-订阅通信
《The Java EE 5 Tutorial》中有关 JMS 的章节提供了这两种通信和 JMS 其他方面的详细信息(请参见 http://java.sun.com/javaee/5/docs/tutorial/doc/index.html)。
创建资源的顺序并不重要。
对于 J2EE 应用程序,请在 Application Server 部署描述符中指定连接工厂和目的地资源,如下所示:
在 resource-ref 或 mdb-connection-factory 元素中指定连接工厂 JNDI 名称。
在消息驱动的 Bean 的 ejb 元素和 message-destination 元素中指定目的地资源 JNDI 名称。
在 message-destination-link 元素中指定物理目标名称,该元素在企业 Bean 部署描述符的 message-driven 元素或 message-destination-ref 元素内。此外,还应在 message-destination 元素中指定该物理目标名称。(message-destination-ref 元素替换了在新的应用程序中过时的 resource-env-ref 元素。)在 Application Server 部署描述符的 message-destination 元素中,将物理目标名称与目的地资源名称链接起来。
Application Server 通过使用名为 jmsra 的系统资源适配器实现 JMS。用户创建 JMS 资源时,Application Server 会自动创建连接器资源,这些资源将显示在管理控制台树视图的“连接器”节点下。
对于用户创建的每个 JMS 连接工厂,Application Server 都将为其创建连接器连接池和连接器资源。对于用户创建的每个 JMS 目标,Application Server 都将为其创建管理对象资源。用户删除 JMS 资源时,Application Server 将自动删除连接器资源。
可以通过使用管理控制台的“连接器”节点(而不是“JMS 资源”节点)来为 JMS 系统资源适配器创建连接器资源。有关详细信息,请参见第 7 章,连接器资源。
JMS 连接工厂是允许应用程序以编程方式创建其他 JMS 对象的对象。这些受管对象将实现 ConnectionFactory、QueueConnectionFactory 和 TopicConnectionFactory 接口。使用 Application Server 管理控制台,可以创建、编辑或删除 JMS 连接工厂。创建新的 JMS 连接工厂时还将为工厂创建连接器连接池并创建连接器资源。
要使用命令行实用程序管理 JMS 连接工厂,请使用 create-jms-resource、list-jms-resources 或 delete-jms-resource 命令。
JMS 目的地充当消息的系统信息库。使用管理控制台,可以创建、修改或删除 JMS 目的地资源。要创建新的 JMS 目的地资源,请选择“资源”>“JMS 资源”>“目的地资源”。在“目的地资源”页面中,可以指定以下各项:
资源的 JNDI 名称。建议的做法是对 JMS 资源使用命名子上下文前缀 jms/。例如:jms/Queue。
资源类型,可以是 javax.jms. Topic 或 javax.jms.Queue。
目的地资源的其他属性。有关所有这些设置和其他属性的更多详细信息,请参阅管理控制台联机帮助。
要使用命令行实用程序管理 JMS 目的地,请使用 create-jms-resource 或 delete-jms-resource 命令。
要为 asadmin create-jms-resource 命令指定 addresslist 属性(格式为 host:mqport,host2:mqport,host3:mqport),请使用 \\ 对 : 进行转义。例如,host1\\:mqport,host2\\:mqport,host3\\:mpqport。
有关使用转义符的更多信息,请参见 asadmin(8) 手册页。
要进行生产,务必创建物理目标。但是,在开发和测试阶段,不需要执行此步骤。应用程序首次访问目的地资源时,Message Queue 会自动创建目的地资源的 Name 属性指定的物理目的地。该物理目标是临时的,并且将在 Message Queue 配置属性指定的时间段后过期。
要在管理控制台中创建物理目的地,请选择“配置”>“物理目的地”。在“创建物理目的地”页面中,指定物理目的地的名称并选择目的地类型(可以为 topic 或 queue)。有关“物理目的地”页面中字段和属性的更多详细信息,请参阅管理控制台联机帮助。
要进行生产,务必创建物理目标。但是,在开发和测试阶段,不需要执行此步骤。应用程序首次访问目标资源时,Message Queue 会自动创建目标资源的 Name 属性指定的物理目标。该物理目标是临时的,并且将在 Message Queue 配置属性指定的时间段后过期。
要使用命令行实用程序管理 JMS 物理目的地,请使用 create-jmsdest、flush-jmsdest 或 delete-jmsdest 命令。
使用管理控制台中的“JMS 服务”页面配置所有 JMS 连接都要使用的属性。在管理控制台中,选择“配置”>“Java 消息服务”。在“JMS 服务”页面中,可以控制以下常规 JMS 设置。
选择“启动超时”时间间隔,此间隔表示在异常中止启动之前 Application Server 等待 JMS 服务启动所用的时间。
选择 JMS 服务类型,它用来确定您要管理本地主机还是远程主机上的 JMS 服务。
指定“启动变量”以自定义 JMS 服务启动。
选中“重新连接”复选框以指定连接中断时,JMS 服务是否尝试重新连接至消息服务器(或 AddressList 中的地址列表)。
指定“重新连接时间间隔”(秒数)。此设置适用于对 AddressList 中每个地址的尝试,及对该列表中连续地址的尝试。如果该时间间隔太短,则代理将没有时间恢复。如果该时间间隔太长,则重新连接可能会指明这是不可接受的延迟。
指定重新连接尝试次数。在字段中,键入客户机运行时尝试连接(或重新连接)AddressList 中每个地址的次数。到达这个值后,客户机运行时将尝试连接列表中的下一个地址。
选择默认 JMS 主机。
在“地址列表行为”下拉列表中,选择是按 AddressList 中的地址顺序 (priority) 还是按随机顺序 (random) 来尝试连接。
在“地址列表重复”字段中,键入为了建立(或重新建立)连接 JMS 服务在 AddressList 中重复的次数。
在“MQ 模式”和“MQ 服务”字段中,输入 Message Queue 地址模式名称和 Message Queue 连接服务名称(如果要使用非默认模式或服务)。
所有这些属性的值也可以在运行时更新。但是,只有那些在属性更新之后创建的连接工厂才会获取已更新的值。现有连接工厂将继续保持原始属性值。此外,为了使几乎所有值都生效,需要重新启动应用服务器。唯一无需重新启动应用服务器即可更新的属性是默认 JMS 主机。
要使用命令行实用程序管理 JMS 提供者,请使用 set 或 jms-ping 命令。
将提供者和主机更改到远程系统将使所有 JMS 应用程序在远程服务器上运行。要在使用本地服务器的同时使用一个或多个远程服务器,请使用 AddressList 属性创建连接工厂资源从而创建访问远程服务器的连接。
JMS 通用资源适配器 1.5 是 Java EE Connector 1.5 资源适配器,它可以包含外部 JMS 提供者(例如 IBM Websphere MQ、Tibco EMS 和 Sonic MQ 等)的 JMS 客户机库,从而将任何 JMS 提供者与 Java EE 1.4 应用服务器(例如 Sun Java System Application Server)进行集成。适配器是 .rar 归档文件,可以使用 Java EE 1.4 应用服务器的管理工具进行部署和配置。
可以使用 Application Server 的管理工具来部署和配置 JMS 通用资源适配器。本节介绍如何为 Sun Java System Application Server 配置 JMS 通用资源适配器。
总体而言,可以配置资源适配器以指明 JMS 提供者是否支持 XA。还可以指明 JMS 提供者可以使用哪种集成模式。资源适配器支持两种集成模式。第一种模式使用 JNDI 作为集成方法。在这种情况下,在 JMS 提供者的 JNDI 树下设置受管对象,并查找这些对象以供通用资源适配器使用。如果此模式不适于集成,还可以使用 JMS 受管对象 javabean 类的 Java 反射作为集成模式。
可以使用管理控制台或命令行来配置资源适配器。这与配置任何其他资源适配器相同。
在部署资源适配器之前,应使应用服务器能够访问 JMS 客户机库。对于某些 JMS 提供者,客户机库也可以包括本地库。在此类情况下,也应使应用服务器 JVM 能够访问这些本地库。
按照与部署连接器模块相同的方式部署通用资源适配器。
创建连接器连接池。
创建连接器资源。
创建受管对象资源。
对 Application Server 中的安全策略进行以下更改:
修改 sjsas_home/domains/domain1/config/server.policy,向其中添加 java.util.logging.LoggingPermission "control"
修改 sjsas_home/lib/appclient/client.policy,向其中添加权限 javax.security.auth.PrivateCredentialPermission "javax.resource.spi.security.PasswordCredential ^ \"^\"","read":
下表列出了创建资源适配器时要使用的属性。
属性名称 |
有效值 |
默认值 |
说明 |
---|---|---|---|
ProviderIntegrationMode |
javabean/jndi |
javabean |
确定资源适配器与 JMS 客户机之间的集成模式。 |
ConnectionFactoryClassName |
可用于应用服务器类路径中的类的名称,例如: com.sun.messaging.ConnectionFactory |
无 |
JMS 客户机的 javax.jms.ConnectionFactory 实现的类名。在 ProviderIntegrationMode 为 javabean 时使用。 |
QueueConnectionFactoryClassName |
可用于应用服务器类路径中的类的名称,例如: com.sun.messaging.QueueConnectionFactory |
无 |
JMS 客户机的 javax.jms.QueueConnectionFactory 实现的类名。在 ProviderIntegrationMode 为 javabean 时使用。 |
TopicConnectionFactoryClassName |
可用于应用服务器类路径中的类的名称,例如: com.sun.messaging.TopicConnectionFactory |
无 |
JMS 客户机的 javax.jms.TopicConnectionFactory 实现的类名称。在将 ProviderIntegrationMode 指定为 javabean 时使用。 |
XAConnectionFactoryClassName |
可用于应用服务器类路径中的类的名称,例如: com.sun.messaging.XAConnectionFactory |
无 |
JMS 客户机的 javax.jms.ConnectionFactory 实现的类名。在将 ProviderIntegrationMode 指定为 javabean 时使用。 |
XAQueueConnectionFactoryClassName |
可用于应用服务器类路径中的类的名称,例如: com.sun.messaging.XAQueueConnectionFactory |
无 |
JMS 客户机的 javax.jms.XAQueueConnectionFactory 实现的类名。在将 ProviderIntegrationMode 指定为 javabean 时使用。 |
XATopicConnectionFactoryClassName |
可用于应用服务器类路径中的类的名称,例如: com.sun.messaging.XATopicConnectionFactory |
无 |
JMS 客户机的 javax.jms.XATopicConnectionFactory 实现的类名。在 ProviderIntegrationMode 为 javabean 时使用。 |
TopicClassName |
可用于应用服务器类路径中的类的名称,例如: com.sun.messaging.Topic |
无 |
JMS 客户机的 javax.jms.Topic 实现的类名。在 ProviderIntegrationMode 为 javabean 时使用。 |
QueueClassName |
可用于应用服务器类路径中的类的名称,例如: com.sun.messaging.Queue |
无 |
JMS 客户机的 javax.jms.Queue 实现的类名。在将 ProviderIntegrationMode 指定为 javabean 时使用。 |
SupportsXA |
True/false |
FALSE |
指定 JMS 客户机是否支持 XA。 |
ConnectionFactoryProperties |
以逗号分隔的名称值对 |
无 |
指定 JMS 客户机的 javabean 属性名称以及 ConnectionFactory 的值。仅当 ProviderIntegrationMode 为 javabean 时才需要此属性。 |
JndiProperties |
以逗号分隔的名称值对 |
无 |
指定连接到 JMS 提供者的 JNDI 时使用的 JNDI 提供者属性。仅当 ProviderIntegrationMode 为 jndi 时才使用。 |
CommonSetterMethodName |
方法名 |
无 |
指定某些 JMS 供应商在设置其受管对象属性时使用的常见设置方法 (setter method) 名。 仅当 ProviderIntegrationMode 为 javabean 时才使用。在 Sun Java System Message Queue 中,此属性名为 setProperty。 |
UserName |
JMS 用户的名称 |
无 |
连接到 JMS 提供者时使用的用户名。 |
Password |
JMS 用户的密码 |
无 |
连接到 JMS 提供者时使用的密码。 |
RMPolicy |
ProviderManaged 或 OnePerPhysicalConnection |
ProviderManaged |
事务管理器使用 XAResource 的 isSameRM 方法来确定两个 XAResource 所表示的资源管理器实例是否相同。将 RMPolicy 设置为 ProviderManaged(默认值)时,JMS 提供者将负责确定通用资源适配器中的 RMPolicy 和 XAResource 包装器仅将 isSameRM 调用委托给消息队列提供者的 XA 资源实现。这应该适用于大多数消息队列产品。 有些 XAResource 实现(如 IBM MQ 系列)依靠每个物理连接的资源管理器,当在单个事务中针对同一队列管理器存在入站和出站通信时(例如 MDB 将响应发送到目的地),这将导致问题。将 RMPolicy 设置为 OnePerPhysicalConnection 时,通用资源适配器中 XAResource 包装器实现的 isSameRM 将检查两个 XAResource 是否使用同一物理连接,然后再委托给被包装的对象。 |
创建连接器连接池时,将指定 ManagedConnectionFactory 属性。可以在 ManagedConnectionFactory 中覆盖创建资源适配器时指定的所有属性。下面给出了仅可用于 ManagedConnectionFactory 中的其他属性。
属性名称 |
有效值 |
默认值 |
说明 |
---|---|---|---|
ClientId |
有效的客户机 ID |
无 |
由 JMS 1.1 规范指定的 ClientID。 |
ConnectionFactoryJndiName |
JNDI 名称 |
无 |
JMS 提供者的 JNDI 树中绑定的连接工厂的 JNDI 名称。管理员应在 JMS 提供者本身中提供所有连接工厂属性(clientID 除外)。仅当 ProviderIntegratinMode 为 jndi 时才使用此属性名称。 |
ConnectionValidationEnabled |
true/false |
FALSE |
如果设置为 true,资源适配器将使用异常侦听器捕捉任何连接异常,并向应用服务器发送 CONNECTION_ERROR_OCCURED 事件。 |
创建受管对象资源时,将指定本节中的属性。可以在受管资源对象中覆盖所有资源适配器属性。下面给出了仅可用于受管对象资源中的其他属性。
属性名称 |
有效值 |
默认值 |
说明 |
---|---|---|---|
DestinationJndiName |
JNDI 名称 |
无 |
JMS 提供者的 JNDI 树中绑定的目的地的 JNDI 名称。管理员应在 JMS 提供者本身中提供所有属性。仅当 ProviderIntegrationMode 为 jndi 时才使用此属性名称。 |
DestinationProperties |
以逗号分隔的名称值对 |
无 |
指定 JMS 客户机的 javabean 属性名称以及目的地值。仅当 ProviderIntegrationMode 为 javabean 时才需要此属性。 |
可以在特定于 Sun 的 MDB 部署描述符中将本节中的属性指定为激活配置属性。可以在激活规范中覆盖所有资源适配器属性。下面给出了仅可用于激活规范中的其他属性。
属性名称 |
有效值 |
默认值 |
说明 |
---|---|---|---|
MaxPoolSize |
整数 |
8 |
资源适配器为了实现并发消息传送而在内部创建的服务器会话池的最大大小。此大小应该等于 MDB 对象的最大池大小。 |
MaxWaitTime |
整数 |
3 |
资源适配器将等待此属性所指定的时间(以秒为单位)后,才能从其内部池中获得服务器会话。如果超过此限制,消息传送将失败。 |
SubscriptionDurability |
Durable 或 Non-Durable |
Non-Durable |
由 JMS 1.1 规范指定的 SubscriptionDurability。 |
SubscriptionName |
无 |
由 JMS 1.1 规范指定的 SubscriptionName。 |
|
MessageSelector |
有效的消息选择器 |
无 |
由 JMS 1.1 规范指定的 MessageSelector。 |
ClientID |
有效的客户机 ID |
无 |
由 JMS 1.1 规范指定的 ClientID。 |
ConnectionFactoryJndiName |
有效的 JNDI 名称 |
无 |
在 JMS 提供者中创建的连接工厂的 JNDI 名称。资源适配器将使用此连接工厂创建连接以接收消息。仅当 ProviderIntegrationMode 配置为 jndi 时才使用。 |
DestinationJndiName |
有效的 JNDI 名称 |
无 |
在 JMS 提供者中创建的目的地的 JNDI 名称。资源适配器将使用此目的地创建连接以接收消息。仅当 ProviderIntegrationMode 配置为 jndi 时才使用。 |
DestinationType |
javax.jms.Queue 或 javax.jms.Topic |
Null |
MDB 将侦听的目的地的类型。 |
DestinationProperties |
以逗号分隔的名称-值对 |
无 |
指定 JMS 客户机的 javabean 属性名称以及目的地值。仅当 ProviderIntegrationMode 为 javabean 时才需要此属性。 |
RedeliveryAttempts |
整数 |
当消息在 MDB 中导致运行时异常时,传送消息的次数。 |
|
RedeliveryInterval |
时间(秒) |
当消息在 MDB 中导致运行时异常时,重复传送之间的时间间隔。 |
|
SendBadMessagesToDMD |
true/false |
False |
指示当超过传送尝试次数时,资源适配器是否应将消息发送到停用消息目的地。 |
DeadMessageDestinationJndiName |
有效的 JNDI 名称。 |
无 |
在 JMS 提供者中创建的目的地的 JNDI 名称。这是停用消息的目的地。仅当 ProviderIntegrationMode 为 jndi 时才使用。 |
DeadMessageDestinationClassName |
目的地对象的类名。 |
无 |
仅当 ProviderIntegrationMode 为 javabean 时才使用。 |
DeadMessageDestinationProperties |
以逗号分隔的名称值对 |
无 |
指定 JMS 客户机的 javabean 属性名称以及目的地值。仅当 ProviderIntegrationMode 为 javabean 时才需要此属性。 |
ReconnectAttempts |
整数 |
当异常侦听器捕捉到连接错误时进行重新连接的尝试次数。 |
|
ReconnectInterval |
时间(秒) |
重新连接之间的时间间隔。 |