多线程数据同步

在多线程同步的时候,把数据从一个表同步到另外一个表,这个时候考虑多久同步一次,还要考虑多同步的性能问题,在这里由于同步的数据比较复杂,这里没隔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);
}

}*/
}
具体的每个方法实现在这里就不展示了,这个代码还需要再优化一下,消耗的内存比较多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值