使用 JMS 传输作为连接协议
通常情况下,客户端应用程序在调用 WebLogic Web Service 时使用 HTTP/S 作为连接协议。但是,您可以对 WebLogic Web Service 进行配置,以便客户端应用程序可以改用 JMS 作为传输。请按照后面部分中的描述使用 JWS 批注或 jwsc
Ant 任务的子元素配置传输。
将 WebLogic Web Service 配置为使用 JMS 进行连接传输时,为 Web Service 的已生成 WSDL 中的对应端口指定的端点地址在其 URL 中使用 jms://
而不是 http://
。下面是 JMS 端点地址的示例:
jms://myHost:7001/transports/JMSTransport?URI=JMSTransportQueue
URL 的 URI=JMSTransportQueue
部分指定已经为 JMS 传输功能配置的 JMS 队列。虽然无法使用 HTTP 调用 Web Service,但可以使用 HTTP 查看它的 WSDL,这就是 clientgen
为什么仍旧能够为 Web Service 生成 JAX-RPC 存根控件。
对于您指定的每个传输,WebLogic Server 都会在 WSDL 中生成一个附加端口。因此,如果要为客户端应用程序提供传输选项以供它们在调用 Web Service 时使用(JMS、HTTP 或 HTTPS),应使用适当的 JWS 批注或 jwsc
的子元素明确添加传输。
警告: | 使用 JMS 传输是 WebLogic 功能的一项增值之处。非 WebLogic 客户端应用程序(如 a.NET 客户端)可能无法使用 JMS 端口调用 Web Service。 |
使用 JMS 传输:主要步骤
以下过程描述如何指定可使用 JMS 传输调用 Web Service。
它假设您已经创建了一个实现 Web Service 的基本 JWS 文件,并且您想要配置该 Web Service 以使用 JMS 对其进行调用。它还假设您设置了一个基于 Ant 的开发环境并且您有一个有效的 build.xml
文件,该文件包括用于运行 jwsc
Ant 任务和部署服务的目标。有关详细信息,请参阅 WebLogic Web Service 的迭代开发 和 JWS 文件编程。
为所需 JMS 组件配置 WebLogic Server 域。您可以自己配置这些资源,也可以使用 Configuration Wizard 通过 Web Service 特定扩展模板来扩展 WebLogic Server 域。使用 Configuration Wizard 可以大大简化所需的配置步骤;有关详细信息,请参阅配置域的 Web Service 功能。在浏览器中调用管理控制台,如调用管理控制台中所述。使用管理控制台创建并配置下列 JMS 组件(如果它们尚不存在):-
JMS 服务器。请参阅创建 JMS 服务器。JMS 模块,定位到上一个 JMS 服务器。请参阅创建 JMS 模块。JMS 队列,包含在上一个 JMS 模块中。您可以指定 WebLogic Web Service 在默认情况下监听的 JMS 队列的 JNDI 名称 (weblogic.wsee.DefaultQueue
),也可以指定其他名称。如果指定其他 JNDI 名称,则可以以后将该名称传递到 Web Service 本身。配置队列时,请确保您指定的此 JMS 队列为本地队列,通常通过设置本地 JNDI 名称进行指定。请参阅创建队列。
将@WLJmsTransport
批注添加到 JWS 文件中。如果要替代在上一步指定的文件中的 JMS 端口,可以选择将<WLJmsTransport>
子元素添加到jwsc
Ant 任务。有关详细信息,请参阅使用 jwsc Ant 任务的 <WLJmsTransport> 子元素。通过在调用jwsc
任务的build.xml
Ant 文件中重新运行目标来重新生成 Web Service。例如,如果调用jwsc
Ant 任务的目标名为build-service
,则要运行:prompt> ant build-service
将 Web Service 重新部署到 WebLogic Server。
有关更新客户端应用程序以使用 JMS 传输调用 Web Service 的信息,请参阅使用 JMS 传输调用 WebLogic Web Service。
使用 @WLJmsTransport JWS 批注
如果您在为 JWS 文件编程时知道您希望客户端应用程序使用 JMS 传输(而不是 HTTP/S)调用 Web Service,可以使用 @WLJmsTransport
指定调用的详细信息。以后在生成时,可以通过指定 jwsc
Ant 任务的 <WLJmsTransport>
子元素(如使用 jwsc Ant 任务的 <WLJmsTransport> 子元素中所述)来替代 JWS 文件中的批注并添加其他 JMS 传输规范。
使用 @WLJmsTranport
批注时,请遵循下列原则:
以下示例显示了一个使用 @WLJmsTransport
批注的简单 JWS 文件,相关代码以粗体显示:
package examples.webservices.jmstransport;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import weblogic.jws.WLJmsTransport;
@WebService(name="JMSTransportPortType",
serviceName="JMSTransportService",
targetNamespace="http://example.org")
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,
use=SOAPBinding.Use.LITERAL,
parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)
// WebLogic 特定的 JWS 批注,用于指定生成 Web Service
// 的 URI 所使用的上下文路径和服务 URI 为
// “transports/JMSTransport”
@WLJmsTransport(contextPath="transports", serviceUri="JMSTransport",
queue="JMSTransportQueue", portName="JMSTransportServicePort")
/**
* 此 JWS 文件形成了带有下列单个操作的简单 Java 类实现的 WebLogic
* Web Service 的基础:sayHello
*
* @作者版权所有 (c) 2005,BEA Systems。保留所有权利。
*/
public class JMSTransportImpl {
@WebMethod()
public String sayHello(String message) {
System.out.println("sayHello:" + message);
return "Here is the message: '" + message + "'";
}
}
使用 jwsc Ant 任务的 <WLJmsTransport> 子元素
您也可以在生成时使用 jwsc
Ant 任务的 <jws>
元素的 <WLJmsTransport>
子元素指定 JMS 传输。在生成时指定传输的原因包括:
如果为 jwsc
Ant 任务指定一种传输,则该传输优先于 JWS 文件中的任何传输批注。
<target name="build-service">
<jwsc
srcdir="src"
destdir="${ear-dir}">
<jws file="examples/webservices/jmstransport/JMSTransportImpl.java">
<WLJmsTransport
contextPath="transports"
serviceUri="JMSTransport"
portName="JMSTransportServicePort"
queue="JMSTransportQueue"/>
</jws>
</jwsc>
</target>
上面的示例说明如何将在使用 @WLJmsTransport JWS 批注中显示的 JWS 文件中指定的值指定给 URL 和 JMS 队列。
有关使用 jwsc
Ant 任务的详细信息,请参阅 jwsc。
使用 JMS 传输调用 WebLogic Web Service
可编写客户端应用程序以使用 JMS 传输调用 Web Service,方式与编写使用 HTTP 传输的客户端应用程序一样。唯一区别是:必须确保已经创建了 JMS 队列(由 @WLJmsTransport
批注或 jwsc
任务的<WLJmsTransport>
子元素指定)和其他 JMS 对象。有关详细信息,请参阅使用 JMS 传输:主要步骤。
虽然无法使用 HTTP 调用 JMS 传输配置的 Web Service,但可以使用 HTTP 查看它的 WSDL,因此 clientgen
Ant 任务仍旧能够为 Web Service 创建 JAX-RPC 存根控件。例如,此部分中显示的 Web Service 的 WSDL 的 URL 将会是:
http://host:port/transports/JMSTransport?WSDL
但是,因为已部署的 Web Service 的 WSDL 中的端点地址使用 jms://
而不是 http://
,并且该地址包括限定符 ?URI=
JMS_QUEUE
,所以 clientgen
Ant 任务会在调用 Web Service 时自动创建使用 JMS 传输所需的存根控件,并且客户端应用程序不需要执行不同于平常的操作。下面是 JMS 端点地址的示例:
jms://host:port/transports/JMSTransport?URI=JMSTransportQueue
警告: | 如果您已经指定使用 JMS 传输调用的 Web Service 还在事务上下文中运行(也就是说,JWS 文件包括 @weblogic.jws.Transactional 批注),必须在调用该服务时使用异步请求响应。如果不这样,将会发生死锁,并且调用将会失败。 |
有关调用 Web Service 的常规信息,请参阅调用 Web Service。
替代默认服务地址 URL
如果编写的客户端应用程序使用 clientgen
生成的 JAX-RPC 存根控件调用 Web Service,则 Web Service 的默认服务地址 URL 是在 Service
构造方法的 WSDL 文件参数的 <address>
元素中指定的 URL。
但是,有时可能需要替代该地址,尤其是在调用的 WebLogic Web Service 部署到某个群集并且您想要指定群集地址或群集中受管服务器的地址列表时。可能还需要使用 t3
协议调用 Web Service。要在使用 JMS 传输时替代此服务端点 URL,请使用 weblogic.wsee.jaxrpc.WLStub.JMS_TRANSPORT_JNDI_URL
存根控件属性,如以下示例所示:
package examples.webservices.jmstransport.client;