利用axis2、eclipse plugin生成webservice

这两天闲来无事,工作比较轻松,于是就学习了下axis2数据绑定端采用了XMLBean,因为工作量太大,所以采用了eclipse插件。关于插件的使用步骤详见http://wso2.org/library/1719
我的客户端采用了xmlbean方法实现,服务器端采用了最简单的pojo其实具体采用pojo xmlbean axiom我觉得不是重点,关键是如何使用工具生成的stub类。我的服务类如下:
package com.cxz.webservice;

public class AsynGreeting {
	public String greetings(String name) {
		try {
			//To show the Asynchronization influence
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return "Greetings to " + name;
	}
}

就是很简单的helloworld,唯一不同的就是加了一个sleep()用来在异步调用中显示作用。
然后利用plugin生成其他部分。
如果客户端采取同步调用,其调用类如下:
package com.cxz.webservice.client;

import java.lang.Exception;
import com.cxz.webservice.GreetingsDocument;
import com.cxz.webservice.GreetingsResponseDocument;
import com.cxz.webservice.GreetingServiceStub;

public class SyncClient {
	public static void main(String[] args) {
		GreetingServiceStub stub = null;
		try {
			stub = new GreetingServiceStub();
			GreetingsDocument reqDoc = GreetingsDocument.Factory.newInstance();
			reqDoc.addNewGreetings();
			reqDoc.getGreetings().setName("Bernard");
			GreetingsResponseDocument respDoc = stub.greetings(reqDoc);
			System.out.println(respDoc.getGreetingsResponse().getReturn());
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

当然,客户端的数据绑定采用了xmlbean方式。

在实现一部调用之前,要实现一些回雕接口,让axis2框架在完成调用之后自动去调用,该回调类如下:
package com.cxz.webservice.impl;

import com.cxz.webservice.GreetingServiceCallbackHandler;

public class CallbackHandlerImpl extends GreetingServiceCallbackHandler {
	public boolean isFinished = false;
	public void receiveResultgreetings(
			com.cxz.webservice.GreetingsResponseDocument result) {
		System.out.println(result.getGreetingsResponse().getReturn());
		isFinished = true;
	}
	public void receiveErrorgreetings(java.lang.Exception e) {
		e.printStackTrace();
	}
}




下面的部分就是采用异步方式调用的客户端
package com.cxz.webservice.client;

import com.cxz.webservice.GreetingServiceCallbackHandler;
import com.cxz.webservice.GreetingServiceStub;
import com.cxz.webservice.GreetingsDocument;
import com.cxz.webservice.impl.CallbackHandlerImpl;

public class AsynClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		GreetingServiceStub stub = null;
		try {
			CallbackHandlerImpl callback = new CallbackHandlerImpl();
			stub = new GreetingServiceStub();
			GreetingsDocument reqDoc = GreetingsDocument.Factory.newInstance();
			reqDoc.addNewGreetings();
			reqDoc.getGreetings().setName("Bernard");
			//GreetingsResponseDocument respDoc = stub.greetings(reqDoc);
			//System.out.println(respDoc.getGreetingsResponse().getReturn());
			stub.startgreetings(reqDoc, callback);
			synchronized(callback){
				while(!callback.isFinished){
					callback.wait(100l);
				}
				System.out.println("End");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


异步调用中最重要的是:一定要让main线程保持活动状态,我曾经犯的一个让我很迷惑的错误是:支线程在在完成之前,main线程就结束了,导致非预期结果,让我感到很迷茫,看了网上的一些例子才明白。
还有一点就是那个回调类,一定要重写receiveErrorgreetings()方法,否则不会报任何异常。

你可能感兴趣的:(eclipse,框架,工作,webservice,活动)