1、任务代码
package com.cvicse.inforguard.utmp.analysis.engine.timer;
import java.util.Calendar;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.cvicse.inforguard.utmp.analysis.engine.impl.thread.GenuineThread;
import com.cvicse.inforguard.utmp.analysis.storage.asset.service.api.IAssetSrv;
import com.cvicse.inforguard.utmp.analysis.storage.common.DSMark;
import com.cvicse.inforguard.utmp.analysis.storage.dao.api.IBaseDao;
import com.cvicse.inforguard.utmp.analysis.storage.entity.org.CB_Asset;
import com.cvicse.inforguard.utmp.analysis.storage.model.TB_Assets;
import com.cvicse.inforguard.utmp.common.exception.EXP_Base;
/**
*
* 描述:
* <p>
* 定时器进行验证资产操作系统的正版与否
* </p>
* 创建日期:2012-8-14 上午10:49:13<br>
*
* @author:tian_yjing<br>
* @update:$Date: 2012-08-14 16:32:48 +0800 (周二, 2012-08-14) $<br>
* @version:$Revision: 5015 $<br>
* @since 1.0.0
*/
public class TimingGenuineTask extends TimerTask{
/**
* 日志记录
*/
private static final Log LOG = LogFactory.getLog(TimingGenuineTask.class);
/** 间隔时间 20分钟 */
private static final long TIMING_TIME = 1200000;
/**
* Dao对象
*/
private IBaseDao m_baseDao;
private Timer timer = new Timer();
/**
* 资产Service
*/
private IAssetSrv m_assetSrv = null;
/**
* 构造方法
*/
public TimingGenuineTask(IAssetSrv m_assetSrv) {
this.m_assetSrv = m_assetSrv;
this.m_baseDao = this.m_assetSrv.getBaseDao();
}
public void start() {
// 当系统启动时开始执行,每隔24小时执行一次
timer.schedule(this, getRunCalendar().getTime(), TIMING_TIME);
}
@SuppressWarnings("unchecked")
@Override
public void run() {
// 1、得到数据库中存放没有验证的资产列表
StringBuffer sBuffer = new StringBuffer();
sBuffer.append("From ")
.append(DSMark.TB_ASSETS)
.append(" WHERE oid='")
.append( CB_Asset.TYPE_GV)
.append("' AND genuineValidation IS NULL");
List<?> assetList = null;
try {
assetList = m_baseDao.query(sBuffer.toString());
// 2、启动新线程验证资产是否正版
if (assetList != null && assetList.size() > 0) {
for (TB_Assets tbAsset : (List<TB_Assets>)assetList) {
// 启动线程进行验证
new GenuineThread(m_assetSrv, tbAsset).start();
}
}
} catch (EXP_Base e) {
LOG.error("获取操作系统正版序列号验证线程出现异常.");
}
}
/**
* 获得定点时间
* @return
*/
private Calendar getRunCalendar() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,9);
calendar.set(Calendar.MINUTE,0);
calendar.set(Calendar.SECOND,0);
return calendar;
}
}
2、任务启动线程验证代码
package com.cvicse.inforguard.utmp.analysis.engine.impl.thread;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.cvicse.inforguard.utmp.analysis.storage.asset.service.api.IAssetSrv;
import com.cvicse.inforguard.utmp.analysis.storage.common.DSMark;
import com.cvicse.inforguard.utmp.analysis.storage.dao.api.IBaseDao;
import com.cvicse.inforguard.utmp.analysis.storage.entity.org.CB_Asset;
import com.cvicse.inforguard.utmp.analysis.storage.model.TB_Assets;
import com.cvicse.inforguard.utmp.common.exception.EXP_Base;
/**
* 启动定时器验证数据库中资产(操作系统)正版问题
*
* @author tian_yjing
*
*/
public class GenuineThread extends Thread{
/**
* 日志记录
*/
private static final Log LOG = LogFactory.getLog(GenuineThread.class);
/**
* 资产服务
*/
private IAssetSrv m_assetSrv;
/**
* 资产数据模型
*/
private TB_Assets tbAsset;
/**
* 底层数据操作
*/
private IBaseDao m_baseDao;
/**
* 构造方法
* @param assetSrv
* @param tbAsset
*/
public GenuineThread(IAssetSrv assetSrv, TB_Assets tbAsset) {
this.m_assetSrv = assetSrv;
this.m_baseDao = this.m_assetSrv.getBaseDao();
this.tbAsset = tbAsset;
}
@Override
public void run() {
// 根据assetId获取资产的类型,资产代理的IP,端口等,得到的信息封装到CB_Asset对象里面
try {
CB_Asset cb_Asset = m_assetSrv.getAssetInfoById(tbAsset.getId());
String systemSN = this.getRemoteSystemSN(cb_Asset);
String updateSQL = "UPDATE assets t SET t.genuineValidation='是' WHERE t.id='";
if (comparedWithGenuineLib(systemSN)) {
tbAsset.setGenuineValidation("是");
// 更新数据库
m_baseDao.executeDeleteOrUpdateJDBC(updateSQL + tbAsset.getId().trim() + "'");
}
} catch (EXP_Base e) {
LOG.error("资产[" + tbAsset.getId() + "]验证操作系统正版线程出现异常.");
}
}
/**
* 验证从代理端传递过来的SN是否在正版库中
* 存在返回true,不存在返回false
* @param systemSN
* @return
* @throws EXP_Base
*/
private boolean comparedWithGenuineLib (String systemSN) throws EXP_Base {
List<?> genuineList = null;
if (systemSN != null && !"".equals(systemSN)) {
// SN格式:4RFS-SFSA-FBGD-EFRD
String[] systemSNArry = systemSN.split("-");
// 与正版序列号库进行对比
String getSystemInfoHql = "FROM " + DSMark.TB_GENUINEVALIDATION;
for (String str : systemSNArry) {
getSystemInfoHql = getSystemInfoHql + " WHERE sn like '%" + str.trim() + "%'";
// 多个部分序列号(上述例子就是多个)
if (systemSNArry.length > 1) {
getSystemInfoHql = getSystemInfoHql + " or sn like '%" + str.trim() + "%'";
}
}
genuineList = m_baseDao.query(getSystemInfoHql);
}
return genuineList != null ? (genuineList.size() > 0 ? true : false) : false;
}
/**
* 获得远程资产(操作系统)的正版序列号
* @param cb_Asset
* @return
*/
private String getRemoteSystemSN (CB_Asset cb_Asset) {
String remoteSystemSN = null;
try {
List<Map<String, String>>
assetMonitorlist = m_assetSrv.getRemoteProperty(cb_Asset);
cb_Asset.getExtendedMap().clear();
for (Map<String, String> map : assetMonitorlist) {
cb_Asset.getExtendedMap().putAll(map);
}
} catch (EXP_Base e) {
LOG.error("资产[" + cb_Asset.getId() + "]在从代理端取值时出现异常.");
}
remoteSystemSN = cb_Asset.getExtendedMap().get("SN");
return remoteSystemSN;
}
}
3、启动任务
// 定时验证资产的正版与否
TimingGenuineTask timerGenuineTask = new TimingGenuineTask(m_assetSrv);
timerGenuineTask.start();