上次写的服务器保存通话记录 存在两个action请求造成的数据重复上传错误
新写的接口规范如下:
6 保存用户拨打记录接口
6.1 调用地址:
http://localhost/c/invok/saverecord?driverid=1&userkey=2&telephone=455&lat=3990555&lon=11621225&coopid=10000&time=0&createtime=2012-09-19 16:56:27&distime=100
6.2 参数说明:
driverid:司机id 如:1 则driverid=1
userkey:用户标识符 如:2 则userkey=2
telephone: 用户的电话 如1234568798 则telephone=1234568798
lat : 用户所在纬度*100000,如:用户所在纬度为 39.90555 则lat=3990555
lon: 用户所在经度*100000,如:用户所在经度为 11.621225则lat=11621225
coopid 所属平台 如:所属平台为 10000 则coopid=10000从司机的属性coopId得到
time:呼叫时长 拨打电话的时长
createtime创建时间如:2012-09-19 16:56:27 时间类型(yyyy-MM-dd HH:mm:ss)错误可能造成上传数据的创建时间为空
distime=100 上次记录到这次上传的时间间隔用于计算正确的上传时间(解决由于手机时间错误可能造成时间上传时间不正确)
6.3 返回结果
我的代驾列表的JSONObject
示例代码:
{"code":0,"msg":"添加记录失败"}
{"id":22,"code":1,"msg":"添加记录成功"}
逻辑如下
-- 点击通话按钮 第一次通话A 首先保存数据到本地 然后开始上传无time,distime参数 或者time,distime为空 保存服务记录
----A1 如果服务器正确响应 说明数据正常保存 (code=1) 删除本地记录
---A2 如果服务器没有正确响应 code=2不做处理
--通话结束 监听程序进行第二次数据上传B 首先保存数据到本地 然后开始上传time大于0 (通话时间大于0)参数
----B1 如果服务器正确响应 说明数据正常保存 (code=1) 删除本地记录
---B2 如果服务器没有正确响应 code=2不做处理
--程序返回android页面 调用onresum 方法 触发本地记录上传C 此时有distime(手机时间间隔)
----C1 如果服务器正确响应 说明数据正常保存 (code=1) 删除本地记录
---C2 如果服务器没有正确响应 code=2不做处理
服务器端先查询有无记录 再更据没有记录添加数据
逻辑上没有错误 但由于服务器返回数据较慢
错误重现:
public class DjbCallSave {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
final String createtime="2012-09-28 17:35:39";
new Thread(new Runnable() {
@Override
public void run() {
// String r=HttpUtil.get
//("http://localhost/c/invok/saverecord?//driverid=2102&userkey=+8618611126726
//&telephone=1234&lon=11621420&lat=3990393&coopid=1000&time=0&createtime=2012-09-28%2011:17:52",null, "UTF-8");
// System.out.println(r);
// TODO Auto-generated method stub
DriverInfoLogic logic = new DriverInfoLogic();
HashMap map=new HashMap();
String userkey="A100001355683E";
String key=createtime+userkey;
map = logic.saveservice(2507l, userkey, 1l, 1l, 10086,
1000l, 0l,createtime,10);
System.out.println("1:"+map);
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
DriverInfoLogic logic3 = new DriverInfoLogic();
HashMap map=new HashMap();
String userkey="A100001355683E";
String key=createtime+userkey;
map = logic3.saveservice(2507l, userkey, 1l, 1l, 10086,
1000l, 0l,createtime,10);
System.out.println("2:"+map);
}
}).start();
}}
压力测试(保存通话记录 上一篇中的服务器代码) 结果同一条数据保存了两次
尝试 同步锁 由于数据访问量大 故不能等待上一次记录 然后进行下一次记录
此时逻辑已经理清楚 等待服务端代码修改 具体解决方法我会在下一篇中说明