狼爱上狸

我胡汉三又回来了

#

AXIS全攻略(二)

六、服务的访问

  GET方式的服务访问

  一般的SOAP消息都是采用POST方式实现传递,但也可以通过GET方式来访问。比如以下给出的一个服务——“HelloWorld”,其源码如下:

文件HelloWorld.jws
public class HelloWorld
{
    public String helloWorld()
    {
          System.out.println( "Hello World!" );//在服务器端打印输出 
          return "Hello World!";//返回相应字符串
    }
}

  这个服务给出一个名为“helloWorld”的无入口参数的操作,返回一个内容为“Hello World!的字符串”,同时在服务器端打印“Hello World!”,将该文件放到“……\webapps\axis”目录下,即可通过GET方法直接访问该服务,访问的地址为http://localhost:8080/axis/HelloWorld.jws?method=helloWorld,可以看到返回的SOAP信封消息,同时服务器端给出了相应的显示信息“Hello World!”这表明HelloWorld服务被成功访问了,生成的SOAP信封消息为:
 <?xml version="1.0" encoding="UTF-8" ?>
- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <soapenv:Body>
- <helloWorldResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <helloWorldReturn xsi:type="xsd:string">Hello World!</helloWorldReturn>
  </helloWorldResponse>
  </soapenv:Body>
  </soapenv:Envelope>

 


七、客户端服务访问编程

  Axis提供了一套API来实现SOAP,从http://localhost:8080/axis/docs/apiDocs/index.html可以看到Axis的API文档。

  其中,org.apache.axis.client.Call和org.apache.axis.client.Service是两个比较常用的类,一般的客户端程序欲访问一个Web Service时,都要生成一个客户端的Service对象和Call对象,在访问服务之前,首先要对Call对象设置相应的参数,包括服务的位置、操作名、入口参数、返回值类型等,最后调用Call对象的invoke方法访问服务。

  以下给出了一个客户端访问Web服务的例程——AXISTest.java:

  文件AXISTest.java

package axisexercise;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import org.apache.axis.encoding.XMLType;

import javax.xml.rpc.ParameterMode;

public class AXISTest
{
    public static void main( String[] args ) throws Exception
    {
         创建service和call对象,这些对象是标准的JAX-RPC对象,这些对象用于存储服务调用的数据(metadata)。

 Service service = new Service();
 Call call = ( Call ) service.createCall();
 //////////访问即时发布的Distance服务

 //设置访问点
 call.setTargetEndpointAddress( "http://localhost:8080/axis/Distance.jws" );

 //设置操作名
 call.setOperationName( "convertMile2Kilometre" );

 //设置入口参数
 call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );

 //设置返回参数类型
 call.setReturnType( XMLType.XSD_DOUBLE );
 Double d1 = new Double( 190 );

 //调用服务,在invoke方法中传入的是包含调用参数的数组
 System.out.println( d1 + " 英里相当于 " +
 call.invoke( new Object[] {d1} ) + " 公里!" );

 //////////访问定制发布的Capacity服务
 call = ( Call ) service.createCall();

 //设置访问点
 call.setTargetEndpointAddress( "http://localhost:8080/axis/services/Capacity" );

 //设置操作名
 call.setOperationName( "convertGallon2Litre" );

 //设置入口参数
 call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );
 call.setReturnType( XMLType.XSD_DOUBLE );
 d1 = new Double( 10.00 );

 //调用服务
 System.out.println( d1 + " 加仑相当于 " +
 call.invoke( new Object[] {d1} ) + " 升!" );

    } //main()

}/* AXISTest */

编译运行后运行可以看到以下的结果:

190.0英里相当于305.71公里!

10.0加仑相当于45.46升!
 
  注意程序在访问即时发布的Distance服务和定制发布的Capacity服务时的不同,前者的服务访问点地址为http://localhost:8080/axis/HelloWorld.jws,而后者的则为http://localhost:8080/axis/services/Capacity


八、服务类型:RPC, Document, Wrapped, and Message
在Axis中,有四种服务类型:

1. RPC服务:
PRC服务是AXIS中的默认服务,当你通过<service ... provider="java:RPC"> or <service ... style="RPC">标签进行部署的时候,使用的就是RPC服务。RPC服务遵循SOAP RPC和其编码规范。AXIS可以将XML反序列化成java对象,并将其传给服务的方法。并且可以将服务的方法返回的JAVA对象序列化成XML。

2.Document / Wrapped services
Document services and wrapped services are similar in that neither uses the SOAP encoding for data; it's just plain old XML schema. In both cases, however, Axis still "binds" Java representations to the XML (see the databinding section for more), so you end up dealing with Java objects, not directly with XML constructs.

Document和Wrapped服务都不使用SOAP编码数据,这一点是他们相似的地方。他们仅仅使用旧的XML模式。然而,在这两种服务中,AXIS将捆绑Java的表示到XML文档中,所以你最终处理的是java对象而不直接处理XML。

下面是包含定单的一个简单的SOAP消息,你可以看到Document 和 Wrapped 服务的区别所在:
<soap:Envelope xmlns="http://xml.apache.org/axis/wsdd/"
   xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
  <soap:Body>
 <myNS:PurchaseOrder xmlns:myNS="http://commerce.com/PO">
   <item>SK001</item>
   <quantity>1</quantity>
   <description>Sushi Knife</description>
 </myNS:PurchaseOrder>
  </soap:Body>
</soap:Envelope>

相应的XML模式如下:

<schema targetNamespace="http://commerce.com/PO">
  <complexType name="POType">
 <sequence>
   <element name="item" type="xsd:string"/>
   <element name="quantity" type="xsd:int"/>
   <element name="description" type="xsd:string"/>
 </sequence>
  </complexType>
  <element name="PurchaseOrder" type="POType"/>
</deployment>

对于Document类型服务,他将映射成下面的方法:
public void method(PurchaseOrder po)


八、soap envolop(soap信封)
1. soap信封
在客户端发出服务请求以及服务端返回请求结果的时候,在网络中传输的是SOAP信封。首先客户端程序将请求参数及请求的方法序列到XML的文件中(SOAP信封),并将SOAP信封传送到服务器端。服务器端接受到SOAP信封后,将解析这个SOAP信封并反序列化调用参数及方法并将该方法的调用结果封装成SOAP信封(序列到XML的文件中)返回给客户端,客户端同样将SOAP信封中封装的返回结果反序列化为想要得到的结果。

我们来看下面这段客户端程序的SOAP信封:
(1) 客户端程序:
  import org.apache.axis.client.Call;
  import org.apache.axis.client.Service;
  import javax.xml.namespace.QName;
 
  public class TestClient
  {
     public static void main(String [] args)
     {
        try
        {
             String endpoint = "http://nagoya.apache.org:5049/axis/services/echo";
             Service  service = new Service();
             Call  call = (Call) service.createCall();
 
             call.setTargetEndpointAddress( new java.net.URL(endpoint) );
             call.setOperationName(new QName("http://soapinterop.org/", "echoString"));
 
             String ret = (String) call.invoke( new Object[] { "Hello!" } );
 
             System.out.println("Sent 'Hello!', got '" + ret + "'");
         }
  catch (Exception e)
  {
             System.err.println(e.toString());
         }
     }
  }

(2) SOAP信封:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
       xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SOAP-ENV:Body>
 <ns1:echoString xmlns:ns1="http://soapinterop.org/">
   <arg0 xsi:type="xsd:string">Hello!</arg0>
 </ns1:echoString>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

2. 参数命名:
在上面的代码中,AXIS自动将在Soap消息中的函数调用参数命名为arg0,arg1等等,如果你想按照自己定义的参数名调用方法的话,很简单,在你调用invoke函数之前只要调用addParameter()函数即可。如下所示:

   call.addParameter("testParam",
      org.apache.axis.Constants.XSD_STRING,
      javax.xml.rpc.ParameterMode.IN);
   call.setReturnType(org.apache.axis.Constants.XSD_STRING);
将testParam定义为调用函数的第一个参数(这里也只有一个参数),这里也可以同时定义该参数的类型以及该参数是输入、输出还是输入输出类型。在这里它是一个输入类型,现在当你运行程序,你将得到下面的消息:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
       xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SOAP-ENV:Body>
 <ns1:echoString xmlns:ns1="http://soapinterop.org/">
   <testParam xsi:type="xsd:string">Hello!</testParam>
 </ns1:echoString>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

3. 返回类型
在上面的代码中我们知道echoString函数将返回一个String对象,而且我们也希望通过客户端的调用能够返回预期的String对象。下面是一个典型的通过调用echoString函数后获得的Soap信封(消息)。
<?xml version="1.0" encoding="UTF-8"?>
  <SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SOAP-ENV:Body>
   <ns1:echoStringResponse xmlns:ns1="http://soapinterop.org/">
 <result xsi:type="xsd:string">Hello!</result>
   </ns1:echoStringResponse>
  </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>
我们可以看到这里已经声明了返回类型(<result xsi:type="xsd:string">)是一个String对象。这样Axis就可以将返回结果反序列化成我们想要的String对象了。
很多工具都会将这种确定的类型信息放到XML文件中,以生成消息的“自我描述部分”,另一方面,还有一些工具是象下面这样返回响应的:(Many toolkits put this kind of explicit typing information in the XML to make the message "self-describing". On the other hand, some toolkits return responses that look like this:)
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
       xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <SOAP-ENV:Body>
  <ns1:echoStringResponse xmlns:ns1="http://soapinterop.org/">
   <result>Hello, I'm a string!</result>
  </ns1:echoStringResponse>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
在这里并没有返回类型,那么我们怎么知道应该将返回结果反序列化成什么类型的结果呢?答案是metadata,在这种情况下,我们需要一个描述来指明我们期望的返回类型,下面这行代码说明了在客户端应该如何去做:
call.setReturnType( org.apache.axis.Constants.XSD_STRING );
这个方法将会告诉Axis客户端,如果返回的结果没有指明类型的话,那么Axis将会把返回类型指明为xsi:type属性所预定义的SOAP类型,在这里XSD_STRING属性所指明的是String类型。

所以也有这样一个相似的方法,允许你指定所期望返回的Java的类。
call.setReturnClass(String.class);



http://blog.csdn.net/tenwang1977/archive/2004/09/06/95991.aspx

posted @ 2007-06-21 16:20 狼爱上狸 阅读(455) | 评论 (0)编辑 收藏

使用Apache Axis部署 Web服务时的常见问题及其解决方法

来自: http://www.ibm.com/developerworks/cn/webservices/ws-axisfaq/

1 引言


随着Web服务技术的发展和成熟,其方便性和易用性已逐渐被人们所接受,越来越多的合作伙伴之间开始利用Web服务来实现合作方之间的数据接口。使用Apache Axis和Linux平台是一种低成本的Web服务解决方案,但Apache Axis文档的FAQ对开发者来说内容还不够丰富,本文作者将自己使用Axis时遇到的问题和解决方法整理成文,奉献给Web服务的开发人员和对此感兴趣的读者朋友,旨在帮助大家节约一些宝贵的时间。有关Web服务的基础知识,读者可以阅读参考文献中推荐的文档。作者未在文中介绍Apache和Resin的安装方法,读者可以参考相关网站的说明文档。

作者使用的软件环境如下。

操作系统:Red Hat Linux 7.2

Web服务器: Apache 1.3.27

应用服务器:Resin 2.1.8 ( http://www.caucho.com/ )

SOAP服务器:Apache Axis 1.1

XML解析器:Xerces 2.5.0,Xalan 2.5.1

JDK版本:JDK 1.4.1





回页首


2 使用Axis时的常见问题及其解决方法

2.1 Axis运行需要哪些jar文件

对Axis解包后,将axis-1_1/webapps/axis/WEB-INF/lib/目录下的jar文件复制到/usr/local/apache/htdocs/WEB-INF/lib目录下(Web应用程序的目录)。应包括以下jar文件。

axis-ant.jar
            axis.jar
            commons-discovery.jar
            commons-logging.jar
            jaxrpc.jar
            log4j-1.2.8.jar
            name.txt
            saaj.jar
            wsdl4j.jar
            

如果需要使用axis提供的测试页面,还要将axis-1_1/webapps/axis/目录下的文件复制到/usr/local/apache/htdocs/axis/目录下。应包括以下募?

EchoHeaders.jws
            fingerprint.jsp
            happyaxis.jsp
            index.html
            

2.2 应该使用哪一种XML解析器

XML解析器选用不当,经常会导致使用Apache Axis时出现一些莫名其妙的问题。

由于Apache Axis 并未对Resin内置的xml解析器进行过测试,因此推荐读者使用已通过测试的Xerces xml解析器。可以从 http://xml.apache.org/xalan-j/index.html 处下载Xalan的Java版XSLT处理器,其中包含了Xerces的Java版XML解析器,不需要再单独下载xml解析器。

Xalan 2.5.1解包后,将bin/目录下的xercesImpl.jar、xml-apis.jar和xalan.jar复制到resin安装目录的lib/目录下,例如/usr/local/resin/lib。

编辑/etc/目录下的profile文件,找到设置CLASSPATH环境变量的位置,在其后加入下面的内容(B shell)。

XMLPARSER=$RESIN_HOME/lib/xalan.jar:$RESIN_HOME/lib/xercesImpl.jar:$RESIN_HOME/lib/xml-apis.jar
            export CLASSPATH=$XMLPARSER:$CLASSPATH
            

2.2.1 注意事项
如果CLASSPATH中包含其它的XML解析器设置,应将其从CLASSPATH环境变量的设置中去掉,以免发生冲突。

2.3 如何在Resin中使用Xerces的XML解析器

通过修改resin.conf将resin的XmlParser置换为Xerces的XmlParser。在resin.conf对应的Web应用程序配置中加入以下设置。

<system-property javax.xml.transform.TransformerFactory="org.apache.xalan.processor.TransformerFactoryImpl"/>
            <system-property javax.xml.parsers.DocumentBuilderFactory="org.apache.xerces.jaxp.DocumentBuilderFactoryImpl"/>
            <system-property javax.xml.parsers.SAXParserFactory="org.apache.xerces.jaxp.SAXParserFactoryImpl"/>
            <system-property org.xml.sax.driver="org.apache.xerces.parsers.SAXParser"/>
            

配置完成后重新启动Resin。

2.4 如何排除XML解析器出现的异常

2.4.1 问题描述

使用http://test.com/axis查看已部署的服务时出现Axis内部错,显示有关WSDD配置的异常信息。如果把WEB-INF目录下的server-config.wsdd删除,再查看就正常了,但只能看到AdminService和Version两个系统缺省的服务,后来部署的服务都看不到了。

2.4.2 原因分析

Axis会在WEB应用程序的WEB-INF/目录下自动生成一个名字为server-config.wsdd的xml文件,其中记录了已部署的WEB服务。每部署一个新的WEB服务时,Axis都会将新服务的描述信息加入到server-config.wsdd中。

故障站点使用的XmlParser是resin内置的XmlParser,Axis并未对其对进行过兼容性测试,查看WEB服务信息时需要从server-config.wsdd(这是一个xml文件)取得已部署的WEB服务描述信息,当server-config.wsdd的内容较复杂时,resin内置的XmlParser因某种原因出现异常,导致Axis内部错误。Server-config.wsdd中记录的Web服务描述信息较少时不会出现异常。

2.4.3 解决方法

修改resin.conf,将resin的XmlParser置换为Xerces的XmlParser。置换方法参见2.3节。

2.4.4 小结

如果Axis报告的错误中有关于xml解析器的错误,建议读者参照本小节描述的方法更换应用服务器的xml解析器,将会有助于问题的解决。

2.5 如何将Axis集成到Resin或其它应用服务器

Axis是以Servlet的方式运行的,而Resin的作用相当于Servlets容器(Container),因此只要配置得当,就可以使Axis在Resin环境中运行,这一点也适用于Resin以外的其它应用服务器。在Resin中配置Axis的方法如下。

将axis-1_1/webapps/axis/WEB-INF/web.xml中的Servlet配置项复制到resin.conf中对应的Web应用程序配置中。通常应包括以下内容。

 <!-- Axis Web-Service Configuration Start -->
            <servlet>
            <servlet-name>AxisServlet</servlet-name>
            <display-name>Apache-Axis Servlet</display-name>
            <servlet-class>
            org.apache.axis.transport.http.AxisServlet
            </servlet-class>
            </servlet>
            <servlet>
            <servlet-name>AdminServlet</servlet-name>
            <display-name>Axis Admin Servlet</display-name>
            <servlet-class>
            org.apache.axis.transport.http.AdminServlet
            </servlet-class>
            <load-on-startup>100</load-on-startup>
            </servlet>
            <servlet>
            <servlet-name>SOAPMonitorService</servlet-name>
            <display-name>SOAPMonitorService</display-name>
            <servlet-class>
            org.apache.axis.monitor.SOAPMonitorService
            </servlet-class>
            <init-param>
            <param-name>SOAPMonitorPort</param-name>
            <param-value>5001</param-value>
            </init-param>
            <load-on-startup>100</load-on-startup>
            </servlet>
            <servlet-mapping>
            <servlet-name>AxisServlet</servlet-name>
            <url-pattern>/axis/servlet/AxisServlet</url-pattern>
            </servlet-mapping>
            <servlet-mapping>
            <servlet-name>AxisServlet</servlet-name>
            <url-pattern>*.jws</url-pattern>
            </servlet-mapping>
            <servlet-mapping>
            <servlet-name>AxisServlet</servlet-name>
            <url-pattern>/services/*</url-pattern>
            </servlet-mapping>
            <servlet-mapping>
            <servlet-name>SOAPMonitorService</servlet-name>
            <url-pattern>/SOAPMonitor</url-pattern>
            </servlet-mapping>
            <!-- uncomment this if you want the admin servlet -->
            <!--
            <servlet-mapping>
            <servlet-name>AdminServlet</servlet-name>
            <url-pattern>/axis/servlet/AdminServlet</url-pattern>
            </servlet-mapping>
            -->
            <!-- currently the W3C havent settled on a media type for WSDL;
            http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
            for now we go with the basic 'it's XML' response -->
            <mime-mapping>
            <extension>wsdl</extension>
            <mime-type>text/xml</mime-type>
            </mime-mapping>
            <mime-mapping>
            <extension>xsd</extension>
            <mime-type>text/xml</mime-type>
            </mime-mapping>
            <!-- Axis Web-Service Configuration End -->
            

2.6 Axis提供了哪些开发工具

Apache Axis提供了WSDL2Java和Java2WSDL两个开发工具。

WSDL2Java利用已知的WSDL文件生成服务端和客户端代码。该WSDL文件可以是由合作伙伴提供的,也可以是利用Java2WSDL生成的。Java2WSDL根据已有的Java类文件生成WSDL文件,Java类文件可以是接口类文件,并不需要实现细节。

此外Axis还提供了SoapMonitorApplet和TCPMon工具,可用于监测Web服务。

2.7 如何生成Web服务的服务端和客户端代码

2.7.1 生成或取得WSDL文件

Java2WSDL是Axis提供的利用Java类文件得到WSDL文件的工具。类文件可以使用接口文件编译生成,例如下面的接口文件SoftwarePrice.java。

package samples.userguide.example6;
            /**
            * Interface describing a web service to set and get software prices.
            **/
            public interface SoftwarePrice {
            public void setWidgetPrice(String softWareName, String price);
            public String getWidgetPrice(String softWareName);
            

编译SoftwarePrice.java。

javac SoftwarePrice.java
            

将SoftwarePrice.class复制到正确的package路径下。

执行下面的命令:

java org.apache.axis.wsdl.Java2WSDL -o sp.wsdl  -l"http://test.com:80/services/SoftwarePrice" -n "urn:SoftwarePrice"
            -p"samples.userguide.example6" "urn:Example6" samples.userguide.example6.SoftwarePrice
            

各参数的含义如下。

-o:指定输出的WSDL文件的文件名。
            
-l:指定服务的位置。
-n:WSDL文件的目标名字空间。
-p:指定从package到名字空间的映射,这里可以有多个映射。

最后面的类文件包含了Web服务的接口。

该命令执行后,将生成sp.wsdl文件。

如果按CLASSPATH的设置找不到指定的类文件,Axis将报告异常,如下所示。

java.lang.ClassNotFoundException: samples.userguide.example6.SoftwarePrice
            at java.net.URLClassLoader$1.run(URLClassLoader.java:198)
            at java.security.AccessController.doPrivileged(Native Method)
            ……
            

如果出现上面的问题,请检查是否已将有关类文件复制到正确的位置或CLASSPATH设置是否正确。

生成WSDL文件以后,就可以利用Axis提供的WSDL2Java工具生成Web服务的服务端代码和客户端代码了。

2.7.1.1 注意事项

WSDL文件也可以由合作伙伴提供。这种情况下合作伙伴往往是Web服务的提供者或标准接口的制定者,开发者只要按照既定的WSDL文件生成客户端或服务端代码就可以了。

2.7.2 生成客户端或服务端代码

WSDL2Java工具用于从WSDL文件生成客户端存根(stub)代码,服务端框架(skeleton)代码以及WSDL中的数据类型文件(生成与之对应的Java代码)。开发人员只需向框架代码中补充相关的业务逻辑代码即可得到完整的Web服务代码,因此该工具极大地减轻了开发人员的编码负担。WSDL2Java的使用举例如下。

java org.apache.axis.wsdl.WSDL2Java --server-side --skeletonDeploy true MyService.wsdl
            

执行上述命令后将生成下列文件。

No. 文件 用途
1. deploy.wsdd MyService服务的部署描述文件
2. MyService.java MyService服务的接口文件
3. MyServiceService.java 获得MyService服务的接口文件
4. MyServiceServiceLocator.java 实现MyServiceService接口
5. MyServiceSoapBindingImpl.java 实现MyService接口,应向其中补充业务逻辑
6. MyServiceSoapBindingSkeleton.java MyService服务的服务端框架代码,实现MyService, org.apache.axis.wsdl.Skeleton接口
7. MyServiceSoapBindingStub.java MyService服务的客户端存根代码,实现MyService接口
8. undeploy.wsdd 注销MyService服务的部署描述文件

2.7.3 编写Web服务客户端代码

Web服务的客户端程序完成对Web服务的调用,其程序结构如下。

import com.chinavnet.zx.service.v1_0.*;// WSDL2Java生成的package的名字空间;
            public class TestClient {
            public static void main (String[] args) throws Exception
            {
            com.chinavnet.zx.service.v1_0.SPInterfaceForVNetLocator locator = new  SPInterfaceForVNetLocator();//获得一个locator对象
            locator.setMaintainSession(true);
            com.chinavnet.zx.service.v1_0.SPInterfaceForVNetSoap service = locator.getSPInterfaceForVNetSoap();//获得服务对象
            com.chinavnet.zx.service.v1_0.DetailLedgerFeedbackResult feedbackRes = null;
            //初始化Web服务中定义的数据类型
            try {
            feedbackRes =  service.generalLedgerFeedback();//调用Web服务的方法并取得返回值
            System.out.println("FeedbackResult :");
            if(feedbackRes != null)
            {
            System.out.println("SPID: " +feedbackRes.getSPID());
            System.out.println("errorDesc: " +feedbackRes.getErrorDescription());
            System.out.println("result: " +feedbackRes.getResult());
            }else
            {
            System.out.println("feedbackRes is null!");
            }
            } catch (java.rmi.RemoteException re) {
            //           throw new junit.framework.AssertionFailedError("Remote Exception caught: " + re );
            re.printStackTrace();
            }
            }//End of main()
            }//End of TestClient class
            

测试客户端程序是非常简单的,将客户端程序编译后,执行"java TestClient"即可。

2.8 如何编写服务端代码

向MyServiceSoapBindingImpl.java添加相关的业务逻辑代码后,将WSDL2Java生成的源程序编译,打包成jar文件,复制到/usr/local/apache/htdocs/WEB-INF/lib/目录下。

2.9 如何发布Web服务

有了deploy.wsdd文件并准备好类文件后,就可以发布MyService服务了。Axis在安装后自动发布了AdminService,利用它可以发布新的Web服务。方法如下。

java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
            上面的命令执行后,有如下提示。
            Processing file deploy.wsdd
            <Admin>Done processing</Admin>
            

2.10 执行WSDL2Java时报告" 类型被引用但未定义"

2.10.1 问题描述

执行WSDL2Java时报告下面的异常:

java.io.IOException: Type {http://schemas.xmlsoap.org/wsdl/} ArrayOfFailedRecord is referenced but not defined.
            

2.10.2 原因分析

出现上述情况可能的原因有:

类型未定义就被引用。

使用了错误的名字空间。

WSDL文件中存在输入错误。

2.10.3 解决方法

经过仔细检查发现wsdl文件中的

<s:element minOccurs="0" maxOccurs="1" name="FailedRecords" type="s0:ArrayOfFailedRecord" />
            

的type=" s0:ArrayOfFailedRecord"中的s0:前面有一个空格,将空格删除后问题解决了。

2.10.4 小结

WSDL文件中出现的编辑错误有可能导致执行WSDL2Java时出现"类型被引用但未定义"错误。

2.11 server-config.wsdd的作用是什么

server-config.wsdd记录了axis已发布的Web服务的描述信息。

2.12 发布Web服务时报告"Exception:: (404)Not Found"

2.12.1 问题描述

执行java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd命令发布WEB服务时报告如下内容。
            Processing file deploy.wsdd
            Exception:: (404)Not Found
            

Apache的access_log显示如下。

127.0.0.1 - - [17/Sep/2003:15:56:33 +0800] "POST /services/AdminService HTTP/1.0" 404 293
            

2.12.2 原因分析

出现这个问题的比较简单的原因可能是端口不对,或URL路径不对(例如路径中多写了目录),Axis的SoapMonitor服务按指定的端口或URL找不到AdminService,需要检查正确的端口号和URL路径。

比较深层次的原因就复杂得多了。

本文作者遇到的是下面的情况。

AdminService是一个已发布的WEB服务。

AdminClient使用soap协议同AdminService通信,需要按指定的端口和URL定位AdminService,而原来使用的resin.conf中,有两个web-app配置项,配置A的摘要如下所示。

<host id=' '>
            <app-dir>/usr/local/apache/htdocs/</app-dir>
            

配置B的摘要如下所示。

<host id='test.com'>
            <app-dir>/usr/local/apache/htdocs/esales/</app-dir>
            

Axis的有关配置在配置B中。

Httpd.conf中的DocumentRoot是/usr/local/apache/htdocs/。

使用java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd发布WEB服务时,需要按http协议解析url: //localhost:80/services/AdminService。由于htdocs/目录下并没有services/目录(services是Axis在resin.conf中的servlet-mapping),因此应用服务器按resin.conf中的配置去定位AdminService ,因为url的主机名为localhost,因此resin不会到<host id='test.com'>(配置B)中去定位url,而是到配置A中去定位,在配置A中并没有Axis的配置,找不到与AdminService相关的url,因此报告了前面描述的异常情况。

2.12.3 解决方法

知道了原因后,按如下方法就可以解决了。

将配置B中全部关于Axis的配置移到配置A中,注意相应地要改变/etc/profile中的CLASSPATH变量的值。

保存resin.conf后,重新登录服务器(使新的CLASSPATH生效),重新启动resin。再次发布WEB服务。

java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
            

屏幕显示如下。

Processing file deploy.wsdd
            <Admin>Done processing</Admin>
            

WEB服务终于发布成功了。

在发布成功的情况下apache的access_log中会看到如下的log:

tail -f access_log|grep vice
            127.0.0.1 - - [17/Sep/2003:16:05:00 +0800] "POST /services/AdminService HTTP/1.0" 200 296 "-" "Axis/1.1"
            

2.12.4 小结

本小节描述的问题可能是读者遇到的出现最多的异常,但原因并不是唯一的。遇到该问题时,建议读者冷静分析出现问题的可能原因,多实验几种解决方法,最终一定可以成功!

2.13 如何监测SOAP请求和响应流

2.13.1 引言

发布了Web服务以后,如何观察请求和响应数据呢?记录运行日志是一种传统且有效的方法,但对于调试程序来讲还不够方便和直观。值得欣慰的是,Axis为我们提供了在客户端观察SOAP请求和响应流数据的工具SoapMonitor,经过适当配置后,可以实时地观察到Web服务的SOAP请求和响应数据。SoapMonitor是一个Java Applet程序,通过浏览器下载到客户端运行。下面就介绍SoapMonitor的配置和使用方法。

2.13.2 准备SOAPMonitor 小应用程序

在Axis 1.1中,没有为我们编译SOAPMonitor.java程序,但我们可以在axis-1_1/webapps/axis/目录下找到名字为SOAPMonitorApplet.java的源程序文件,自己进行编译。该程序编译后,会生成如下的类文件:

SOAPMonitorApplet.class
            SOAPMonitorApplet$ServiceFilterPanel.class
            SOAPMonitorApplet$SOAPMonitorData.class
            SOAPMonitorApplet$SOAPMonitorFilter.class
            SOAPMonitorApplet$SOAPMonitorPage.class
            SOAPMonitorApplet$SOAPMonitorTableModel.class
            SOAPMonitorApplet$SOAPMonitorTextArea.class
            

读者需要把上述类文件复制到自己的Web应用程序目录下,本例中是/usr/local/apache/htdocs/目录。

在浏览器地址样中输入SOAPMonitor的地址,例如 http://test.com/SOAPMonitor ,浏览器会提示用户正在下载Applet程序,下载完毕后,读者可以在浏览器窗口中看到如图4-1所示的用户界面。如果上述类文件的位置不正确,浏览器会报告"找不到类"的错误。此时应检查是否已将上述类文件复制到正确的目录下。




图 2-1 SOAPMonitor的界面

2.13.3 发布SOAPMonitor服务

图2-1所示的SOAPMonitor界面出现后,并不意味着就可以观察到Web服务的SOAP请求流与响应流了,首先需要发布SOAPMonitorService。该Web服务是由Axis提供的,但需要由用户自己进行发布,方法如下。

获得SOAPMonitor服务的WSDD文件deploy.wsdd,内容如下(也可到 http://www.sosnoski.com/presents/java-xml/axis/axis-monitor.html 复制该文件):

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
            xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
            <handler name="soapmonitor"
            type="java:org.apache.axis.handlers.SOAPMonitorHandler">
            <parameter name="wsdlURL"
            value="/axis/SOAPMonitorService-impl.wsdl"/>
            <parameter name="namespace"
            value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>
            <parameter name="serviceName" value="SOAPMonitorService"/>
            <parameter name="portName" value="Demo"/>
            </handler>
            <service name="SOAPMonitorService" provider="java:RPC">
            <parameter name="allowedMethods" value="publishMessage"/>
            <parameter name="className"
            value="org.apache.axis.monitor.SOAPMonitorService"/>
            <parameter name="scope" value="Application"/>
            </service>
            </deployment>
            

发布SOAPMonitor服务:

java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
            

2.13.4 修改deploy.wsdd

发布SOAPMonitor服务后,还要对被监测的Web服务进行配置。方法是先注销该Web服务,然后修改该服务对应的WSDD文件,在其中增加请求流和响应流的配置,否则是观测不到SOAP请求和响应流的。

注销Web服务的方法如下。

进入该Web服务的undeploy.wsdd文件所在的目录,执行

Java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService undeploy.wsdd
            

修改WSDD文件的方法如下。

以Axis提供的MyService为例,对MyService的WSDD文件做如下修改。

修改前:

...
            <service name="MyService" provider="java:RPC">
            <parameter name="className" value="samples.userguide.example3.MyService"/>
            <parameter name="allowedMethods" value="*"/>
            ...
            

修改后: (有下划线的行是新加入的内容)

...
            <service name="MyService" provider="java:RPC">
            <requestFlow>
            <handler type="soapmonitor"/>
            </requestFlow>
            <responseFlow>
            <handler type="soapmonitor"/>
            </responseFlow>
            <parameter name="className" value="samples.userguide.example3.MyService"/>
            <parameter name="allowedMethods" value="*"/>
            ...
            

修改WSDD文件后,重新发布MyService服务:

java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
            

2.13.5 启动SOAPMonitor小应用程序

按2.13.2节介绍的方法启动SOAPMonitor小应用程序。

使用客户端程序测试MyService服务:

#  java samples.userguide.example3.Client -lhttp://vnet.sohu.com/services/MyService "test"
            结果为:You typed : test
            

注意,一定要先启动SOAPMonitor小应用程序,后调用Web服务才能观察到SOAP请求和响应流。

2.13.6 观察SOAP请求和响应流

这时在SoapMonitorApplet的窗口中可以观察到SOAP和请求和响应消息,如图2-2所示。




图2-2 MyService的Soap请求和响应流

2.14 使用客户端程序测试Web服务时报告"Exception:: (404)Not Found"

2.14.1 问题描述

WEB服务接口编写完成并发布后,客户端测试程序收不到WEB服务的返回结果,Apache或Resin的log中也看不到访问记录。但测试程序返回结果为0(成功),在没有部署该WEB服务的情况下,也是这个结果,因此怀疑调用的是WSDL文件的提供者自己测试用的WEB服务接口,可能与另一方提供的WSDL文件有关。

2.14.2 原因分析

合作伙伴调用WEB服务就能够成功,从WEB服务主机自己的客户端调用就接收不到数据,估计与合作伙伴提供的WSDL文件有关,该WSDL文件影响了WSDL2Java生成的客户端stub代码。检查stub代码,发现其soapAction都指向了合作伙伴的测试地址。

2.14.3 解决方法

修改stub代码中的soapAction,改为sp(Service Provider)自己的WEB服务URL。重新编译程序并发布Web服务,问题解决。

_call.setSOAPActionURI("sp自己的Web服务地址");

2.14.4 小结

本小节描述的问题出现于Web服务提供方按合作伙伴统一提供的WSDL文件生成客户端代码的情况。遇到这类问题,读者可直接检查WSDL2Java自动生成的代码的有关部分。

在WSDL文件中可以看到与下列内容相似的设置。

<wsdl:service name="SPInterfaceForVNet">
            <wsdl:port binding="impl:SPInterfaceSoapSoapBinding" name="SPInterfaceForVNetSoap">
            <wsdlsoap:address location="http://test.com/services/SPInterfaceSoap" />
            </wsdl:port>
            </wsdl:service>
            

其中 http://test.com/services/SPInterfaceSoap即为已发布的WEB服务的URL,供客户端调用。

2.15 如何列出已发布的Web服务

使用下面的命令:

java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/  list
            

实际上该命令的输出就是server-config.wsdd文件的内容。

2.16 发布Web服务时报告"调用目标异常"

2.16.1 问题描述

在部署WEB服务时报告:java.lang.reflect.InvocationTargetException异常。

2.16.2 原因分析

在WSDL文件中自定义的名字空间与Axis的services名字空间冲突。

2.16.3 解决方法

修改WSDL文件,将services改为别的名字。

2.17 WSDL文件中的targetNamespace的作用是什么

TargetNamespace指明目标名字空间,用于验证xml文档。

在WSDL文件中,<definitions>中的targetNamespace与<types>中的targetNamespace应保持一致。

2.18 Web服务部署成功但检测不到

2.19 客户端程序找不到可用的Web服务

2.19.1 问题描述

执行
            java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService deploy.wsdd
            

时显示<Admin>Done processing</Admin>,却检查不到新的服务,在WEB-INF/目录下的server-config.wsdd文件中也看不到相应的配置项。

2.19.2 原因分析

新的WEB服务的类文件没有重新编译并复制到正确的位置。

2.19.3 解决方法

WEB服务的类文件可以打包为jar文件。在CLASSPATH环境变量中正确设置jar文件的路径。例如:

jar cvf  SPInterfaceSoap.jar com/zx/service/v1_0/*.class
            

将SPInterfaceSoap.jar复制到WEB-INF/lib/目录下,重新发布WEB服务。

2.20 如何排除原因不明的错误

有时,在对WEB服务执行客户端测试时会出现慕名其妙的错误。为保证环境是正确的,可以按下面的步骤排除原因不明的错误。

1. Undeploy被测试的服务

java org.apache.axis.client.AdminClient -lhttp://localhost:80/services/AdminService undeploy.wsdd
            

2. 重新启动resin: /usr/local/resin/bin/httpd.sh restart(如果是其它的应用服务器,请按相应的方法重新启动)

3. 重新发布WEB服务

4. 进行测试





回页首


3 小结


目前有很多可以使用的应用服务器和Web服务平台软件,本文仅以Apache Axis和Resin为例介绍了在部署Web服务的过程中可能遇到的问题及其解决方法,其中并未讨论Web服务的安全性问题。对于如何高效地开发和部署Web服务以及如何确保Web服务的安全性,还希望对此感兴趣的读者共同参与讨论,对于文中存在的错误和不足之处也希望读者朋友们能够不吝批评指正。



参考资料

关于作者

 

姓名:刘红涛
电子邮件:  redwaveht@hotmail.com
办公电话:+86(010)87717788转5645
移动电话:13910662615
专长:电子邮件系统,计费系统,Radius协议,Web服务。
兴趣:J2EE
研究方向:Web服务和数据挖掘

posted @ 2007-06-21 16:02 狼爱上狸 阅读(832) | 评论 (0)编辑 收藏

AXIS全攻略(一)

一、Axis简介


1. 什么是SOAP

SOAP是一个基于XML的用于应用程序之间通信数据编码的传输协议。最初由微软和Userland Software提出,随着不断地完善和改进,SOAP很快被业界广泛应用,目前完全发布版本是1.1。在其发展过程中,W3C XML标准工作小组积极促成SOAP成为一个真正的开放标准。在写作此文档之时,SOAP1.2草案已经发布,1.2对1.1中相对混乱的部分做了改进。
SOAP被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。


2. 什么是Axis

Axis是Apache组织推出的SOAP引擎,Axis项目是Apache组织著名的SOAP项目的后继项目,目前最新版本是采用Java开发的1.1版本,C++的版本正在开发之中。Axis v1.1软件包可以从http://ws.apache.org/axis/dist/1_1/下载得到。
但是Axis不仅仅是一个SOAP引擎,它还包括:
    一个独立运行的SOAP服务器
    一个servlet引擎的插件,这个servlet引擎可以是Tomcat
    对WSDL的扩展支持
    一个将WSDL的描述生成JAVA类的工具
    一些示例代码
    还有一个监控TCP/IP包的工具
 
二、Axis的安装

应用Axis开发Web Services,你需要安装如下软件:
1.JDK1.4.2
2.一个支持Servlet的服务器引擎,比如广为人知的Tomcat。

当安装好Tomcat之后,只需将下载的Axis软件包解压缩,将其中的“webapps”目录下的“axis”目录整个拷贝到Tomcat安装目录下的“webapps”目录下即可。

三、Axis的配置

Axis基于Java开发,可以部署于多种操作系统,使用前需要配置一系列的系统变量,在此假定你已经在本机上装好了Tomcat 4.0以上的版本,需要配置的系统变量如下表所示:

CATALINA_HOME
C:\Tomcat_4_1

(此处应为Tomcat的安装位置,注意路径名中不要有空格)

AXIS_HOME
%CATALINA_HOME%\webapps\axis

AXIS_LIB
%AXIS_HOME%\lib

AXISCLASSPATH
%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar; %AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar; %AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar; %AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar

CLASSPATH 中加入:
%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar; %AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar; %AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar; %AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar

四、Axis的测试

安装配置完毕后,应测试一下是否Axis可以正确运行了。

  启动Tomcat服务器,在浏览器中访问http://localhost:8080/axis/happyaxis.jsp,如果页面显示有错误,则需要回头检查一下相关配置是否正确,如果浏览页面能正确显示出系统组件、属性等参数配置信息,则表示安装成功。现在可以开始开发你的Web Services应用了。

五、服务的发布
Axis提供了两种服务发布方式,一种是即时发布(Instant Deployment),一种是定制发布(Custom Deployment)。

1. 使用即时发布 Java Web Service(JWS)

  对即时发布的支持是Axis的特色之一,使用即时发布使用户只需有提供服务的Java类的源代码,即可将其迅速发布成Web服务。每当用户调用这类服务的时候,Axis会自动进行编译,即使服务器重启了也不必对其做任何处理,使用非常简单快捷。

  使用即时发布首先需要一个实现服务功能的Java源文件,将其扩展名改为.jws(Java Web Service的缩写),然后将该文件放到“……\webapps\axis”目录下即可。
    在此给出一个从英里到公里的长度单位转换的服务,其源码如下:

文件Distance.jws

public class Distance
{
    public double convertMile2Kilometre( double mile )
    { 
 return mile * 1.609;  //实现英里到公里的距离转换
    }
}

将其放到“……\webapps\axis”目录,通过访问http://localhost:8080/axis/Distance.jws?wsdl可以看到这个服务的WSDL描述文件,这说明Distance服务被成功发布了。描述的WDSL代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
- <wsdl:definitions targetNamespace="http://192.168.0.26:8080/axis/Distance.jws" xmlns="http://schemas.xmlsoap.org/wsdl/
   xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://192.168.0.26:8080/axis/Distance.jws" xmlns:intf="http://192.168.0.26:8080/axis/Distance.jws" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <wsdl:message name="convertMile2KilometreRequest">
  <wsdl:part name="mile" type="xsd:double" />
  </wsdl:message>
- <wsdl:message name="convertMile2KilometreResponse">
  <wsdl:part name="convertMile2KilometreReturn" type="xsd:double" />
  </wsdl:message>
- <wsdl:portType name="Distance">
- <wsdl:operation name="convertMile2Kilometre" parameterOrder="mile">
  <wsdl:input message="impl:convertMile2KilometreRequest" name="convertMile2KilometreRequest" />
  <wsdl:output message="impl:convertMile2KilometreResponse" name="convertMile2KilometreResponse" />
  </wsdl:operation>
  </wsdl:portType>
- <wsdl:binding name="DistanceSoapBinding" type="impl:Distance">
  <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
- <wsdl:operation name="convertMile2Kilometre">
  <wsdlsoap:operation soapAction="" />
- <wsdl:input name="convertMile2KilometreRequest">
  <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded" />
  </wsdl:input>
- <wsdl:output name="convertMile2KilometreResponse">
  <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://192.168.0.26:8080/axis/Distance.jws" use="encoded" />
  </wsdl:output>
  </wsdl:operation>
  </wsdl:binding>
- <wsdl:service name="DistanceService">
- <wsdl:port binding="impl:DistanceSoapBinding" name="Distance">
  <wsdlsoap:address location="http://192.168.0.26:8080/axis/Distance.jws" />
  </wsdl:port>
  </wsdl:service>
  </wsdl:definitions>

需要注意的是:JWS的web服务发布是一个很简单的Web服务发布方式,在页面中你不能使用包,而且由于代码是在运行期被编译的,所以在部署之后,你也很难找到错误所在。

2. 使用定制发布 Web Service Deployment Descriptor(WSDD)

  即时发布是一项令人激动的技术,它使Web服务的开发变得如此简单;然而即时发布并不总是最好的选择,比如有些应用系统是第三方提供的,我们没有购买源代码,只有.class文件,但我们又希望将这个应用系统的一些功能对外发布成Web服务,使其能够在更大范围内产生作用,这个时候即时发布技术就无能为力了。此外,即时发布技术并不灵活,无法进行更多的服务配置,这使得它并不能满足一些特定系统的需求。

  因此,Axis提供了另一种服务发布方式,这就是定制发布。

  在此给出一个从加仑到升的容积单位转换的服务,其源码如下:

  文件Capacity.java
    package samples.capacity;
    public class Capacity
    {
        public double convertGallon2Litre( double gallon )
 {
     return gallon * 4.546;//实现加仑到升的容积转换
 }//convertGallon2Litre()

    }/* Capacity */
 
    将其编译成.class文件,放置到“……\webapps\axis\samples\capacity”目录下,即可着手进行发布。
    定制发布不需要构建.jws文件,但必须创建服务发布描述文件deploy.wsdd(Web Service Deployment Descriptor的缩写),这个文件负责描述服务的名称、入口等信息,其内容如下:
    文件deploy.wsdd

    <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <service name="Capacity" provider="java:RPC">
 <parameter name="className" value="samples.capacity.Capacity"/>
 <parameter name="allowedMethods" value="*"/>
 </service>
    </deployment>

    在这里服务的提供者是“java:RPC”,它被内建在Axis中,而且指明了一个JAVA RPC服务,做这个处理的类是org.apache.axis.providers.java.RPCProvider。
    我们是通过一个<parameter>标签告诉RPC服务应该调用的类,而另外一个<parameter>标签则告诉引擎,它可以调用这个类中的任何的Public方法。你也可以指定通过使用名字空间或者一些可以调用的方法列表,来指明那些方法可以被调用。

  将该文件也放到“……\webapps\axis\samples\capacity”目录下,然后可以采用Axis提供的一个客户端管理工具——AdminClient来完成服务的定制发布。
   在“……\webapps\axis\samples\capacity”目录下,运行:

   java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd

   如果运行时说没有找到类,那么可能是类路径没有配置好,建议将所有的与axis相关的jar都写到classpath中去。这样只要运行:

   java org.apache.axis.client.AdminClient deploy.wsdd
   可以看到以下运行结果:

 Processing file deploy.wsdd
 <Admin>Doneprocessing</Admin>

  这表明Capacity服务定制发布完成。
 
   你也可以调用:
 java org.apache.axis.client.AdminClient undeploy.wsdd  来取消部署。

   你也可以调用:
 java org.apache.axis.client.AdminClient list 来获得所有的已经部署的服务的列表。在这里你会看到services, handlers, transports等等,注意这个调用只是列出了WEB-INF\server-config.wsdd的文件内容。

   一定要注意:编译后的class文件要拷贝到web-inf/classes的目录中,如果该文件中有包存在的话,别忘了还要在classes目录下创建包的目录
   通过访问http://localhost:8080/axis/services/Capacity?wsdl可以看到这个服务的WSDL描述文件,这说明Capacity服务被成功发布了。
   你也可以通过访问http://localhost:8080/axis/servlet/AxisServlet查看所有定制发布的服务。
   WDSL如下:
  <?xml version="1.0" encoding="UTF-8" ?>
- <wsdl:definitions targetNamespace="http://localhost:8080/axis/services/Capacity" xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8080/axis/services/Capacity" xmlns:intf="http://localhost:8080/axis/services/Capacity" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <wsdl:message name="convertGallon2LitreResponse">
  <wsdl:part name="convertGallon2LitreReturn" type="xsd:double" />
  </wsdl:message>
- <wsdl:message name="convertGallon2LitreRequest">
  <wsdl:part name="in0" type="xsd:double" />
  </wsdl:message>
- <wsdl:portType name="Capacity">
- <wsdl:operation name="convertGallon2Litre" parameterOrder="in0">
  <wsdl:input message="impl:convertGallon2LitreRequest" name="convertGallon2LitreRequest" />
  <wsdl:output message="impl:convertGallon2LitreResponse" name="convertGallon2LitreResponse" />
  </wsdl:operation>
  </wsdl:portType>
- <wsdl:binding name="CapacitySoapBinding" type="impl:Capacity">
  <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
- <wsdl:operation name="convertGallon2Litre">
  <wsdlsoap:operation soapAction="" />
- <wsdl:input name="convertGallon2LitreRequest">
  <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://capacity.samples" use="encoded" />
  </wsdl:input>
- <wsdl:output name="convertGallon2LitreResponse">
  <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/services/Capacity" use="encoded" />
  </wsdl:output>
  </wsdl:operation>
  </wsdl:binding>
- <wsdl:service name="CapacityService">
- <wsdl:port binding="impl:CapacitySoapBinding" name="Capacity">
  <wsdlsoap:address location="http://localhost:8080/axis/services/Capacity" />
  </wsdl:port>
  </wsdl:service>
  </wsdl:definitions>

  WSDD 的高级功能:
  (1) AXIS支持三种对象范围:
     "request"范围:这是默认的情况,每一次Soap请求的时候都将创建新的对象。
     "application"范围:将会为所有的请求生成一个单独的共享的对象。
     "session"范围:为每一个session期的客户端请求创建一个对象。
  指定方法如下:
  <service name="MyService"...>
  <parameter name="scope" value="value"/>
  ...
  </service>
  (2) 更多部署内容:Handlers and Chains
  让我们来深入挖掘一下Axis引擎的更强大的特性。如果我们想跟踪我们的服务被调用了多少次,那么我们只需要包含一个简单的handler,它存放在samples/log目录下。要使用这个handler,你就首先应该部署这个handler,然后使用在部署服务时给它指定的名字。下面是一个wsdd文件的例子:
  <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
   <!-- define the logging handler configuration -->
    <handler name="track" type="java:samples.userguide.example4.LogHandler">
      <parameter name="filename" value="MyService.log"/>
    </handler>
 
   <!-- define the service, using the log handler we just defined -->
    <service name="LogTestService" provider="java:RPC">
     <requestFlow>
       <handler type="track"/>
     </requestFlow>
 
     <parameter name="className" value="samples.userguide.example4.Service"/>
     <parameter name="allowedMethods" value="*"/>
    </service>
  </deployment>

  第一段指明了一个名为track的handler,它是samples.userguide.example4.LogHandler类的实例。另外还指定了一个参数filename,用于指定日志文件名称。
  下面的那段指明了一个RPC服务,和我们在上面的例子中看到的一样,所不同的是在service标签中的<requestFlow>标签,它指定了一些在调用服务前应该被调用的handler集。也就是由于我们在部署中插入了这个"track"的引用,所以我们确定每次调用服务的时候都将被记录到日志文件中去。
 
  (3)远程管理:
  <service name="AdminService" provider="java:MSG">
 <parameter name="className" value="org.apache.axis.util.Admin"/>
 <parameter name="allowedMethods" value="*"/>
 <parameter name="enableRemoteAdmin" value="true"/>
  </service>
  WARNING: enabling remote administration may give unauthorized parties access to your machine. If you do this, please make sure to add security to your configuration!
  所以远程管理涉及到安全问题,不建议采用。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=35550
                   http://blog.csdn.net/tenwang1977/archive/2004/07/06/35550.aspx

posted @ 2007-06-21 15:58 狼爱上狸 阅读(444) | 评论 (0)编辑 收藏

学习Axis和web service之一

学习Axis和web service之一
web service由于工作中需要用到,所以那天从网上GOOGLE一下,查看如何制作自己的第一个WEB SERVICE。首先,web service的原理我就不多讲了,再怎么讲也不如人家讲的好,况且都是从别人那里拷贝的。还是整点实际的吧。马上建立自己的WEB SERVICE的程序。

一.首先下载安装软件:
1.axis-src-1_2_1,(自己去下载,地址忘记了)
2.jakarta-tomcat-5.0.18.exe(这个是安装版本,从别的地方拷贝也可以的)
最少也要有这两个包

二.安装
自己安装吧。挺简单的。TOMCAT安装最好改一下名字比如:TOMCAT

三.
1.将axis-src-1_2_1这个包解压后,将axis-1_2_1\webapps下axis的所有东西拷贝到你刚刚建立的TOMCAT的webapps下。目录结构如下:
tomcat-webapps-axis
然后查看一下你的axis的WEB-INF的lib下*.jar文件是否全,应该有8个
axis.jar
axis-ant.jar
commons-discovery-0.2.jar
commons-logging-1.0.4.jar
jaxrpc.jar
log4j-1.2.8.jar
saaj.jar
wsdl4j-1.5.1.jar
(一定看好各个文件的文件名,一会将配置CLASSPATH)

2.然后到axis-1_2_1目录下,找到lib文件夹,拷贝其中的activation.jar文件,到
Tomcat\webapps\axis\WEB-INF\lib,和上面的8个jar文件在一起,就OK了。

四.配置classpath
我的电脑-右键属性-高级-环境变量
1.建立变量:AXIS_HOME=D:\Tomcat\webapps\axis(你自己的实际TOMCAT目录)
2.建立变量:AXIS_LIB=%AXIS_HOME%\WEB-INF\lib
建立这两个环境变量
3.classpath(相信这个变量里面肯定有值,TOMCAT安装的时候配置过)

.;%JAVA_HOME%\lib\dt.jar;
%JAVA_HOME%\lib\tools.jar;
%TOMCAT_HOME%\lib;(以上三个都是安装TOMCAT配置的,下面是axis的)
%AXIS_LIB%\axis.jar;
%AXIS_LIB%\commons-discovery-0.2.jar;
%AXIS_LIB%\commons-logging-1.0.4.jar;
%AXIS_LIB%\jaxrpc.jar;
%AXIS_LIB%\saaj.jar;
%AXIS_LIB%\log4j-1.2.8.jar;
%AXIS_LIB%\wsdl4j-1.5.1.jar;
%AXIS_LIB%\activation.jar;
%AXIS_LIB%\mail.jar
拷贝到classpath里面就可以了,然后点击确定。

五.测试
这步很重要,我自己觉得,因为如果你不知道CLASSPATH是否配置齐全,所以应该测试一下,有些文章没有测试直接就往下走了,但是就出现问题了,我就出现了问题,是jar包没有导入造成的,错误信息如这样:
Exception in thread "main" java.lang.NoClassDefFoundError:

javax/wsdl/OperationType
at org.apache.axis.description.OperationDesc.<clinit>(OperationDesc.java
:58)
        at org.apache.axis.client.Call.addParameter(Call.java:948)
        at org.apache.axis.client.Call.addParameter(Call.java:983)
        at BankClient.main(BankClient.java:29)
这就是没有导入造成的错误。
其实你先看一下classpath就能避免错误。
点击开始-运行-cmd-打开命令行窗口-敲入set classpath,好了你配置的classpath完全显示了,你可以仔细的查看了。

六调试AXIS
启动TOMCAT,输入网址 http://localhost:8080/axis, 出现 "Hello! Welcome to Apache-Axis." 欢迎词, 点击链接 Validate 来验证 Axis 所需的 .jar 包是否齐全 (Needed Components).

七.开发一个 Web Service 服务端程序
(代码是转贴,谢谢!)
我的这个例子是使用 Web Service 返回一个请求字段的值.

import java.util.*;
 
public class wsTestService
{
  String strName = "Ryun";
  int intAge = 21;
  List items = new ArrayList();
  
  public String getName() {
    return strName;
   }
  
  public int getAge() {
    return intAge;
   }
  
  public List getItems() {
    return items;
   }
}将此文件命名为 wsTestService.jws 存放到
d:\tomcat\webapp\axis\下
访问 http://localhost:8080/axis/wsTestService.jws, 出现 "There is a Web

Service here"即表明 Web Service 服务端程序安装完成.
开发一个 Web Service 客户端程序
建立客户端程序wsTestClient.java
以下是客户端的源程序, 用于向 Web Service Server 提交服务请求:

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
 
public class wsTestClient {
  public static void main(String args[]) {
    System.out.println("Start invoking...");
    try {
      String strUri =

"http://localhost:8080/axis/wsTestService.jws";
      Service service = new Service();
      Call call = (Call)
      service.createCall();
      call.setTargetEndpointAddress(new

java.net.URL(strUri));
      call.setOperationName("getName");
      String ret = "" + call.invoke(new Object[] {});
      System.out.println("I am " + ret + ".");
     }
    catch (Exception e) {
      System.err.println(e.toString());
     }
    System.out.println("Finished the invoking.");
    }
}
然后编译运行,如果出现问题,那可能是环境变量path,classpath配置的问题,自己查看

一下,这里就不再描述了。
C:\>cd \
C:\>javac wsTestClient.java
 
C:\>java wsTestClient
Start invoking...
I am Ryun.
Finished the invoking.
完成,再去学习,稍后总结


来自:
http://www.cnweblog.com/battleseagull/articles/20130.html

posted @ 2007-06-21 15:54 狼爱上狸 阅读(2390) | 评论 (0)编辑 收藏

关于MDS_注册 Globus Toolkit 4 网格服务

关于MDS_注册 Globus Toolkit 4 网格服务

http://www-128.ibm.com/developerworks/cn/grid/gr-mdsgt4/index.html
摘要:
Monitoring and Discovery System(MDS)是 Globus Toolkit 的信息服务组件。它提供了有关网格资源的状态信息。其主要组件包括 Index service、Trigger service 和 Aggregator service。MDS 方便了资源的发现和描述,并监控服务和计算。本文解释了 Globus Toolkit 4(GT4)中 MDS 的基本设计和架构。我们还将通过一个示例服务,演示如何设置、配置并使用 MDS 来注册并查询服务。
参考资料

posted @ 2007-06-20 10:37 狼爱上狸 阅读(676) | 评论 (0)编辑 收藏

用Globus Toolkit 4(GT4)构建WEB服务

版权声明:任何获得Matrix授权的网站,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
作者:Birali Hakizumwami;xzzhouhu
原文地址:http://www.onjava.com/pub/a/onjava/2005/10/19/constructing-web-services-with-globus-toolkit.html
中文地址:http://www.matrix.org.cn/resource/article/44/44032_Globus_Toolkit.html
关键词: Globus Toolkit

摘要:
本文主要介绍了通过一种新的方法来构建企业软件,即通过调整Globus Toolkit 4实现的网格计算的概念来实现。GT4是一种可以通过开放网格服务架构(OGSI)来实施的开放资源。这种实施主要目的是为网格服务架构提供了依据,同时也可以为别的网格服务架构实施提供参考。本文详细介绍了GT4中JAVA的核心服务,这些服务具备提供代管网格服务实时运行环境的能力,当然这些网格服务都是由JAVA写的。实时运行环境在网格服务的应用和网络承载之间和传输协议引擎之间起到了协调的作用。


一.网格的定义

网格的定义:
网格就是将收集网络上所有可用的分布式计算资源提供给最终用户或组建成一个巨大的计算系统。网格计算给分布式计算提供了一种全新的方法,不仅在跨地区而且在跨组织,机器结构和软件限制,给连接到网格的每个用户提供更多的资源,计算机之间的协作和信息访问。分布式资源,像计算周期,存储和信息,可以在网格中的任何地区访问,同时也可以在网格中提供这些服务供其他用户访问。这就要通过在每个独立的组织或资源之间进行安全的协调资源共享,共同建立一个动态虚拟组织机构。


二.Globus Toolkit Version 4

在本文中,我们主要讨论GT4中JAVA的核心服务。(如图1),这些服裉峁┝舜芡穹袷凳痹诵谢肪车哪芰ΑJ凳痹诵谢肪吃谟没Фㄒ宓挠τ梅窈虶T4的核心服务之间,网络承载和传输协议引擎之间起到了协调的作用。GT4核心服务还提供了程序开发支持的功能,包括开放式开发模式和访问网格服务的实现,像GRAM(Grid Resource Allocation Management,网格资源管理)。应用GT4强有力的理由就是因为它是建立在现有的WEB服务标准和技术的基础上,像SOAP和WSDL。网格服务提供的接口都是通过WSDL来描述的。GT4提供了一个软件仓库,像安全支持,软件的探索,软件的资源管理,软件的调用,软件之间的通信,异常处理和数据管理等。


                   (图1)

图1主要描述了在服务器端的GT4中的主要组件结构。这只是GT4所提供功能的一部分,我们只是认为它很适合本文。GT4结构由一个网格容器组成,网格容器主要用来管理所有部署的WEB服务,贯穿于每个WEB服务的运行周期。GT4使用apache的axis作为它的WEB服务的引擎来处理所有的SOAP消息,JAX-RPC (Java API for XML-Based RPC)处理和WEB服务的配置。


三.贷款偿还例子:

我们列举这样一个例子,主要想向大家展示在企业内部如何通过Globus Toolkit 来解决不同类操作系统之间进行融合。在企业内部,有些应用可能是原来主机遗留下来的,技术比较落后,有些应用已经采用了现代技术,像J2EE。甚至我们采用最先进的技术在一个企业内部的应用之间进行信息共享也要面临巨大的挑战。图2给出了这样一个例子,在一个抵押机构内,在贷款偿还信息处理和会计部门信息处理之间的交互,

image
                (图2)

会计部门使用申请贷款处理服务来申请贷款。

为了创建和部署网格服务,我们需要:
*通过创建WSDL文件来定义服务的接口
*用JAVA来实现
*通过创建WSDD文件来定义服务的部署参数
*使用ANT编译源代码并生成GAR文件
*用GT4分发工具部署GAR文件
我们必须使用从上往下的方法来创建网格服务,(图3)

这种方法首先从提供WSDL文件开始,在WSDL文件中包括对WEB服务的抽象定义,包括服务类型,消息类型和端口类型。从WSDL文档开始并根据WSDL文档创建了JAVA模型,从而导致与其他系统更好交互。

image

  我们使用GT4 toolkit自带的工具来进行服务的绑定和产生客户段需要的根类。这种方法的下一步就是提供接口的实现。

贷款偿还服务处理定义:
对于贷款偿还服务处理的例子的接口类型我们定义为loan.wsdl,它描述了贷款偿还服务所提供的三个部分的操作(申请贷款,贷款处理和获得贷款)。首先我们描述贷款偿还服务的请求和响应:

<types>

  <xsd:element name="createLoan">
    <xsd:complexType>
      <xsd:sequence>
          <xsd:element name="loanNumber" type="xsd:int"/>
        <xsd:element name="amountUPB" type="xsd:double"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="createLoanResponse">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="returnValue" type="xsd:int"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="processLoanPayment">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="loanNumber" type="xsd:int"/>
        <xsd:element name="amount" type="xsd:double"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="processLoanPaymentResponse">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="returnValue" type="xsd:int"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="getLoan">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="loanNumber" type="xsd:int"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="getLoanResponse">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="returnValue" type="tns:LoanType"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

</types>


我们在文件 loan.xsd.中定义了贷款的数据类型,我们通过使用“ import <xsd:import schemaLocation="loan.xsd"/> ”可以直接将loan.xsd.文件导入到文件loan.wsdl 中,并且用它作为获得贷款操作返回的类型

<complexType name="LoanType">
    <sequence>
        <element name="loanNumber" type="int"/>
        <element name="UPB" type="double"/>
        <element name="status" type="string"/>
        <element name="createDate" type="string"/>
    </sequence>
</complexType>


下一步,我们要定义所有的消息服务。一条消息元素可能由一个或多个部分组成,消息元素的每个部分对应一个参数,并且还有一个类型属性。消息既可以是一个请求消息(输入消息),也可以是一个响应消息(输出消息)。

<message name="CreateLoanInputMessage">
  <part name="parameters" element="tns:createLoan"/>
</message>
<message name="CreateLoanOutputMessage">
  <part name="parameters" element="tns:createLoanResponse"/>
</message>

<message name="ProcessLoanPaymentInputMessage">
  <part name="parameters" element="tns:processLoanPayment"/>
</message>
<message name="ProcessLoanPaymentOutputMessage">
  <part name="parameters"
    element="tns:processLoanPaymentResponse"/>
</message>

<message name="GetLoanInputMessage">
  <part name="parameters" element="tns:getLoan"/>
</message>
<message name="GetLoanOutputMessage">
  <part name="parameters" element="tns:getLoanResponse"/>
</message>


最后我们定义所有的端口类型,每个接口类型定义了一个或多个操作来使用当前的操作元素,每个独立的操作元素又定义了一个操作和与操作有联系的消息的输入输出。在一个端口类型内操作元素定义了端口类型内所有调用方法的语法。

<portType name="LoanPortType">
  <operation name="createLoan">
    <input message="tns:CreateLoanInputMessage"/>
    <output message="tns:CreateLoanOutputMessage"/>
    <fault name="Fault" message="ogsi:FaultMessage"/>
  </operation>
  <operation name="processLoanPayment">
    <input message="tns:ProcessLoanPaymentInputMessage"/>
    <output message="tns:ProcessLoanPaymentOutputMessage"/>
    <fault name="Fault" message="ogsi:FaultMessage"/>
  </operation>
  <operation name="getLoan">
    <input message="tns:GetLoanInputMessage"/>
    <output message="tns:GetLoanOutputMessage"/>
    <fault name="Fault" message="ogsi:FaultMessage"/>
  </operation>
</portType>


服务的实现:
  在前面的步骤中,终端贷款端口类型的接口已经产生,在定义这些端口类型的接口时,所有的远程操作都要设为public,并且抛出java.rmi.RemoteException。在本文中给出了LoanServiceImpl类,主要实现贷款端口类型的接口,这些实现要用到前面所讲到的用loan.wsdl文件所生成的根类。

public class LoanServiceImpl implements LoanPortType


其中LoanServiceImpl 所实现的方法定义在LoanPortType接口中,createLoan方法在产生一个createLoan对象的构造器中要获取一个贷款数字作为它的参数。

public CreateLoanResponse createLoan(CreateLoan cl)
throws java.rmi.RemoteException
public ProcessLoanPaymentResponse processLoanPayment(ProcessLoanPayment plp)
throws java.rmi.RemoteException
public GetLoanResponse getLoan(GetLoan gl) throws java.rmi.RemoteException


请参考完整代码详细描述方法的实现。

编译并创建贷款/偿还处理的WEB服务:
下面我们介绍通过以下步骤来创建易部署的GT4打包文档。Ant在编译本文所提供文件时所产生的build.xml中包含了ant的执行任务的步骤。在build.xml中ant的执行任务调用GT4中的ant任务,这些任务伴随着GT4的发布可以在编译文件中找到。

%GLOBUS_LOCATION%/share/globus_wsrf_common/build-packages.xml
%GLOBUS_LOCATION%/share/globus_wsrf_tools/build-stubs.xml
%GLOBUS_LOCATION%/share/schema


编译GT4中易部署的GAR文件
   为了创建易部署的网格打包文件,loan.gar,我们通过以下步骤来实现:(这些步骤与builder.xml中的ant任务是一致的):
·        与WSDL文件绑定
·        通过WSDL        文件生成一个根类,在安装时,提供一个特殊文件来对不同的命名空间和包之间进行映射,这些包与表格中的目录结构一致。
·        编译根类
·        编译接口类
·        用JAR压缩接口类,和根类一样(loan.jar and loan_stubs.jar).
·        通过创建部署描述文件deploy-server.wsdd.来生成易部署的GAR文件,loan.gar
请参考源代码中完整的build.xml文件,通过以上步骤来实现一系列的ant编译任务。GT4描述我们的WEB服务文件deploy-server.wsdd就想这样:

<service name="loan/impl/LoanService" provider="Handler"
use="literal" style="document">
    <parameter name="className" value="loan.impl.LoanServiceImpl"/>
    <wsdlFile>share/schema/loan/Loan_service.wsdl</wsdlFile>
    <parameter name="allowedMethods" value="*"/>
    <parameter name="handlerClass"
    value="org.globus.axis.providers.RPCProvider"/>
    <parameter name="scope" value="Application"/>
    <parameter name="providers" value="GetRPProvider"/>
    <parameter name="loadOnStartup" value="true"/>
</service>


让我们来介绍一下deploy-server.wsdd中的一些参数:
服务名称:指定我们所提供的WEB服务的路径,我们将它与WEB服务容器的地址相结合起来,我们会得到WEB服务的完整的URL。为了便于测试,使用独立的GT4容器,URL就像这样:

http://localhost:8080/wsrf/services/loan/impl/LoanService

类名:指实现服务接口的类(LoanServiceImpl).
WSDL文件:告诉GT4中的WEB服务容器对于当前的WEB服务的WSDL文件在那里可以找到。WSDL文件Loan_service.wsdl是在GT4 从loan.wsdl进行ANT时自动产生的。
启动时装载:如果我们需要服务在WEB服务容器启动时就开始装载,允许我们控制服务的装载。

部署GAR文件:
GAR文件loan.gar包含了所有的文件和WEB服务器需要的部署信息,我们使用GT4部署工具:

%GLOBUS_LOCATION%/bin/globus-deploy-gar $PROJECT_HOME/loan.gar

拷贝文档文件(loan.wsdl,编译的根类,编译的接口实现,loan.wsdd)到GT4容器的目录下适当位置。

测试借贷款处理实例

在图1描述了如何将贷款方的子系统和贷款结算子系统作为借贷款的WEB服务的客户端,现在我们就在GT4网格服务容器中创建和部署WEB服务,我们需要用一个客户端进行测试,测试用例模拟一个贷款事件,一个贷款月度偿还事件和一个贷款还清事件。作为客户端来说,他们希望WEB服务的URI(统一资源标识符)能够作为客户端访问WEB服务的依据。客户端的程序要独立的进行编译,下面来描述客户端访问WEB服务的主要步骤:

创建一终端引用类型对象,来代表终端引用的贷款服务。我们的终端引用只需要服务的URI:
EndpointReferenceType endpoint = new EndpointReferenceType();
endpoint.setAddress(new Address(serviceURI));

下一步,我们要获得引用服务的端口类型,这需要一个根类调用LoanServiceAddressingLocator, LoanServiceAddressingLocator主要是用来维持客户端与WEB服务之间的通信和获得引用贷款端口的类型。
LoanServiceAddressingLocator locator = new LoanServiceAddressingLocator();
LoanPortType loanPT = locator.getLoanPortTypePort(endpoint);


一旦我们获得这个引用,我们可以作为本地对象来操作WEB服务。例如,调用远程的创建操作,我们仅仅需要在贷款端口类型中使用创建方法。
CreateLoanResponse clr = loanPT.createLoan(new CreateLoan(amount, loanNumber));

请参考附件中完整的客户端代码。在编译客户端之前,请保证运行下面的脚本,以便于GT4的发布:
%GLOBUS_LOCATION%/etc/globus-devel-env.bat

globus-devel-env.bat文件主要是将Globus的类库注册到系统的classpath中,因为客户端是作为独立的应用来编译的,同样,要保证在编译客户端的目录中所放置的已编译的根类时能通过classpath找到,因此我们的客户端可以访问服务器端的根类,像LoanServiceAddressingLocator。

启动网格容器
使用下面的命令来启动网格容器:

%GLOBUS_LOCATION%/bin/globus-start-container –nosec

-nosec参数主要是为了简化测试,略去安全设置。如果网格容器启动成功,你将会看到已部署的服务的URI列表,如果LoanService正确的部署,在已部署的服务的列表中有下面的一行:

[13]: http://localhost:8080/wsrf/services/loan/impl/LoanService

测试借贷款处理的WEB服务
通过客户端进行测试,我们假设有以下操作:申请贷款,偿还贷款,还清贷款。

·        创建一个初始化贷款编号为100并且还有12000未还        
java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService createLoan 100 120000
Loan 100 created successfully.


·        假定两个月偿还,每个月还$1100(本例不考虑利息的计算)
java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService processLoanPayment 100 1100
Loan 100 processed successfully.
java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService processLoanPayment 100 1100
Loan 100 processed successfully.


·        查看贷款的状态
java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService getLoanData 100
Loan Data
Create Date Mon Jun 06 16:41:06 EDT 2005
Unpaid Principal Balance 117800.0
Status ACTIVE


·        第三个月还清余款($117,800)
java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService processLoanPayment 100 117800
Loan 100 processed successfully


·        查看贷款状态
java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService getLoanData 100
Loan Data
Create Date Mon Jun 06 16:41:06 EDT 2005
Unpaid Principal Balance 0.0
Status PAIDOFF


结束语:

本文主要描述了在基于现有的WEB服务标准的基础上,如何调整GT4网格结构来创建一个网格服务应用。尽管GT4已经主要的应用在大型的科学计算问题上,但是在一个企业内部它可以作为实现面向服务结构(SOA)的一种方法。本文主要是通过一个简单的实例来描述如何使用GT4中的JAVA核心服务来创建和部署一个网格服务,但是并没有覆盖到更多的其他的更先进的关于如何使用网格服务概念,向网格服务的分配和管理,文件传输的可靠性,网格异常和安全。

资源
·本文的示例代码
·Matrix-Java开发者社区:http://www.matrix.org.cn
·onjava.com:onjava.com



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=544636

posted @ 2007-06-20 10:34 狼爱上狸 阅读(373) | 评论 (0)编辑 收藏

Windows xp下安装globus toolkit 4.0

经过一段时间的摸索,终于在昨天完成了globus toolkit的安装和第一个示例的调试,现在将整个过程,整理如下:希望对其他兄弟有所帮助。

一、globus toolkit4.0的安装。

   1、首先下载必须的软件,先列举如下:

1jdk 1.5.0,这里提示一下,如果大家想安装gt3,那么最好下载jdk1.41.5版本好像不支持枚举类型,在编译的时候可能会出错。

2gt4:我下的是ws-core-4.0.1-bin.zip版本,也有ws-core-4.0.1-src.tar.gz版本,这两个版本其实一样,只不过前者只需解压,后者需要解压还要ant all;建议用前者,简单。

3apache-ant-1.6.5(http://ant.apache.com)

4jakarta-tomcat-5.0.28.exe (http://tomcat.apache.com)

5axis-src-1_2_1.zip

  

2、创建目录:

 我只列举我的创建:

(1)       C:\Program Files\Java

(2)       D:\ws-core-4.0.1(建议globus的目录尽量短小)

(3)       D:\apache-ant-1.6.5

(4)       D:\jakarta-tomcat-5.0.28

 

3、安装上述软件:

解压jdkws-core-4.0.1apache-antjakarta-tomcat到相应路径。解压axis-src-1_2_1.zip文件,将axis-src-1_2_1目录下lib目录下的所有文件copyc:\progarm files\java\libs

  

   4、设置环境变量

   我的电脑-〉属性-〉高级-〉环境变量:

   包括几个部分,首先在用户变量中添加

ANT_HOME= D:\apache-ant-1.6.5

CATALINA_HOME= D:\jakarta-tomcat-5.0.28

JAVA_HOME= C:\Program Files\Java\jdk1.5.0_05

GLOBUS_LOCATION= D:\ws-core-4.0.1

   设置完成那个后,在path中添加

C:\ProgramFiles\Java\jdk1.5.0_05\bin;D:\apache-ant-1.6.5\bin;D:\ws-core-4.0.1\bin;D:\jakarta-tomcat-5.0.28\bin

   注意中间的分号。(关于环境变量的作用,可以参考我上一篇文章,也在blog中)。

   设置classpathclasspathxp系统下问题比较多,首先需要自己编辑,新建classpath后,加入jdklibC:\Program Files\Java\jdk1.5.0_05\lib;

   (关于环境变量的作用,可以参考我上一篇文章,也在blog中)。

  

   5、在tomcat下部署gt4

   (1) 进入dos界面,输入:cd %globus_location%;

   (2) ant -f share/globus_wsrf_common/tomcat/tomcat.xml deploySecureTomcat -Dtomcat.dir=%Catalina_home%

   上面的东西连续输入,不要换行。

   3)输入完成后,输入startup 启动tomcat

   4)如果一切正常就可以打开IE浏览器,输入http://localhost:8080/wsrf/services,应该能够显示一些服务了。

And now... Some Services

NotificationTestService (wsdl)

generateNotification

selfSubscribe TestAuthzService (wsdl)

addDeclinedMethod

SAMLRequest TestServiceWrongWSDL (wsdl)

createResource

resetNumInstances

getInstanceInfo

testLocalInvocation ShutdownService (wsdl)

shutdown CounterService (wsdl)

GT4安装成功。

  

对于globus的使用,我也处于初级阶段,肯定还有各种问题,如果大家有什么疑问,或疑难杂症,欢迎共同研究。

PS:如果觉得我的文章对你有帮助,请访问一下这个群18549673,谢谢!:)


引用地址:http://blog.programfan.com/trackback.asp?id=8378

posted @ 2007-06-20 10:30 狼爱上狸 阅读(3296) | 评论 (11)编辑 收藏

Globus Toolkit最佳入门指导

Globus Toolkit最佳入门指导

Posted in: 网罗天下, 探索i.n.g., DevWorks

看了很久的Globus Toolkit, 一直没有敢说自己是在学习网格的!
一个是因为GT挺庞大的,没办法一下子看清全貌,深陷其中,天天在Linux下和文档、环境变量大交道,把自己给搞糊涂了;
一个是因为暂时没做出什么东西,也没有什么技术上的沉淀,没什么可说的.但是感觉现在网上关于网格、关于GT的不是很多–不过最近在网上搜东西的时候,觉得相关资料突然冒了一些出来了。

关于网格我现在说不了什么,只好一边默默地探究去了。
唯一想说的就是Linux 把我整的够呛!Globus Toolkit也不是装上了就完事了的事!还有好多事要做!而GT的入门有一些材料会比较适合:

  • Globus.org 提供的QuickStart Guide 真的是最好的GT入门!
    很可惜,我的学长没有为我指一下这条路–还不如说是我自己洞察力不够?感觉枉费了好多的心血!
    另外在,GT安装包解压出来的文件中就有上面提到的QuickStart Guide!
  • Globus Consortium.org 提供的Tutorial,这个教程示范了含三个节点的网格集群的安装、配置,并且介绍了PBS、SGE等调度器!
  • 这两个教程是对GT的安装、配置、功能的一个很好的示范! 刚开始学习网格、接触Globus Toolkit开发包的同学可以参考这两个教材~

    posted @ 2007-06-20 10:27 狼爱上狸 阅读(1164) | 评论 (3)编辑 收藏

    Globus 4.0.1安装指南

         摘要: Globus 4.0.1安装指南                       作者:施宇光         ...  阅读全文

    posted @ 2007-06-20 10:21 狼爱上狸 阅读(2275) | 评论 (2)编辑 收藏

    Bitcomet中的dbghelp.dll问题解决


    BT软件BitComet会提示什么minidump无法找到什么接入点的,问题文件是W2K\system32\dbghelp.dll (159k)

    解决办法:

    1. 从http://www.dll321.com/soft/4/2006/20061213163.html 下载dbghelp.rar

    2. 解压

    3. 把解压目录下的home\dbghelp.dll (475k)覆盖到 W2K\system32\下和 C:\Program Files\BitComet\tools 下

    4. 重新启动BitComet ,没弹出提示框,问题解决。


    posted @ 2007-06-07 18:32 狼爱上狸 阅读(323) | 评论 (0)编辑 收藏

    仅列出标题
    共38页: First 上一页 29 30 31 32 33 34 35 36 37 下一页 Last