服务端是用java写的,在接收到客户端传递的参数后,对数据进行封装,然后进行验证数据有效性。 |
|
求大神解决问题
|
|
10分 |
封装出来的这个对象只要不是全局属性,就不会有覆盖的问题呀。 你把service的实现类发出来看看
|
package com.adm.server.service.impl; import javax.annotation.Resource; import javax.jws.WebService; import org.apache.log4j.Logger; import com.adm.cognosexportengine.log.service.ILogManagerService; import com.adm.cognosexportengine.pojo.TLog; import com.adm.cognosexportengine.pojo.TTypeDefine; import com.adm.cognosexportengine.typedefine.service.ITypeDefineManagerService; import com.adm.server.service.IEngine; import com.adm.utils.DateUtils; @WebService(endpointInterface = "com.adm.server.service.IEngine") public class EngineImpl implements IEngine { private static final Logger log = Logger.getLogger(EngineImpl.class); // 报表引擎 @Resource(name = "webServiceEngine") private com.adm.cognosexportengine.engine.IEngine engine; @Resource(name = "typeDefineManagerService") private ITypeDefineManagerService typeDefineManagerService; @Resource(name = "logManagerService") private ILogManagerService logManagerService; private TTypeDefine typeDefine; private TLog tLog; private String startTime; // 1:运行成功 0:运行失败 private String status; private String message; /** * <p> * 功能描述:[webService启动引擎] * </p> * * @return * @throws Exception * @author:Brook * @update:[日期YYYY-MM-DD][Brook][捕获抛出异常] */ @SuppressWarnings("unchecked") public String run(String taskId) { setStartTime(null); if (taskId == null || "".equals(taskId)) { // 判断 生成xml 串返回 setStatus("0"); setMessage("taskId不允许为空"); log.error("taskId不允许为空"); return new EngineImpl().creatResultUtil(taskId,"", status, startTime, DateUtils.getNow(), message); } typeDefine = (TTypeDefine) typeDefineManagerService.findByID( TTypeDefine.class, Long.parseLong(taskId)); // 更新最近开始执行时间 typeDefine.setLastTimeStartTime(DateUtils.getNow()); typeDefineManagerService.update(typeDefine); tLog = new TLog(taskId, typeDefine.getName(), "定时调度", startTime, "", "", ""); logManagerService.save(tLog); try { System.out.println("EngineImpl.run()-----------hashcode"+this.hashCode()); engine.execute(taskId); setStatus("1"); setMessage("运行成功"); typeDefine.setLastStatus("执行完成"); tLog.setMessageId("正常执行"); } catch (Exception e) { String messageInfo = e.getMessage(); setStatus("0"); setMessage("运行失败\n" + messageInfo); typeDefine.setLastStatus("异常结束"); tLog.setMessageId("执行失败"); if (messageInfo.length() > 3000) { messageInfo = messageInfo.substring(0, 3000); } typeDefine.setErrMsg(messageInfo); tLog.setMessageInfo(messageInfo); } // 更新最近结束执行时间 typeDefine.setLastTimeEndTime(DateUtils.getNow()); tLog.setEndTime(DateUtils.getNow(DateUtils.FORMAT_LONG)); typeDefineManagerService.update(typeDefine); logManagerService.update(tLog); return new EngineImpl().creatResultUtil(taskId, typeDefine.getName(),status, startTime, DateUtils.getNow(), message); } public String creatResultUtil(String taskId, String taskNm,String status, String starttime, String endtime, String message) { StringBuffer resultMessage = new StringBuffer(); resultMessage.append("<result>\n"); resultMessage.append("<taskid>" + taskId + "</taskid>\n"); resultMessage.append("<tasknm>"+taskNm+"</tasknm>\n"); resultMessage.append("<statue>" + status + "<statue>\n"); resultMessage.append("<starttime>" + starttime + "</starttime>\n"); resultMessage.append("<endtime>" + endtime + "</endtime>\n"); resultMessage.append("<message>" + message + "</message>\n"); resultMessage.append("</result>"); return resultMessage.toString(); } public String getStartTime() { return startTime; } public void setStartTime(String startTime) { if (!"".equals(startTime) || startTime == null) { this.startTime = DateUtils.getNow(); } else { this.startTime = startTime; } } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } |
|
客户端调用的时候使用的是多线程并发,然后就会发生返回值都是同一个的问题,也就是service中发生了覆盖
|
|
5分 |
spring都单例哦,单例你还搞成员变量,那完全是你自己的问题…
|
应该怎么搞 |
|
5分 |
返回值相同只能说明run方法返回了相同的结果,可能是方法内部处理导致。比如参数没有接收到或者engine.execute(taskId); 发生了异常可能导致结果完全是一样的。 你这里不存在覆盖的问题。 还有客户端如果处理不当也会出现结果返回结果错误的问题哦 |
那我输出EngineImpl中run方法的hashcode()结果两次调用是同一个,怎么处理 |
|
20分 |
this.hashcode()打印是EngineImpl实例的hush值, 你的这个对象只有一个,结果是肯定是形同的,再说这跟你的问题完全不相干 |
谢谢,我已经解决了,把成员变量换成了局部变量
|