WebService线程问题

J2EE 码拜 6年前 (2015-04-18) 742次浏览 0个评论

服务端是用java写的,在接收到客户端传递的参数后,对数据进行封装,然后进行验证数据有效性。 
 比方第一人调用接口,第二人也调用接口,第二人的数据可能把第一人的数据给覆盖掉。 

WebService线程问题
求大神解决问题
WebService线程问题
10分
封装出来的这个对象只要不是全局属性,就不会有覆盖的问题呀。 你把service的实现类发出来看看
WebService线程问题
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;
	}

}
WebService线程问题
客户端调用的时候使用的是多线程并发,然后就会发生返回值都是同一个的问题,也就是service中发生了覆盖
WebService线程问题
5分
spring都单例哦,单例你还搞成员变量,那完全是你自己的问题…
WebService线程问题
引用 5 楼 maradona1984 的回复:

spring都单例哦,单例你还搞成员变量,那完全是你自己的问题…

应该怎么搞

WebService线程问题
5分
引用 4 楼 lvjianyu2007 的回复:

客户端调用的时候使用的是多线程并发,然后就会发生返回值都是同一个的问题,也就是service中发生了覆盖

返回值相同只能说明run方法返回了相同的结果,可能是方法内部处理导致。比如参数没有接收到或者engine.execute(taskId); 发生了异常可能导致结果完全是一样的。 你这里不存在覆盖的问题。

还有客户端如果处理不当也会出现结果返回结果错误的问题哦

WebService线程问题
引用 7 楼 whos2002110 的回复:
Quote: 引用 4 楼 lvjianyu2007 的回复:

客户端调用的时候使用的是多线程并发,然后就会发生返回值都是同一个的问题,也就是service中发生了覆盖

返回值相同只能说明run方法返回了相同的结果,可能是方法内部处理导致。比如参数没有接收到或者engine.execute(taskId); 发生了异常可能导致结果完全是一样的。 你这里不存在覆盖的问题。

还有客户端如果处理不当也会出现结果返回结果错误的问题哦

那我输出EngineImpl中run方法的hashcode()结果两次调用是同一个,怎么处理

WebService线程问题
20分
引用 8 楼 lvjianyu2007 的回复:
Quote: 引用 7 楼 whos2002110 的回复:
Quote: 引用 4 楼 lvjianyu2007 的回复:

客户端调用的时候使用的是多线程并发,然后就会发生返回值都是同一个的问题,也就是service中发生了覆盖

返回值相同只能说明run方法返回了相同的结果,可能是方法内部处理导致。比如参数没有接收到或者engine.execute(taskId); 发生了异常可能导致结果完全是一样的。 你这里不存在覆盖的问题。

还有客户端如果处理不当也会出现结果返回结果错误的问题哦

那我输出EngineImpl中run方法的hashcode()结果两次调用是同一个,怎么处理

this.hashcode()打印是EngineImpl实例的hush值, 你的这个对象只有一个,结果是肯定是形同的,再说这跟你的问题完全不相干

WebService线程问题
谢谢,我已经解决了,把成员变量换成了局部变量

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明WebService线程问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!