在多线程同步的时候,把数据从一个表同步到另外一个表,这个时候考虑多久同步一次,还要考虑多同步的性能问题,在这里由于同步的数据比较复杂,这里没隔5分钟同步500条数据代码如下:
住线程的代码,根据最后的时间来同步,把时间存放在redis里面
protected Log log = new Log(this.getClass());
private static final String CRM_LAST_SYNC_DATETIME = “CRM:LAST_RUN_TIME_0718”;
boolean init=false;
@Override
public void run() {
if(!init){
safeSleep(15*1000);
init=true;
}
Jedis jedis = JedisFactory.getInstance();
String lastRunTime = null;
while (true){
log.info(“master thread is run…”);
String lastRunTime1 = jedis.get(CRM_LAST_SYNC_DATETIME);
if(lastRunTime1==null || !lastRunTime1.equals(lastRunTime)){
Thread worker=(Thread)SpringContextUtils.getBean(“SyncOrderWorker”);
worker.start();
lastRunTime=lastRunTime1;
}
safeSleep(60*1000);
/* SyncOtherParty party= (SyncOtherParty) SpringContextUtils.getBean("SyncOtherParty");
party.setAppId("100");
party.start();
safeSleep(2*60*1000);
SyncOtherParty education= (SyncOtherParty) SpringContextUtils.getBean("SyncOtherParty");
education.setAppId("101");
education.start();
safeSleep(2*60*1000);*/
}
}
private void safeSleep(long timeout) {
try {
TimeUnit.MILLISECONDS.sleep(timeout);
} catch (InterruptedException e) {
//ignore
}
}
这里用的spring框架管理bean
子线程代码
package com.qsb.task.processer;
import com.fabei.common.redis.JedisFactory;
import com.qsb.dao.*;
import com.qsb.service.SyncContact;
import com.qsb.service.SyncCorp;
import com.qsb.service.SyncOrder;
import com.qsb.service.SyncSubscriber;
import friends.util.json.JSONObject;
import friends.util.log.Log;
import friends.webapp.action.DateTimeUtil;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import java.util.Date;
import java.util.List;
@Component
public class SyncOrderWorker extends Thread {
protected Log log = new Log(this.getClass());
@Autowired
OtherDao otherDao;
@Autowired
SyncOrder syncOrder;
@Autowired
DeptDao deptDao;
@Autowired
SubscriberDao subscriberDao;
@Autowired
SyncCorp syncCorp;
@Autowired
EmpDao empDao;
@Autowired
SyncSubscriber syncSubscriber;
@Autowired
SyncContact syncContact;
private static final String CRM_LAST_SYNC_DATETIME = “CRM:LAST_RUN_TIME_0718”;
@Override
public void run() {
Jedis jedis = JedisFactory.getInstance();
String lastRunTime = jedis.get(CRM_LAST_SYNC_DATETIME);//redis最后一次拿的时间
String lastDataTime = null;//每次同步完的最后一条时间
try {
log.info("begin to sync.....");
//当第一次时间为空时,给一个默认时间
if (StringUtils.isEmpty(lastRunTime)) {
lastRunTime = DateTimeUtil.getFormatDateTime(DateTimeUtil.getDateBeforeOrAfterYear(new Date(), -20));
}
//订单
List<JSONObject> list = otherDao.selectDingMaketBuy(lastRunTime, 0, 500);
if (list == null) {
//如果没有最新的订单,代表最后时间跟每次同步的时间相等
lastRunTime=DateTimeUtil.getFormatDateTime(new Date());
lastDataTime=DateTimeUtil.getFormatDateTime(new Date());
jedis.set(CRM_LAST_SYNC_DATETIME,lastRunTime);
log.info("sync end,total 0 ");
return;
}
for (JSONObject row0 : list) {
JSONObject row=(JSONObject)row0.clone();
lastDataTime = row.optString("crt_time");
//同步订单
syncOrder0(row);
//同步企业
syncCorp(row);
//同步订购
String corp_id = row.optString("buy_corpid");
String suite_key = row.optString("suite_key");
//查询订购人
JSONObject dept = deptDao.getDeptidAndFgsid(corp_id, corp_id);
//查询是否授权
JSONObject token = otherDao.getBycorpIdAndSuiteKeyJcTokenInfo(corp_id, suite_key);
//查询订购的状态,只取第一条
List<JSONObject> bmapp = otherDao.getHtBmappRelByCorpAndSuiteKey(corp_id, suite_key);
//费用
String pay_fee=row.optString("pay_fee");
if (dept != null) {
row.put("emp_id", dept.optString("hzr"));
row.put("emp_name", dept.optString("hzr_name"));
String mobile=dept.optString("dept_mobile");
if (mobile!=null && !"".equals(mobile)){
//插入联系人表
syncContact.saveContact(dept);
}
}
String is_subscriber = "";
String time=row.optString("crt_date");
if ("0".equals(pay_fee)) {
is_subscriber = "0";
} else {
is_subscriber = "1";
}
row.put("isv_call", token != null ? token.optString("isv_call") : "0");
row.put("is_subscriber", is_subscriber);
row.put("is_using", bmapp != null&&bmapp.size()>0 ? bmapp.get(0).optString("state") : "0");//是否启用,state 有4中状态
row.put("using_crt_date", bmapp != null&&bmapp.size()>0 ? bmapp.get(0).optString("upt_date") : "");
JSONObject jsonObject = subscriberDao.selectByPrimaryKey(row.optString("suite_key") + "_" + corp_id);
if (jsonObject != null) {
//如果第一次是试用的,就更新购买的时间
if("0".equals(jsonObject.optString("is_subscriber"))){
row.put("first_buy_time",time);
}
if (jsonObject.optString("service_start_time").compareTo(row.optString("paidtime")) < 0) {
syncSubscriber.update(row);
}
} else {
row.put("first_order_time",time);//第一次订购时间
row.put("first_buy_time",time);//第一次购买时间
syncSubscriber.saveSubscriber(row);
}
boolean flag=syncCorp.updateCorp(corp_id);
if (flag) {
//log.info("update corp success");
} else {
log.error("更新企业订购数和启用数失败"+corp_id);
}
}
jedis.set(CRM_LAST_SYNC_DATETIME, lastDataTime);
log.info("sync end,total " + list.size());
// if(list.size()==100)
// jedis.set(CRM_LAST_SYNC_DATETIME, lastDataTime);
// else
// jedis.set(CRM_LAST_SYNC_DATETIME, DateTimeUtil.getFormatDateTime(new Date()));
} catch (Exception e) {
log.info(e.toString());
} finally {
jedis.set(CRM_LAST_SYNC_DATETIME, lastDataTime);
}
}
private void syncOrder0(JSONObject row) {
String corp_name = otherDao.selectCorpName(row.optString(“buy_corpid”));
if (“”.equals(corp_name)) return;
row.put(“corp_name”, corp_name);
if (syncOrder.saveOrder(row)) {
//log.info(“save order success”);
} else {
log.error(“保存订单信息失败”+row);
return;
}
}
private void syncCorp(JSONObject row) {
String corp_id = row.optString(“buy_corpid”);
JSONObject dept = deptDao.getDeptidAndFgsid(corp_id, corp_id);
int emp_count = empDao.getIsmangerAndFgsid(corp_id);
if (dept != null && !”“.equals(dept.optString(“mc”)) && dept.optString(“mc”) != null && corp_id != null) {
JSONObject object = new JSONObject();
object.put(“corp_id”, dept.optString(“firstid”));
object.put(“corp_name”, dept.optString(“mc”));
object.put(“logo_img”, dept.optString(“logo_img”));
object.put(“ding_certified”, dept.optString(“iscertified”));//企业认证
object.put(“memo”, dept.optString(“memo”));
object.put(“addr”, dept.optString(“dept_addr”));
object.put(“industry”, dept.optString(“industry”));
object.put(“province”, dept.optString(“proID”));
object.put(“city”, dept.optString(“cityID”));
object.put(“county”, dept.optString(“countyID”));
object.put(“manager”, dept.optString(“hzr_name”));
object.put(“mobile”, dept.optString(“dept_mobile”));
object.put(“activated_count”, dept.optString(“activePersonNum”));
object.put(“emp_count”, emp_count);
object.put(“crt_date”,dept.optString(“crt_date”));
object.put(“upt_date”,dept.optString(“upt_date”));
if (syncCorp.saveCorp(object)) {
//log.info(“save corp success”);
} else {
log.error(“保存企业信息失败”+object);
return;
}
}
}
/*private void syncSubscriber(JSONObject row){
JSONObject object= new JSONObject();
String corp_id=row.optString(“buy_corpid”);
String suite_key=row.optString(“suite_key”);
String subscriber_id=suite_key+”_”+corp_id;
JSONObject dept=deptDao.getDeptidAndFgsid(corp_id,corp_id);
JSONObject token=otherDao.getBycorpIdAndSuiteKeyJcTokenInfo(corp_id,suite_key);
JSONObject bmapp=otherDao.getHtBmappRelByCorpAndSuiteKey(corp_id,suite_key);
String item_name=row.optString(“item_name”);
String is_subscriber=”“;
if (item_name.indexOf("试用")>0){
is_subscriber="0";
}else {
is_subscriber="1";
}
if(dept!=null){
object.put("subscriber_id",subscriber_id);
object.put("suite_key",suite_key);
object.put("emp_id",dept.optString("hzr",""));
object.put("emp_name",dept.optString("hzr_name",""));
object.put("isv_call",token!=null?token.optString("isv_call"):"0");
object.put("corp_id",corp_id);
object.put("is_subscriber",is_subscriber);//是否订购
object.put("is_using",bmapp!=null?bmapp.optString("state"):"0");//是否启用
object.put("service_start_time",row.optString("paidtime"));
object.put("service_stop_time",row.optString("service_stop_time"));
subscriberDao.insert(object);
}
}
private void updateSyncSubscriber(JSONObject row){
JSONObject object= new JSONObject();
String corp_id=row.optString(“buy_corpid”);
String suite_key=row.optString(“suite_key”);
String subscriber_id=suite_key+”_”+corp_id;
JSONObject dept=deptDao.getDeptidAndFgsid(corp_id,corp_id);
JSONObject token=otherDao.getBycorpIdAndSuiteKeyJcTokenInfo(corp_id,suite_key);
JSONObject bmapp=otherDao.getHtBmappRelByCorpAndSuiteKey(corp_id,suite_key);
String item_name=row.optString(“item_name”);
String is_subscriber=”“;
if (item_name.indexOf("试用")>0){
is_subscriber="0";
}else {
is_subscriber="1";
}
if(dept!=null){
object.put("subscriber_id",subscriber_id);
object.put("suite_key",suite_key);
object.put("emp_id",dept.optString("hzr",""));
object.put("emp_name",dept.optString("hzr_name",""));
object.put("isv_call",token!=null?token.optString("isv_call"):"0");
object.put("corp_id",corp_id);
object.put("is_subscriber",is_subscriber);//是否订购
object.put("is_using",bmapp!=null?bmapp.optString("state"):"0");//是否启用
object.put("service_start_time",row.optString("paidtime"));
object.put("service_stop_time",row.optString("service_stop_time"));
subscriberDao.updateByPrimaryKey(object);
}
}*/
}
具体的每个方法实现在这里就不展示了,这个代码还需要再优化一下,消耗的内存比较多