@Transactional
@RequestMapping (params="updateZfry")
public void updateZfry(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException,Exception
{
//true成功; false失败;
boolean result = true ;
String errorInfo= "";
PrintWriter out = response.getWriter();
ZfryInfo zfryInfo = new ZfryInfo();
//图层表储存的数据
String phoneId = request.getParameter("PHONEID");
if (StringUtil.isNotEmpty(phoneId))
{
zfryInfo.setDeviceId( URLDecoder.decode(phoneId,"UTF-8") );
}
else
{
result = false ;
errorInfo = "更新执法人员位置失败,手机号不能为空!";
}
try {
Object sm = request.getParameter("SM");
if (result && sm != null && !"[]".equals( sm ))
{
JSONArray x = JSONArray.fromObject( sm );
for (int i = 0;i < x.size(); i++)
{
JSONObject y = (JSONObject)x.get( i );
Object smx = y.get( "SMX" );
Object smy = y.get( "SMY" );
Object nowDate = y.get( "NOWDATE" );
//查看坐标是不是在地图范围内,不在范围内,报错
if (smx != null && smy != null && nowDate != null)
{
if(checkXY(smx,smy))
{
//储存执法人员历史轨迹
marketPlayersDao.insertUserHistoryInfo(phoneId,smx.toString(),smy.toString(),nowDate.toString());
if (i == x.size()-1)
{
zfryInfo.setSmx( smx.toString() );
zfryInfo.setSmy( smy.toString() );
zfryInfo.setNowDate( nowDate.toString() );
zfryInfo.setSysDate( df.format(new Date()) );
}
}
else
{
result = false ;
errorInfo = "更新执法人员位置失败,接收手机位置超出地图范围!";
}
}
else
{
result = false ;
errorInfo = "更新执法人员位置失败,接收手机数据不完整!";
}
}
}
else
{
result = false ;
errorInfo = "更新执法人员位置失败,未接收到手机数据!";
}
if (result)
{
//查询手机当前使用者userid zfryName deviceId type
zfryInfo = marketPlayersDao.selUserInfo(zfryInfo);
if (zfryInfo.getZfryName() == null || "".equals( zfryInfo.getZfryName() ))
{
result = false ;
errorInfo = "更新执法人员位置失败,未查询到设备所属人员!";
}
if (zfryInfo.getType() == null || "".equals( zfryInfo.getType() ))
{
result = false ;
errorInfo = "更新执法人员位置失败,未查询到设备类型!";
}
}
if (result)
{
//initWorkSpace();
//更新执法人员图层数据
if (InitSuperMapService.open)
{
supermapService.updateZfry( InitSuperMapService.m_workspace,zfryInfo );
result = true;
log.info("更新执法人员位置成功.");
}
else
{
log.error("超图服务连接失败");
/*InitSuperMapService initSuperMapService = new InitSuperMapService();
Thread thread1 = new Thread(initSuperMapService);
thread1.start();*/
}
}
Map<String,Object> map = new HashMap<String,Object>();
map.put( "result", result );
map.put( "errorInfo", errorInfo );
JSONObject resultJSON = JSONObject.fromObject(map);
String jsonpCallback = request.getParameter("jsonpCallback"); //客户端请求参数
out.println(jsonpCallback+"("+resultJSON.toString(1,1)+")");//返回jsonp格式数据 //返回jsonp格式数据
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage(), e);
}finally{
if(out!=null){
out.flush();
out.close();
out=null;
}
}
}
public void updateZfry( Workspace m_workspace, ZfryInfo zfryInfo ) throws Exception
{
//先查询这条数据存在
String ids = marketPlayersDao.existUserInfo(zfryInfo.getDeviceId());
myDatasource = m_workspace.getDatasources().get("nanjingmap");
pointDt = (DatasetVector)myDatasource.getDatasets().get("执法人员");
//先删除重复的数据
if (ids != null && ids != "")
{
String[] tempids = ids.split( "," );
for(int i = 0; i < tempids.length; i ++)
{
//给第一条记录更新最新位置---之前这里是直接删除的,删除后下面再次添加导致出错
if(i==0)
{
System.out.println( "更新记录SMID="+tempids[i] );
supermapDaoJdbcImpl.updateZfryWz(tempids[i],zfryInfo);
}
//删除多余的记录
if(i>0)
{
System.out.println( "删除多余记录SMID="+tempids[i] );
supermapDaoJdbcImpl.delDYZfry(tempids[i]);
}
/*recordset = pointDt.query("SmID=" + tempids[i],CursorType.DYNAMIC);
// 锁定当前记录位置
recordset.edit();
// 将当前记录删除
recordset.delete();
recordset.update();*/
}
}
else
{
//添加新的数据
recordset = pointDt.getRecordset(true, CursorType.DYNAMIC);
editor = recordset.getBatch();
editor.setMaxRecordCount(1000);
editor.begin();
GeoPoint point = new GeoPoint(Double.valueOf(zfryInfo.getSmx()),
Double.valueOf(zfryInfo.getSmy()));
Map<String, Object> fieldValues = new HashMap<String, Object>();
fieldValues.put("DEVICE_ID", zfryInfo.getDeviceId());
fieldValues.put("ZFRY_NAME", zfryInfo.getZfryName());
fieldValues.put("UNIT_TYPE", zfryInfo.getType());
fieldValues.put( "UPDATE_DATE", zfryInfo.getNowDate() );
recordset.addNew(point, fieldValues);
editor.update();
point.dispose();
// 关闭记录集,释放几何对象、记录集
recordset.close();
recordset.dispose();
}
时间一长会出现以下错误导致应用崩溃
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x117bee9b, pid=6364, tid=1540
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_22-b03 mixed mode)
# Problematic frame:
# C 0x117bee9b
#
# An error report file with more information is saved as hs_err_pid6364.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
猜想,超图不支持频繁的数据更新,或者是有内存泄露