本主题解释了如何使用 JMS 传输和 SOAtest, 以及 在 Virtualize 中支持工具和提供操作工具。
其包括以下部分:
JMS 前提条件
如果要使用 SOAtest 或 Virtualize 工具作为 JMS 客户机,我们建议 SOAtest 或 Virtualize 咨询 JNDI 提供程序来连接 JMS 中间件。为了使其连接成功,需要设置 JNDI 提供程序,并且所有必需 jar 文件都需要添加到 SOAtest 或 Virtualize 类路径。(关于如何将 jars 添加到类路径的更多消息,请查阅 System Properties Settings)。还需要提供 JNDI 提供程序将查阅的连接工厂、目的地和应答队列的名称。
如果 JMS 配置没有 SOAtest 或 Virtualize 可以查询 ConnectionFactory 实例的 JNDI 提供程序,请遵循 JMS Messaging without JNDI 中的指导说明。或者,您可以设置简单的文件系统 JNDI 提供程序。 此类提供程序的 .jars 和文档可从 Oracle Java 站点获得。设置文件系统提供程序非常简单,下载部分包含了文档。 一旦提供程序准备就绪,请如 Configuration for Popular JMS Providers 中所描述使用简单的 Java 代码块来创建 ConnectionFactory 实例,以便使用主机和端口作为参数连接到 JMS 服务器。对于本产品使用的 Topics and Queues 也应该这样做。
配置 JMS 选项
从合适工具的 Transport 选项卡内的传输(Transport)下拉菜单选中 JMS ,将在左窗格显示以下选项:
- Connection Settings
- Queue/Topic
- Messaging Model
- Messaging Expiration
- Message Exchange Pattern
- Message Type
- Request Message Properties
- Response Message Correlation
Connection Settings
Connection Settings 包括 JNDI 初始上下文 的 Settings 和 Properties 选项卡。
Properties 选项卡是可选项,它允许执行传递给 JNDI javax.naming.InitalContext 构造器的其他属性(除了在设置选项卡中指定的提供程序 URL 和初始上下文工厂属性)。属性值可以通过单击 Add 并完成 Add JMS 属性对话框以进行添加,也可以设置为固定值、参数化值、脚本化值或唯一值(一个自动生成的随机唯一值,没有两个工具调用将使用同一个值)。
Settings 选项卡包含以下内容:
- Provider URL:指定传递给 JNDI javax.naming.InitialContext 构造器名为 javax.naming.Context.PROVIDER_URL 属性的值。
- Initial Context:指定作为名为 javax.naming.Context.INITIAL_CONTEXT_FACTORY 属性的字符串值传递给 JNDI javax.naming.InitialContext 构造器的完全限定类名字符串。
- Connection Factory:为工厂指定 JNDI 名称。这将传递给 javax.naming.InitialContext 中的 lookup() 方法,以创建 javax.jms.QueueConnectionFactory 或 javax.jms.TopicConnectionFactory 实例。
除了 Settings 选项卡,Connection Settings 还包括:
- Queue Connection Authentication:允许用户提供用户名和密码来创建队列连接。选择 Perform Authentication 复选框,输入 Username 和 Password 以对请求进行身份验证。如果不使用正确的用户名和密码,将不会对请求进行身份验证。将此处提供的用户名和密码传递给 javax.jms.QueueConnectionFactory 类中的 createQueueConnection() 方法,以便获得 javax.jms.QueueConnection 实例。
Queue/Topic
Queue/Topic 设置包括以下选项:
- JMS Destination:指定将消息发送到何处的队列名称(如果使用点到点)或主题名称(如果使用发布和订阅)。
- JMS ReplyTo:指定从何处获得响应消息的队列名称(如果使用点到点)或主题名称(如果使用发布和订阅)。如果选中的是 Temporary 而不是 Form,则这可以是临时队列。
Messaging Model
Messaging Model 选项指定如何在应用程序之间发送消息。选择 Point to Point 或 Publish and Subscribe。
Messaging Expiration
Messaging Expiration 选项指定消息有效期时间(以毫秒为单位)。
Message Exchange Pattern
Message Exchange Pattern 选项指定是 SOAtest 接收响应还是 Virtualize 接收响应。如果选择 Get Response ,SOAtest 或 Virtualize 发送消息并接收响应。如果选择 Get Response ,SOAtest 或 Virtualize 只发送消息不接收响应。
如果选择 Get Response ,则还可以启用 Create message consumer on the JMSReplyTo destination before sending the message。如果希望响应很快便可在 JMSRepltTo 主题上可用,则应启用此选项确保响应消息发布之前,SOAtest 或 Virtualize 订阅给应答主题。
此选项不可与 Match response JMSCorrelationID with the request JMSMEssageID 混合使用,因为 JMS 规范要求供应商在消息发送后生成 JMSMessageID。因此,没有办法使用该关联(选择器)在响应目的地上创建使用者,直到消息设置好并且 JMSMessageID 可用之后。
Message Type
Message Type 选项允许从下拉菜单中选择消息类型。JMS 消息是一个 Java 对象,它包含在 JMS 客户机之间传输的数据。可使用以下消息类型:
- TextMessage: 用于发送包含 java.lang.String 的消息。如果只希望发送简单的文本文档,则这一点非常有用。如果正在通过 JMS 执行 SOAP,那么您输入到 TextMessage 的字符串应该为 SOAP Envelope。
- BytesMessage: 用于发送包含未编译字节流的消息。消息的接收方根据其认为合适的方式解释字节。如果正在通过 JMS 执行 SOAP,那么您输入到 ByteMessage 的字符串应该组成 SOAP Envelope。数据以其最基本表现形式发送。在 JMS 节点只对转发/路由数据感兴趣,而数据的内容对它们并不重要时,这一点也很有用。它经常与 TextMeassage 一起使用。
- 当 Parasoft 首选项中编码为 UTF-8(默认)时,可以使用 Method 选项来控制字符串如何从响应 BytesMessages 中提取。下拉菜单中的两个方法与 BytesMessage JMS API 中的两个可用方法相对应(有关更多详情,请查阅 Oracle Java 文档)。
- 如果在首选项中选择了不同编码,则 SOAtest 或 Virtualize 将总是在响应消息上调用 BytesMessage.readBytes() ,以便说明不同的字符编码。
- StreamMessage: 用于发送原始值流。如果正在通过 JMS 执行 SOAP,那么您输入到 StreamMessage 的字符串应该是 SOAP Envelope。
- ObjectMessage: 用于发送 Java Serializable。应该使用 Scripting 输入视图来返回 Java Serializable。此对象将在运行时被获取并粘贴到 ObjectMessage 中。
- MapMessage: 用于发送一组 name-value 对。该值只会是 java 原始类型或其各自的包装类、字符串或字节数组。MapMessage 对象的复杂性之一是:即使插入值作为字符串(使用 setString()),但如果该值可以强制转换为整数型,那么也可以调用 getInt() 并获得整数型的值。
Request Message Properties
Request Message Properties 是可选项,它允许要设置到 javax.jms.Message 对象的任何其他属性值,然后将其发送到队列或发布到主题。这些包括预定义属性,这些属性被设置为使用一个与 javax.jms.Message 或自定义属性(例如,使用 setStringProperty、setBooleanProperty、setByteProperty 设置的属性)中相对应的“set”方法。
属性值可以通过单击 Add 并完成 Add JMS 属性对话框以进行添加,也可以设置为固定值、参数化值、脚本化值或唯一值(一个自动生成的随机唯一值,没有两个工具调用将使用同一个值)。确保为每个添加值指定类型。
Response Message Correlation
响应信息关联设置包括以下选项:
- Match response JMSCorrelationID with request JMSMessageID: 如果选择该选项,术语 JMSCorrelationID = '[msgId]’ 将被附加到选择器表达式之后,其中 msgId 是从传出(请求)javax.jms.Message(使用 getJMSMessageID() 方法)中动态生成的。实际上,这会导致工具阻塞,直到具有指定关联 id 的消息在队列(或主题)中可用,并且它只检索特定的消息,而不检索队列(或主题)中的任何消息。如果没有监视选择器条件的消息,工具将在超时量过期后超时。
- Match response JMSCorrelationID with request JMSCorrelationID: 如果选择该选项,术语 JMSCorrelationID = '[correlationId]’ 将附加到选择器表达式后,其中 correlationId 从消息属性部分中的 JMSCorrelationID 属性检索到。该选项只在此属性添加到消息属性部分时才可启用。实际上,这会导致工具阻塞,直到具有指定关联 id 的消息在队列(或主题)中可用,并且它只检索特定的消息,而不检索队列(或主题)中的任何消息。如果没有监视选择器条件的消息,工具将在超时量过期后超时。
- Additional Selector Expression Terms:(可选项)输入一个值作为消息过滤器。例如,通过输入
username==John
,只有包含 "John” 作为用户名的消息才会被发送。如果该字段保留为空,则可以从队列接收任何消息。
将该表达式传递给在点到点消息传递中 javax.jms.QueueSession 类的 createReceiver() 方法,或者在发布并订阅消息传递中 javax.jms.TopicSession 类的 createSubscriber() 方法。关于指定选择器的提示,请查阅 Using Message Selector Filters。
配置以用于流行的 JMS 提供程序
请查阅 JMS 提供程序配置
使用消息选择器过滤器
在各种工具中,可以指定一个值作为消息过滤器。这指定在标记为 Message Selector 或 Additional Selector Expression Terms 的字段中。
例如,通过输入 username==John
,只有包含 "John” 作为用户名的消息才会被发送。如果字段保留为空,则可以接收任何消息。
这是用来处理消息选择器过滤器的一些提示:
可以根据变量、环境变量和数据源值参数化其他选择器表达术语值。引用变量和环境变量的语法为 ${myVariableName}。引用 XML 数据库值和数据源值的语法为:${myColumnName}.例如,可以使用 JMSCorrelationID ='${myColumnName}。
- 如果要根据内容过滤事件消息,那么可以将如 XML 转换器的工具链接到其 XML 事件输出。
- 选择器字段链接到名为 "message selectors”的 JMS 功能。指定表达式在创建 javax.jms.MessageConsumer 的时候传递给 javax.jms.Session 对象。JMS 规范定义的选择器表达式可以应用于 JMS 消息数据头和属性,但不可应用于消息主体内容。
- 在点到点的消息传递中,该表达式被传递给 javax.jms.QueueSession 类的 createReceiver() 方法中。在发布和订阅消息传递中,其被传递给 javax.jms.TopicSession 类的 create-Subscriber() 方法中。
表达式语法是 SQL92 的子集。例如,如果表达式为
fruit = 'apple'
或JMSCorrelationID = '123456
',
则只有具有属性fruit
值定义为apple
或 JMS 数据头 JMSCorrelationID 值设置为123456
才会被获取。- 关于更多信息,请参考 Oracle Java 站点上的 Java Message Service Specification。
没有 JNDI 的 JMS 消息传递
从体系结构的角度强烈建议使用 JNDI 来获取 JMS 连接工厂和目标实例。在测试或阶段环境中,JMS 系统偶尔仍未配置 JNDI,或者 JNDI 仍然没有包括所需连接工厂。此外,在测试期间绕过 JNDI,以便调试问题或隔离具有和不具有 JNDI 的系统性能特征,这一点可能很有帮助。
有了这些原因,只要 JMS 提供程序允许,SOAtest 或 Virtualize 支持 JMS 的工具将允许直接使用供应商连接工厂发送并接收 JMS 消息,而不需通过 JNDI。
该性能支持某些 JMS 实现,该实现指定来允许首先在没有 JNDI 的情况下建立 JMS 连接,并为连接工厂类提供以单个字符串参数作为连接 URL 的构造函数。
支持的 JMS 实现
由于这种对没有 JNDI 的 JMS 消息传递的支持并不基于标准 JMS API,因此不能保证它可以跨不同的 JMS 实现移植。
该功能已经通过 Sonic 和 TIBCO JMS 进行了测试。它还支持 WebSphere MQ,其配置如 IBM WebSphere MQ (MQ Series) 中所述。
编写时,SOAtest 或 Virtualize 不支持为 Oracle/BEA WebLogic、JBoss 或 WebSphere 默认 JMS 提供程序直接创建连接工厂,并且在大多数情况下,这些供应商不提供文档说明,也不鼓励这样做。
配置
若要在 SOAtest 或 Virtualize 中配置一个 JMS 消息传递工具以发送/接收没有 JNDI 的消息:
- 请保持连接 JNDI 连接设置 Provider URL 字段中的连接 URL。
- 保留 Initial Context 字段为空。
- 在 Connection Factory 字段中指定完全限定 MOM 连接工厂类名。该类名应该表示实现 javax.jms.ConnectionFactory 的类。
- 在 Sonic 和 TIBCO 的案例中,您可以遵循与 JNDI 提供程序 URL 相同的模式(请查阅 Progress Sonic MQ/ESB and TIBCO EMS 以获得更多详情)。
空的 Initial Context 字段被解释为在没有 JDNI 的情况下直接实例化连接工厂对象的信号。它将尝试使用带单个字符串参数的构造函数来实现这一点,该参数传递在 Provider URL 字段中指定的连接 URL。连接身份验证设置仍然像往常一样使用。如果在提供程序的连接工厂 API 中没有存在这样的构造函数,则需要 JNDI,以便实例化连接工厂类。
例如,在 Sonic JMS 的案例中,提供的 Connection Factory 类名将是 progress.message.jclient.ConnectionFactory
。对于 TIBCO JMS,其类名将是 com.tibco.tibjms.TibjmsConnectionFactory
。另一方面,JBoss 和 OpenJMS 没有带单个连接 URL 参数的连接工厂。在这些情况下,必须要有 JNDI,以便使用 SOAtest 或 Virtualize 与这些系统交换 JMS 消息。
如果存在 JNDI 并且目录中存在该名称,则不管如何配置 JNDI 设置,SOAtest 和 Virtualize 将总是尝试从 JNDI 解析目标名称(队列或主题)。如果无法通过 JNDI 找到它,则它将尝试从 JMS 会话实例直接创建目标,假设用户提供的名称是物理目标名称,而不是 JNDI 名称。
注意,也可以使用 Sun 的 JNDI 实例。关于更多详情,请查阅 Sun JMS 。
浏览队列内容
队列浏览器允许查看在 Websphere MQ, Websphere Application Server, Tibco EMS, Sonic MQ, ActiveMQ 和任何其他 JMS 提供程序上部署的队列内容。请查阅 Browsing Queues 以获得更多详情)。