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;