参考文献:https://blog.csdn.net/yungame/article/details/81221652?locationNum=6&fps=1
第一步:程序入口:组织入参,调用方法
RequestMapping("/aixinSignedCallBack")
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
BufferedReader streamReader = new BufferedReader( new InputStreamReader(request.getInputStream(), "UTF-8"));
StringBuilder sb = new StringBuilder();
String inputStr;
while ((inputStr = streamReader.readLine()) != null) {
sb.append(inputStr);
}
System.out.println("JSON数据:"+sb.toString());
Map<String, Object> requestMap = JSON.parseObject(sb.toString());
Map dataMap = JSON.parseObject(requestMap.get("reqData").toString());
String orderno = dataMap.get("orderNo")+"";
orderno = orderno.substring(0, orderno.indexOf("@"));
dataMap.put("orderNo", orderno);
String callBackStr = "";
logger.info("爱心-一键签约-接口回调入参:" + JSON.toJSONString(dataMap));
callBackStr = aixinLifeSignCallbackService.stateCallBack(JSON.toJSONString(dataMap));
logger.info("爱心-一键签约-接口回调出参:" + callBackStr);
//爱心-重定向地址
String redirectUrl = ipService.getAIXINServerUrl(Constant.AIXINLIFE_SIGNEDBACKURL);
redirectUrl = redirectUrl + "="+dataMap.get("orderNo")+"&stepCode=N008&SMSFlag=true";
System.out.println("重定向地址地址..........."+redirectUrl);
response.sendRedirect(redirectUrl);
}
第二步:调用方法,new线程,注意参数final
@Override
public String stateCallBack(String callBackReqStr) {
final Map<String, Object> map = JSON.parseObject(callBackReqStr);
logger.info("回调入参:"+JSON.toJSONString(map));
boolean flag = false;
String resultStr = "";
Map<String,String> resultMap = new HashMap<>();
//爱心-回调cabala服务
final String stateCallBackUrl = ipService.getAIXINServerUrl(Constant.AIXINLIFE_SIGNECABALAURL);
resultMap.put("errorCode", "0000");
resultMap.put("msg", "回调成功");
//增加线程调用cabala服务
// 在新线程中调用耗时操作
final FutureTask ft = new FutureTask(new AixinSignThread());
// 在新线程中调用耗时操作
new Thread() {
public void run() {
ft.makeRealData(map,stateCallBackUrl);
}
}.start();
resultStr = JSON.toJSONString(resultMap);
return resultStr;
}
第三步:执行异步方法:process里封装着具体的异步调用,本步骤,统一标识,调用另一个系统的服务,或者接收参数再次使用(本次没写)
public class FutureTask {
private Object data = null;
private boolean completed = false;
private ProcessData pd;
public FutureTask(ProcessData pd) {
this.pd = pd;
}
public synchronized void makeRealData(Map map,String stateCallBackUrl) {
if (this.completed)
return;
// 获取数据的耗时操作.这里用Sleep代替
try {
this.pd.process(map,stateCallBackUrl);
//Thread.sleep(10000);
} catch (Throwable t) {
System.out.print("异常:"+t);
t.printStackTrace();
}
this.data = "返回的数据内容";
this.completed = true;
//notifyAll();
}
}
第四步:http调用另一系统接口
@Override
public void process(Map map,String stateCallBackUrl) {
String resultStr = "";
String url = stateCallBackUrl + "&ORDERNO="+map.get("orderNo")+"&CONTRACTSTATUS=" + map.get("contractStatus")+"&PARTNERCODE=" + "1106";
System.out.println("异步cabala入参..........."+JSON.toJSONString(map));
System.out.println("异步cabala地址..........."+url);
try {
//resultStr = HttpClientTool.getInstance().doPost(JSON.toJSONString(map), stateCallBackUrl);
resultStr = HttpClientTool.getInstance().sendMessage(JSON.toJSONString(map), url, null, null);
} catch (Exception e) {
e.printStackTrace();
System.out.println("异常问题:"+ e);
}
System.out.println("返回值"+resultStr);
Map<String, Object> cabalaMap = JSON.parseObject(resultStr);
IPService ipService = new IPService();
}
希望能够帮助到你们。