servicecall_async_java - catyguan/sad GitHub Wiki

用例场景(异步)Java实现范例

服务端

public class SMAsync implements ServiceMethod {

	@Override
	public void execute(ServicePeer peer, Request req, Context ctx) {
		int sleepTime = req.getInt("sleep");
		if (sleepTime <= 0) {
			sleepTime = 3;
		}
		peer.sendAsync(ctx, null, 10 * 1000);

		final int fSleepTime = sleepTime;
		final ServicePeer fpeer = peer;
		new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					Thread.sleep(fSleepTime * 1000);
				} catch (InterruptedException e) {
				}
				Answer a = new Answer();
				a.sureResult().put("Word", "Hello Kitty");
				fpeer.writeAnswer(a, null);
			}
		}).run();
	}
}

客户端

poll模式

Client cl = ...
Address addr = ...

Request req = new Request();
Context ctx = new Context();
ctx.put(PropertyConst.ASYNC_MODE, "poll");

Answer answer = cl.invoke(addr, req, ctx);
answer.checkError();
if (!answer.isAsync()) {
	System.err.println("must answer async");
	return;
}
			
Date et = new Date(new Date().getTime()+10*1000);
Answer answer2 = cl.PollAnswer(addr, answer, ctx, et, 500);
if(answer2==null) {
	System.err.println("poll timeout");
	return;			
}
			
answer2.checkError();			
if(!answer2.isDone()) {
	System.err.println("Answer fail - "+answer2.getStatus());
	return;
}

ValueMap rs = answer2.getResult();
if(rs != null) {
	System.out.println("Result === "+rs);
}

push模式

当前http通信协议不支持该模式

Client cl = ...
Address addr = ...

Request req = new Request();
Context ctx = new Context();
ctx.put(PropertyConst.ASYNC_MODE, "push");

Answer answer = cl.invoke(addr, req, ctx);
answer.checkError();
if (!answer.isAsync()) {
	System.err.println("must answer async");
	return;
}
			
Answer answer2 = cl.waitAnswer(addr, 5500)
if(answer2==null) {
	System.err.println("poll timeout");
	return;			
}
			
answer2.checkError();			
if(!answer2.isDone()) {
	System.err.println("Answer fail - "+answer2.getStatus());
	return;
}

ValueMap rs = answer2.getResult();
if(rs != null) {
	System.out.println("Result === "+rs);
}

callback模式

Client cl = ...
Address addr = ...
Address callbackaddr = ...

Request req = new Request();
Context ctx = new Context();
ctx.put(PropertyConst.ASYNC_MODE, "callback");
ctx.put(PropertyConst.CALLBACK, callback.toValueMap());

Answer answer = cl.invoke(addr, req, ctx);
answer.checkError();
if (!answer.isAsync()) {
	System.err.println("must answer async");
	return;
}
return;