package foundation.icall.callout;
|
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
|
import foundation.dao.DataPackage;
|
import foundation.dao.DataWriter;
|
import foundation.dao.bizlogic.IActionProvider;
|
import foundation.dao.bizlogic.IRequest;
|
import foundation.dao.bizlogic.ResponseType;
|
import foundation.data.meta.field.FieldsRuntime;
|
import foundation.icall.ICall;
|
import foundation.icall.OutboundResult;
|
import foundation.icall.connector.HttpServerConn;
|
import foundation.io.IOContext;
|
import foundation.io.define.DataIOContainer;
|
import foundation.io.define.IOSQLContext;
|
import foundation.io.define.IOTask;
|
import foundation.io.define.IOWorkStep;
|
import foundation.io.define.IOWorkflow;
|
import foundation.io.engine.IOEngine;
|
import foundation.io.template.ResponseTemplate;
|
import foundation.util.ID;
|
import foundation.util.Util;
|
import foundation.workflow.WorkStep;
|
import foundation.workflow.reference.ICallSender;
|
|
public class RemoteServerCallProvider implements IActionProvider{
|
|
protected static Logger logger;
|
protected WorkStep step;
|
protected ICall iCall;
|
protected HttpServerConn serverSource;
|
protected FieldsRuntime remoteFields;
|
protected OutboundResult outboundResult;
|
private String instanceId;
|
|
static {
|
logger = LogManager.getLogger(RemoteServerCallProvider.class);
|
}
|
|
public RemoteServerCallProvider(OutboundResult outboundResult, ICall iCall) {
|
this.outboundResult = outboundResult;
|
this.iCall = iCall;
|
instanceId = ID.newValue();
|
}
|
|
@Override
|
public void exec(WorkStep step, String method) throws Exception {
|
doExec(step);
|
}
|
|
public void doExec(WorkStep step) throws Exception {
|
this.step = step;
|
serverSource = (HttpServerConn)iCall.getRemoteSource();
|
//1. create request
|
IRequest request = serverSource.createRequest(iCall.getURL());
|
|
//2. create body
|
request = serverSource.buildBody(request, step, iCall);
|
|
//3. send request
|
boolean simulate = step.isSimulate();
|
String stepOriginalId = null;
|
DataPackage originalPackage = step.getDataPackage();
|
|
if (originalPackage != null) {
|
stepOriginalId = originalPackage.getMasterId();
|
}
|
JSONResponse response = null;
|
|
if (iCall.getMethodType() == MethodType.PUT) {
|
response = serverSource.put(simulate, request, ResponseType.JSON);
|
}
|
else {
|
response = serverSource.post(simulate, request, ResponseType.JSON);
|
}
|
|
//4. print response
|
String responseValue = response.toString();
|
outboundResult.setResponse(responseValue);
|
ResponseTemplate resposeTemplate = iCall.getResponseTemplate();
|
DataPackage dataPackage = null;
|
|
if (resposeTemplate != null) {
|
response.setInstanceId(instanceId);
|
response.format(resposeTemplate, step.getDataPackage(), stepOriginalId);
|
dataPackage = response.getDataPackage();
|
step.setDataPackage(dataPackage);
|
}
|
|
//6. 保存本次数据到业务表
|
IOSQLContext context = new IOSQLContext();
|
context.addOneParameter("iobatchid", instanceId);
|
context.addOneParameter("docId", stepOriginalId);
|
String tempTable = resposeTemplate != null ? dataPackage.getMasterDataObject().getTableName() : null;
|
context.addOneParameter("interfaceTempTable", tempTable);
|
moveLocalMirrorToTarget(context);
|
|
DataWriter dataWriter = step.getDataWriter();
|
|
if (dataWriter != null) {
|
dataWriter.addValue("icall_result", response);
|
}
|
|
ICallSender sender = new ICallSender(iCall.getName(), String.valueOf(response.getResultCode()));
|
outboundResult.setSender(sender);
|
|
logger.debug("send {} result: {}", request.getURL(), responseValue);
|
}
|
|
private void moveLocalMirrorToTarget(IOSQLContext context) throws Exception {
|
String taskName = iCall.getIOTaskName();
|
|
//1. 如果没有定义 搬运
|
if (Util.isEmpty(taskName)) {
|
logger.debug("没有配置搬运程序,将mirror数据搬运到业务表跳过");
|
return;
|
}
|
|
//2.运行IO Task -- 运行数据搬运
|
IOWorkflow ioWorkflow = IOWorkflow.getInstance(taskName);
|
if (ioWorkflow != null) {
|
for (IOWorkStep step: ioWorkflow) {
|
step.exec(context);
|
}
|
|
return;
|
}
|
|
//3.运行IO Task -- 运行数据搬运
|
DataIOContainer ioContainer = DataIOContainer.getInstance();
|
IOTask ioTask = ioContainer.getIOTask(taskName);
|
|
if (ioTask != null) {
|
IOEngine ioEngine = new IOEngine();
|
ioEngine.init(step.getDataReader(), step.getDataWriter(), step, ioTask, new IOContext());
|
ioEngine.runTableToTables();
|
}
|
}
|
}
|