本主题介绍如何在 SOAtest 中使用 JMS 传输,以及 Virtualize 中的支持工具和服务提供操作工具

其包括以下部分:

JMS 前提条件

如果要使用 SOAtest 或 Virtualize 工具作为 JMS 客户端,我们建议 SOAtest 或 Virtualize 咨询 JNDI 提供者来连接 JMS 中间件。为此,需要设置 JNDI 提供者,并将所有必要的 jar 文件(即包含初始化环境的文件)添加到 SOAtest 或 Virtualize 的 classpath 中(有关如何将 jar 文件添加到 classpath 的详情,请参阅系统属性设置)。还需要提供 JNDI 提供者将查阅的连接工厂、目的地和应答队列的名称。

如果 JMS 配置没有 SOAtest 或 Virtualize 可以查询 ConnectionFactory 实例的 JNDI 提供者,请遵循没有 JNDI 的 JMS 消息传递中的指导说明。或者,您可以设置简单的文件系统 JNDI 提供者。此类提供者的 .jar 和文档可从 Oracle Java 站点获得。设置文件系统提供者非常简单,下载部分包含了文档。  提供者准备就绪后,使用主流 JMS 提供者配置中描述的简单 Java 代码创建 ConnectionFactory 实例,使用主机和端口作为参数连接到 JMS 服务器。对于本产品使用的主题和队列也应采取同样的操作。 

配置 JMS 选项 

从相应工具传输选项卡内的传输菜单选择 JMS,将在左窗格显示以下选项:

连接设置

连接设置包括 JNDI 初始化环境的设置和属性选项卡。 

属性选项卡是可选项,它允许执行传递给 JNDI javax.naming.InitalContext 构造器的其他属性(除了在设置选项卡中指定的提供者 URL 和初始化环境工厂属性)。属性值(可通过点击添加并完成添加 JMS 属性对话框来添加)可设置为固定值、参数化值、脚本化值或唯一值(自动生成的随机唯一值;不会有两次工具调用使用相同的值)。

设置选项卡包含以下内容:

  • 如果为 JMS 连接创建了共享属性,则将提供一个下拉菜单,您可以从中选择使用本地设置使用共享设置
    • 如果选择使用共享设置,则将显示第二个下拉菜单,您可以从中选择工具将使用的所需全局 JMS 设置。有关全局 JMS 设置的更多信息,请参阅添加全局测试组件属性
    • 如果选择使用本地设置,或者如果没有指定任何共享属性,则可以配置连接设置的剩余部分。

  • 生产者 URL:指定传递给 JNDI javax.naming.InitialContext 构造器名为 javax.naming.Context.PROVIDER_URL 属性的值。
  • 初始化环境:指定作为名为 javax.naming.Context.INITIAL_CONTEXT_FACTORY 属性的字符串值传递给 JNDI javax.naming.InitialContext 构造器的完全限定类名字符串。
  • 连接工厂:指定工厂的 JNDI 名称。这将传递给 javax.naming.InitialContext 中的 lookup() 方法以创建 javax.jms.QueueConnectionFactory 或 javax.jms.TopicConnectionFactory。

除了设置选项卡,连接设置还包括:

  • 队列连接授权:允许用户提供用户名和密码来创建队列连接。启用执行授权选项并输入用户名密码以验证请求。如果未使用正确的用户名和密码,则不会对请求进行身份验证。此处提供的用户名和密码传递给 javax.jms.QueueConnectionFactory 类中的 createQueueConnection() 方法,以便获得 javax.jms.QueueConnection 实例。

  • 保持激活连接:选择通知测试是否共享或关闭当前连接。共享连接被返回到连接池,以便在整个测试套件中使用。连接池的生命圈如下所示:
    • 对于单个测试,其将在测试执行结束被销毁。
    • 对于测试套件,其将在测试套件执行结束被销毁。
    • 对于负载测试,其将在负载测试结束被销毁。

队列/主题

队列/主题设置包括以下选项:

  • JMS Destination:指定将消息发送到何处的队列名称(如果使用点对点)或主题名称(如果使用发布和订阅)。
  • JMS ReplyTo:指定从何处获得响应消息的队列名称(如果使用点对点)或主题名称(如果使用发布和订阅)。如果选中的是临时而不是,则可以是临时队列。

消息传送模板

指定如何在应用程序之间发送消息。选择点对点发布与订阅

消息过期

消息过期选项指定消息有效期时间(以毫秒为单位)。

消息交换模式

指定是 SOAtest 接收响应还是 Virtualize 接收响应。如果选择 Get 响应,SOAtest 或 Virtualize 发送消息并接收响应。如果不选择 Get 响应,SOAtest 或 Virtualize 只发送消息不接收响应。

如果选择 Get 相应,则还可以启用发送消息前在 JMSReplyTo 接收站创建消息使用方。如果预期 JMSReplyTo 主题上的回复很快就会出现,则应启用此选项,以确保 SOAtest 或 Virtualize 在发布回复消息前已订阅响应主题。

此选项不可与使用请求 JMSCorrelationID 匹配响应 JMSCorrelationID 混合使用,因为 JMS 规范要求供应商在消息发送后生成 JMSMessageID。因此,没有办法使用该关联(选择器)在响应目的地上创建使用者,直到消息设置好并且 JMSMessageID 可用之后。 

消息类型

允许从下拉菜单中选择消息类型。JMS 消息是一个 Java 对象,它包含在 JMS 客户端之间传输的数据。可使用以下消息类型:

  • TextMessage:用于发送包含 java.lang.String 的消息。如果只希望发送简单的文本文档,则这一点非常有用。如果正在通过 JMS 执行 SOAP,那么您输入到 TextMessage 的字符串应该为 SOAP 消息封套。
  • BytesMessage:用于发送包含未编译字节流的消息。消息的接收方根据其认为合适的方式解释字节。如果正在通过 JMS 执行 SOAP,那么您输入到 ByteMessage 的字符串应该组成 SOAP 消息封套。数据以其最基本表现形式发送。在 JMS 节点只对转发/路由数据感兴趣,而数据的内容对它们并不重要时,这一点也很有用。它经常与 TextMeassage 一起使用。
    • 当 Parasoft 首选项中编码为 UTF-8(默认)时,可以使用方法选项来控制如何从响应 BytesMessages 中提取字符串。下拉菜单中的两种方法与 BytesMessage JMS API 中的两种方法相对应(详情请参阅 Oracle Java 文档)。
    • 如果在首选项中选择了不同编码,则 SOAtest 或 Virtualize 将总是在响应消息上调用 BytesMessage.readBytes(),以便说明不同的字符编码。
  • StreamMessage:用于发送原始值流。如果正在通过 JMS 执行 SOAP,那么您输入到 StreamMessage 的字符串应该是 SOAP 消息封套。
  • ObjectMessage:用于发送 Java Serializable。应该使用脚本输入视图来返回 Java Serializable。此对象将在运行时被获取并粘贴到 ObjectMessage 中。
  • MapMessage:用于发送一组 name-value 对。该值只会是 java 原始类型或其各自的包装类、字符串或字节数组。MapMessage 对象的复杂性之一是:即使插入值作为字符串(使用 setString()),但如果该值可以强制转换为整数型,那么也可以调用 getInt() 并获得整数型的值。

请求消息属性

可选项。它允许要设置到 javax.jms.Message 对象的任何其他属性值,然后将其发送到队列或发布到主题。这些包括预定义属性,这些属性被设置为使用一个与 javax.jms.Message 或自定义属性(例如,使用 setStringProperty、setBooleanProperty、setByteProperty 设置的属性)中相对应的“set”方法

属性值(可通过点击添加并完成添加 JMS 属性对话框来添加)可设置为固定值、参数化值、脚本化值或唯一值(自动生成的随机唯一值;不会有两次工具调用使用相同的值)。确保为每个添加值指定类型。

响应消息关联性

响应消息关联性设置包括以下选项:

  • 使用请求 JMSMessageID 匹配响应 JMSCorrelationID:如果选择该选项,术语 JMSCorrelationID = '[msgId]’ 将被附加到选择器表达式之后,其中 msgId 是从传出(请求)javax.jms.Message(使用 getJMSMessageID() 方法)中动态生成的。实际上,这会导致工具阻塞,直到具有指定关联 id 的消息在队列(或主题)中可用,并且它只检索特定的消息,而不检索队列(或主题)中的任何消息。如果没有监控选择器条件的消息,工具将在超时量过期后超时。
  • 使用请求 JMSCorrelationID 匹配响应 JMSCorrelationID:如果选择该选项,术语 JMSCorrelationID = '[correlationId]' 将附加到选择器表达式后,其中 correlationId 从消息属性部分中的 JMSCorrelationID 属性检索到。该选项只在此属性添加到消息属性部分时才可启用。实际上,这会导致工具阻塞,直到具有指定关联 id 的消息在队列(或主题)中可用,并且它只检索特定的消息,而不检索队列(或主题)中的任何消息。如果没有监控选择器条件的消息,工具将在超时量过期后超时。
  • 附加的选择器表达式术语:(可选)输入一个值作为消息过滤器。例如,通过输入 username==John,只有包含 "John" 作为用户名的消息才会被发送。如果该字段保留为空,则可以从队列接收任何消息。
    将该表达式传递给在点到点消息传递中 javax.jms.QueueSession 类的 createReceiver() 方法,或者在发布并订阅消息传递中 javax.jms.TopicSession 类的 createSubscriber() 方法。有关指定选择器的提示,请参阅使用消息选择器过滤器

使用 JMS 为客户端输出消息对象

可以添加消息对象输出给使用 JMS 传输的消息传送客户端。还可以将传入的 JMS 消息输出添加到使用 JMS 传输的回调工具中。可以链接扩展工具,例如,使用 JMS 的消息传送客户端,以便访问响应 JMS 消息。在 ObjectMessage 用例中,可以使用 getter 和 equals() 方法来验证响应,从而创建回归控制。此外,您还可以将比较工具链接到响应通讯报文,如果响应是一个 ObjectMessage,则 SOAtest 将会把插入的可序列化对象转换为 XML 格式并执行 XML 比较。这样您就可以使用数据库值,忽略 Xpath 差异等。

要实现以上目的,请完成以下步骤:

  1. 右键点击消息传送客户端或回放工具节点并选择添加输出。将打开添加输出向导。
  2. 在左窗格中选择响应> 消息对象(或回放工具的进入请求> 传入 JMS 消息)。 
  3. 从右窗格选择新建输出已有输出以及所需工具(比如,扩展工具)。
  4. 点击完成。SOAtest 将新输出添加到所选节点。

主流 JMS 提供者配置

请参阅 JMS 提供者配置

响应给临时的 JMSReplyTo 队列

若要响应在 JMSReplyTo 字段中设置临时队列的 JMS 消息:

  1. 请创建回调工具并配置其接收 JMS 消息。
  2. 右键点击回放工具并选择添加输出> 传入 JMS 消息>  扩展工具
  3. 编写一个自定义脚本,将传入消息(input 对象)放入具有预先确定键的脚本化上下文中。
    • 该键在 SOAPUtil.JMS_MSG_KEY 下的 SOAtest Extensibility API 中定义。要访问 SOAtest Extensibility API,请前往帮助 > 帮助内容Parasoft > 帮助(取决于您的安装程序),然后查找标题为“Parasoft SOAtest Extensibility API”的手册。

    • 这是一个 Jython 示例:
      from soaptest.api import *

      def getJMSReplyTo(input, context):
        context.put(SOAPUtil.JMS_MSG_KEY, input)
  4. 创建并配置将发送 JMS 响应消息的工具。
    • SOAPUtil.JMS_CONTEXT_QUEUE,是在 SOAtest Extensibility API 中定义的另一个关键字,其应该用作该工具的 JMSDestination。

然后,SOAtest 将使用接收消息的临时队列作为目的地,而不是输入关键字作为目的地。

使用消息选择器过滤器

在各种工具中,可以指定一个值作为消息过滤器。指定在标记为消息选择器附加的选择器表达式术语的字段中。

例如,通过输入 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 连接设置生产者 URL 字段中的连接 URL。
  • 初始化环境字段留空。
  • 连接工厂字段中指定完全限定 MOM 连接工厂类名。该类名应该表示实现 javax.jms.ConnectionFactory 的类。
    • 在 Sonic 和 TIBCO 的案例中,您可以遵循与 JNDI 提供者 URL 相同的模式(详情请参阅 Progress Sonic MQ/ESB 和 TIBCO EMS)。

空的初始化环境字段被解释为在没有 JDNI 的情况下直接实例化连接工厂对象的信号。它将尝试使用带单个字符串参数的构造函数来实现这一点,该参数传递在生产者 URL 字段中指定的连接 URL。连接身份验证设置仍然像往常一样使用。如果在提供者的连接工厂 API 中没有存在这样的构造函数,则需要 JNDI,以便实例化连接工厂类。

例如,在 Sonic JMS 的案例中,提供的连接工厂类名将是 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 提供者上部署的队列内容。请参阅 在 SOAtest 中浏览队列在 Virtualize 中浏览队列 了解更多。


  • No labels