From 177ab8d21e2d2d2dedf81d986061b5d9478ad5c9 Mon Sep 17 00:00:00 2001 From: "xueli.xue" Date: Sun, 12 Mar 2017 21:44:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=99=A8=E7=AD=96=E7=95=A5?= =?UTF-8?q?=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- db/tables_xxl_job.sql | 2 +- .../admin/core/jobbean/RemoteHttpJobBean.java | 240 ++++++++++-------- .../route/strategy/ExecutorRouteRandom.java | 1 + .../com/xxl/job/admin/dao/IXxlJobLogDao.java | 2 + .../job/admin/dao/impl/XxlJobLogDaoImpl.java | 2 +- .../mybatis-mapper/XxlJobLogMapper.xml | 18 +- .../WEB-INF/template/joblog/joblog.index.ftl | 6 +- .../main/webapp/static/js/jobinfo.index.1.js | 2 +- .../main/webapp/static/js/joblog.index.1.js | 39 +-- .../com/xxl/job/core/util/HttpClientUtil.java | 11 +- 11 files changed, 184 insertions(+), 141 deletions(-) diff --git a/README.md b/README.md index c3e47565..9ef945d9 100644 --- a/README.md +++ b/README.md @@ -737,7 +737,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 3、CleanCode,清理无效的历史参数; - 4、规范系统配置数据,通过配置文件统一管理; - 5、执行器支持手动设置执行地址列表,提供开关切换使用注册地址还是手动设置的地址; -- 6、执行器路由规则:第一个、循环、随机、顺序故障(默认)转移; +- 6、执行器路由规则:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移; - 7、底层扩展数据接口调整; - 8、新建任务默认为非运行状态; diff --git a/db/tables_xxl_job.sql b/db/tables_xxl_job.sql index 829ab1bb..ea58a05d 100644 --- a/db/tables_xxl_job.sql +++ b/db/tables_xxl_job.sql @@ -154,7 +154,7 @@ CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_INFO` ( `update_time` datetime DEFAULT NULL, `author` varchar(64) DEFAULT NULL COMMENT '作者', `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件', - `executor_route_strategy` varchar(20) DEFAULT NULL COMMENT '执行器路由策略', + `executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略', `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler', `executor_param` varchar(255) DEFAULT NULL COMMENT '执行器任务参数', `glue_switch` int(11) DEFAULT '0' COMMENT 'GLUE模式开关:0-否,1-是', diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java index ac30dd03..5ed57e74 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java @@ -3,6 +3,7 @@ package com.xxl.job.admin.core.jobbean; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLog; +import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum; import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler; import com.xxl.job.admin.core.thread.JobMonitorHelper; import com.xxl.job.admin.core.thread.JobRegistryHelper; @@ -11,6 +12,7 @@ import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.registry.RegistHelper; import com.xxl.job.core.rpc.netcom.NetComClientProxy; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; @@ -19,7 +21,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.quartz.QuartzJobBean; -import java.text.MessageFormat; import java.util.*; /** @@ -34,26 +35,23 @@ public class RemoteHttpJobBean extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { + + // load job JobKey jobKey = context.getTrigger().getJobKey(); Integer jobId = Integer.valueOf(jobKey.getName()); XxlJobInfo jobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(jobId); - // save log + // log part-1 XxlJobLog jobLog = new XxlJobLog(); jobLog.setJobGroup(jobInfo.getJobGroup()); jobLog.setJobId(jobInfo.getId()); XxlJobDynamicScheduler.xxlJobLogDao.save(jobLog); logger.debug(">>>>>>>>>>> xxl-job trigger start, jobId:{}", jobLog.getId()); - // admin address - List adminAddressList = JobRegistryHelper.discover(RegistHelper.RegistType.ADMIN.name(), RegistHelper.RegistType.ADMIN.name()); - Set adminAddressSet = new HashSet(); - if (adminAddressList!=null) { - adminAddressSet.addAll(adminAddressList); - } - adminAddressSet.add(XxlJobDynamicScheduler.getCallbackAddress()); - - // update trigger info 1/2 + // log part-2 param + //jobLog.setExecutorAddress(executorAddress); + jobLog.setExecutorHandler(jobInfo.getExecutorHandler()); + jobLog.setExecutorParam(jobInfo.getExecutorParam()); jobLog.setTriggerTime(new Date()); // trigger request @@ -64,114 +62,152 @@ public class RemoteHttpJobBean extends QuartzJobBean { triggerParam.setGlueSwitch((jobInfo.getGlueSwitch()==0)?false:true); triggerParam.setLogId(jobLog.getId()); triggerParam.setLogDateTim(jobLog.getTriggerTime().getTime()); - triggerParam.setLogAddress(adminAddressSet); + triggerParam.setLogAddress(findCallbackAddressList()); // callback address list - // parse address - String groupAddressInfo = "注册方式:"; - List addressList = new ArrayList(); - XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(Integer.valueOf(jobInfo.getJobGroup())); - if (group!=null) { - if (group.getAddressType() == 0) { - groupAddressInfo += "自动注册"; - addressList = JobRegistryHelper.discover(RegistHelper.RegistType.EXECUTOR.name(), group.getAppName()); - } else { - groupAddressInfo += "手动录入"; - if (StringUtils.isNotBlank(group.getAddressList())) { - addressList = Arrays.asList(group.getAddressList().split(",")); - } - } - groupAddressInfo += ",地址列表:" + addressList.toString(); - } - groupAddressInfo += "

"; + // do trigger + ReturnT triggerResult = doTrigger(triggerParam, jobInfo, jobLog); - // failover trigger - ReturnT triggerResult = failoverTrigger(addressList, triggerParam, jobLog); - jobLog.setExecutorHandler(jobInfo.getExecutorHandler()); - jobLog.setExecutorParam(jobInfo.getExecutorParam()); - logger.info(">>>>>>>>>>> xxl-job failoverTrigger, jobId:{}, triggerResult:{}", jobLog.getId(), triggerResult.toString()); - - // update trigger info 2/2 + // log part-2 jobLog.setTriggerCode(triggerResult.getCode()); - jobLog.setTriggerMsg(groupAddressInfo + triggerResult.getMsg()); + jobLog.setTriggerMsg(triggerResult.getMsg()); XxlJobDynamicScheduler.xxlJobLogDao.updateTriggerInfo(jobLog); // monitor triger JobMonitorHelper.monitor(jobLog.getId()); - logger.debug(">>>>>>>>>>> xxl-job trigger end, jobId:{}", jobLog.getId()); } - - - /** - * failover for trigger remote address - * @return - */ - public ReturnT failoverTrigger(List addressList, TriggerParam triggerParam, XxlJobLog jobLog){ - if (addressList==null || addressList.size() < 1) { - return new ReturnT(ReturnT.FAIL_CODE, "Trigger error,
>>>[address] is null

"); - } else if (addressList.size() == 1) { - String address = addressList.get(0); - // store real address - jobLog.setExecutorAddress(address); - // real trigger - ExecutorBiz executorBiz = null; - try { - executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address).getObject(); - } catch (Exception e) { - e.printStackTrace(); - return new ReturnT(ReturnT.FAIL_CODE, e.getMessage()); - } - ReturnT runResult = executorBiz.run(triggerParam); + public ReturnT doTrigger(TriggerParam triggerParam, XxlJobInfo jobInfo, XxlJobLog jobLog){ + StringBuffer triggerSb = new StringBuffer(); - String failoverMessage = MessageFormat.format("Trigger running,
>>>[address] : {0},
>>>[code] : {1},
>>>[msg] : {2}

", - address, runResult.getCode(), runResult.getMsg()); - runResult.setMsg(runResult.getMsg() + failoverMessage); - return runResult; - } else { - - // for ha - Collections.shuffle(addressList); + // exerutor address list + ArrayList addressList = null; + XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(jobInfo.getJobGroup()); + if (group.getAddressType() == 0) { + triggerSb.append("注册方式:自动注册"); + addressList = (ArrayList) JobRegistryHelper.discover(RegistHelper.RegistType.EXECUTOR.name(), group.getAppName()); + } else { + triggerSb.append("注册方式:手动录入"); + if (StringUtils.isNotBlank(group.getAddressList())) { + addressList = new ArrayList(Arrays.asList(group.getAddressList().split(","))); + } + } + triggerSb.append("
地址列表:").append(addressList!=null?addressList.toString():""); + if (CollectionUtils.isEmpty(addressList)) { + triggerSb.append("
调度失败:").append("执行器地址为空"); + return new ReturnT(ReturnT.FAIL_CODE, triggerSb.toString()); + } - // for failover - String failoverMessage = ""; - for (String address : addressList) { - if (StringUtils.isNotBlank(address)) { + // trigger remote executor + if (addressList.size() == 1) { + String address = addressList.get(0); + jobLog.setExecutorAddress(address); + ReturnT runResult = runExecutor(triggerParam, address); + triggerSb.append("
").append(runResult.getMsg()); - ExecutorBiz executorBiz = null; - try { - executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address).getObject(); - } catch (Exception e) { - e.printStackTrace(); - return new ReturnT(ReturnT.FAIL_CODE, e.getMessage()); - } - - // beat check - ReturnT beatResult = executorBiz.beat(); - failoverMessage += MessageFormat.format("BEAT running,
>>>[address] : {0},
>>>[code] : {1},
>>>[msg] : {2}

", - address, beatResult.getCode(), beatResult.getMsg()); - - // beat success, trigger do - if (beatResult.getCode() == ReturnT.SUCCESS_CODE) { - // store real address - jobLog.setExecutorAddress(address); - - // real trigger - ReturnT runResult = executorBiz.run(triggerParam); - - failoverMessage += MessageFormat.format("Trigger running,
>>>[address] : {0},
>>>[status] : {1},
>>>[msg] : {2}

", - address, runResult.getCode(), runResult.getMsg()); - runResult.setMsg( runResult.getMsg() + failoverMessage); - return runResult; - } - - } + return new ReturnT(runResult.getCode(), triggerSb.toString()); + } else { + // executor route strategy + ExecutorRouteStrategyEnum executorRouteStrategyEnum = ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null); + triggerSb.append("
路由策略:").append(executorRouteStrategyEnum!=null?(executorRouteStrategyEnum.name() + "-" + executorRouteStrategyEnum.getTitle()):null); + if (executorRouteStrategyEnum == null) { + triggerSb.append("
调度失败:").append("执行器路由策略为空"); + return new ReturnT(ReturnT.FAIL_CODE, triggerSb.toString()); } - return new ReturnT(ReturnT.FAIL_CODE, failoverMessage); + if (executorRouteStrategyEnum != ExecutorRouteStrategyEnum.FAILOVER) { + // get address + String address = executorRouteStrategyEnum.getRouter().route(jobInfo.getId(), addressList); + jobLog.setExecutorAddress(address); + + // run + ReturnT runResult = runExecutor(triggerParam, address); + triggerSb.append("
").append(runResult.getMsg()); + + return new ReturnT(runResult.getCode(), triggerSb.toString()); + } else { + for (String address : addressList) { + // beat + ReturnT beatResult = beatExecutor(address); + triggerSb.append("
").append(beatResult.getMsg()); + + if (beatResult.getCode() == ReturnT.SUCCESS_CODE) { + jobLog.setExecutorAddress(address); + + ReturnT runResult = runExecutor(triggerParam, address); + triggerSb.append("
").append(runResult.getMsg()); + + return new ReturnT(runResult.getCode(), triggerSb.toString()); + } + } + return new ReturnT(ReturnT.FAIL_CODE, triggerSb.toString()); + } } } - + /** + * run executor + * @param address + * @return + */ + public ReturnT beatExecutor(String address){ + ReturnT beatResult = null; + try { + ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address).getObject(); + beatResult = executorBiz.beat(); + } catch (Exception e) { + logger.error("", e); + beatResult = new ReturnT(ReturnT.FAIL_CODE, ""+e ); + } + + StringBuffer sb = new StringBuffer("心跳检测:"); + sb.append("
address:").append(address); + sb.append("
code:").append(beatResult.getCode()); + sb.append("
msg:").append(beatResult.getMsg()); + beatResult.setMsg(sb.toString()); + + return beatResult; + } + + /** + * run executor + * @param triggerParam + * @param address + * @return + */ + public ReturnT runExecutor(TriggerParam triggerParam, String address){ + ReturnT runResult = null; + try { + ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address).getObject(); + runResult = executorBiz.run(triggerParam); + } catch (Exception e) { + logger.error("", e); + runResult = new ReturnT(ReturnT.FAIL_CODE, ""+e ); + } + + StringBuffer sb = new StringBuffer("触发调度:"); + sb.append("
address:").append(address); + sb.append("
code:").append(runResult.getCode()); + sb.append("
msg:").append(runResult.getMsg()); + runResult.setMsg(sb.toString()); + + return runResult; + } + + /** + * find callback address list + * @return + */ + public Set findCallbackAddressList(){ + Set adminAddressSet = new HashSet(); + adminAddressSet.add(XxlJobDynamicScheduler.getCallbackAddress()); + + List adminAddressList = JobRegistryHelper.discover(RegistHelper.RegistType.ADMIN.name(), RegistHelper.RegistType.ADMIN.name()); + if (adminAddressList!=null) { + adminAddressSet.addAll(adminAddressList); + } + return adminAddressSet; + } + } \ No newline at end of file diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java index 70e0e28a..88e031e5 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java @@ -14,6 +14,7 @@ public class ExecutorRouteRandom extends ExecutorRouter { @Override public String route(int jobId, ArrayList addressList) { + // Collections.shuffle(addressList); return addressList.get(localRandom.nextInt(addressList.size())); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobLogDao.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobLogDao.java index 42412084..e3c9f48e 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobLogDao.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/IXxlJobLogDao.java @@ -17,7 +17,9 @@ public interface IXxlJobLogDao { public XxlJobLog load(int id); public int save(XxlJobLog xxlJobLog); + public int updateTriggerInfo(XxlJobLog xxlJobLog); + public int updateHandleInfo(XxlJobLog xxlJobLog); public int delete(int jobId); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobLogDaoImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobLogDaoImpl.java index df9cfbb4..510b5663 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobLogDaoImpl.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobLogDaoImpl.java @@ -55,7 +55,7 @@ public class XxlJobLogDaoImpl implements IXxlJobLogDao { public int save(XxlJobLog xxlJobLog) { return sqlSessionTemplate.insert("XxlJobLogMapper.save", xxlJobLog); } - + @Override public int updateTriggerInfo(XxlJobLog xxlJobLog) { if (xxlJobLog.getTriggerMsg()!=null && xxlJobLog.getTriggerMsg().length()>2000) { diff --git a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml index 9919db9f..240ed274 100644 --- a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml +++ b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml @@ -88,26 +88,20 @@ INSERT INTO XXL_JOB_QRTZ_TRIGGER_LOG ( `job_group`, - `job_id`, - `executor_address`, - `executor_handler`, - `executor_param` + `job_id` ) VALUES ( #{jobGroup}, - #{jobId}, - #{executorAddress}, - #{executorHandler}, - #{executorParam} + #{jobId} ); SELECT LAST_INSERT_ID() - + UPDATE XXL_JOB_QRTZ_TRIGGER_LOG - SET - `trigger_time`= #{triggerTime}, + SET + `trigger_time`= #{triggerTime}, `trigger_code`= #{triggerCode}, `trigger_msg`= #{triggerMsg}, `executor_address`= #{executorAddress}, @@ -115,7 +109,7 @@ `executor_param`= #{executorParam} WHERE `id`= #{id} - + UPDATE XXL_JOB_QRTZ_TRIGGER_LOG SET diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/joblog.index.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/joblog.index.ftl index 35b06069..ab3a84a9 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/joblog.index.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/joblog.index.ftl @@ -78,12 +78,12 @@ id 执行器ID 任务ID + 调度时间 + 调度结果 + 调度备注 执行器地址 JobHandler 任务参数 - 调度时间 - 调度结果 - 调度备注 执行时间 执行结果 执行备注 diff --git a/xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js b/xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js index 022c0324..c45edb23 100644 --- a/xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js +++ b/xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js @@ -138,7 +138,7 @@ $(function() { "sProcessing" : "处理中...", "sLengthMenu" : "每页 _MENU_ 条记录", "sZeroRecords" : "没有匹配结果", - "sInfo" : "第 _PAGE_ 页 ( 总共 _PAGES_ 页 )", + "sInfo" : "第 _PAGE_ 页 ( 总共 _PAGES_ 页,_TOTAL_ 条记录 )", "sInfoEmpty" : "无记录", "sInfoFiltered" : "(由 _MAX_ 项结果过滤)", "sInfoPostFix" : "", diff --git a/xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js b/xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js index eb121348..537f18e2 100644 --- a/xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js +++ b/xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js @@ -81,6 +81,25 @@ $(function() { { "data": 'id', "bSortable": false, "visible" : false}, { "data": 'jobGroup', "visible" : false}, { "data": 'jobId', "visible" : false}, + { + "data": 'triggerTime', + "render": function ( data, type, row ) { + return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):""; + } + }, + { + "data": 'triggerCode', + "render": function ( data, type, row ) { + return (data==200)?'成功':(data==500)?'失败':(data==0)?'':data; + } + + }, + { + "data": 'triggerMsg', + "render": function ( data, type, row ) { + return data?'查看'+ data +'':"无"; + } + }, { "data": 'executorAddress', "visible" : true}, { "data": 'executorHandler', @@ -90,25 +109,7 @@ $(function() { } }, { "data": 'executorParam', "visible" : true}, - { - "data": 'triggerTime', - "render": function ( data, type, row ) { - return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):""; - } - }, - { - "data": 'triggerCode', - "render": function ( data, type, row ) { - return (data==200)?'成功':(data==500)?'失败':(data==0)?'':data; - } - }, - { - "data": 'triggerMsg', - "render": function ( data, type, row ) { - return data?'查看'+ data +'':"无"; - } - }, { "data": 'handleTime', "render": function ( data, type, row ) { @@ -147,7 +148,7 @@ $(function() { "sProcessing" : "处理中...", "sLengthMenu" : "每页 _MENU_ 条记录", "sZeroRecords" : "没有匹配结果", - "sInfo" : "第 _PAGE_ 页 ( 总共 _PAGES_ 页 )", + "sInfo" : "第 _PAGE_ 页 ( 总共 _PAGES_ 页,_TOTAL_ 条记录 )", "sInfoEmpty" : "无记录", "sInfoFiltered" : "(由 _MAX_ 项结果过滤)", "sInfoPostFix" : "", diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/util/HttpClientUtil.java b/xxl-job-core/src/main/java/com/xxl/job/core/util/HttpClientUtil.java index 1c8e3608..c39f759b 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/util/HttpClientUtil.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/util/HttpClientUtil.java @@ -1,5 +1,7 @@ package com.xxl.job.core.util; +import com.xxl.job.core.rpc.codec.RpcResponse; +import com.xxl.job.core.rpc.serialize.HessianSerializer; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPost; @@ -8,6 +10,8 @@ import org.apache.http.entity.ContentType; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @@ -18,6 +22,7 @@ import java.io.InputStream; * @author xuxueli 2015-10-31 19:50:41 */ public class HttpClientUtil { + private static Logger logger = LoggerFactory.getLogger(HttpClientUtil.class); /** * post request @@ -47,7 +52,11 @@ public class HttpClientUtil { EntityUtils.consume(entity); } } catch (Exception e) { - e.printStackTrace(); + logger.error("", e); + + RpcResponse rpcResponse = new RpcResponse(); + rpcResponse.setError(e.getMessage()); + responseBytes = HessianSerializer.serialize(rpcResponse); } finally { httpPost.releaseConnection(); try {