appliction-frame.xml配置
com.shareinfo.commons.thread.multiple.MultipleCheckOnlineUser
com.shareinfo.commons.thread.multiple.MultipleInitProperties
com.shareinfo.commons.thread.multiple.MultipleLogOperation
com.shareinfo.commons.thread.multiple.MultipleLogUserLogin
com.shareinfo.commons.thread.multiple.MultipleCheckFixedScanOverdue
后台主线程,用于启动其他线程,这里使用Spring的InitializingBean的afterPropertiesSet()方法来初始化后台主线程,即web容器启动,取初始启动后台主线程
// 后台主线程,用于启动其他线程
@Log4j
public class AppThreadStart implements InitializingBean
{
// 可在多台服务器上同时运行的后台线程
@Setter
private List multipleThreadObjects;
// 只能在单台服务器上运行的后台线程
@Setter
private List singleThreadObjects;
// 只能在单台服务器上运行的后台线程,在IP地址为这个的服务器上运行
@Setter
private String singleIpAddress;
public void afterPropertiesSet() throws Exception
{
if (CollectionUtils.isNotEmpty(multipleThreadObjects))
{
Iterator iterator = multipleThreadObjects.iterator();
while (iterator.hasNext())
{
Object object = iterator.next();
start(object);
}
}
String localHostAddress = NetworkUtils.localHostAddress();
StringBuffer message = new StringBuffer();
message.append("LocalHostAddress: " + localHostAddress);
message.append(", SingleMachineIpAddress: " + singleIpAddress);
log.info(message.toString());
if (!StringUtils.equals(localHostAddress, singleIpAddress))
return;
if (CollectionUtils.isNotEmpty(singleThreadObjects))
{
Iterator iterator = singleThreadObjects.iterator();
while (iterator.hasNext())
{
Object object = iterator.next();
start(object);
}
}
}
private void start(Object object)
{
if (object == null)
return;
if (!(object instanceof String))
return;
String clazzName = (String)object;
if (StringUtils.isEmpty(clazzName))
return;
try
{
Object thread = Class.forName(clazzName).newInstance();
if (!(thread instanceof Runnable))
return;
new Thread((Runnable)thread).start();
log.info("Thread [" + clazzName + "] is starting...");
}
catch (ClassNotFoundException e)
{
log.warn(clazzName + " isn't fund !!");
}
catch (InstantiationException e)
{
log.warn("InstantiationException: [" + clazzName + "] " + e.getMessage());
}
catch (IllegalAccessException e)
{
log.warn("IllegalAccessException: [" + clazzName + "] " + e.getMessage());
}
catch (Exception e)
{
log.warn("Exception: [" + clazzName + "] " + e.getMessage());
}
}
}
/**
* 定时检查逾期定时器是否执行成功
* @ClassName: MultipleCheckFixedScanOverdue
* @Description: TODO
* @author xiaoqun.yi [email protected]
* @date 2015-9-1 下午02:36:37
* @version V1.0
*/
public class MultipleCheckFixedScanOverdue extends AbstractThread {
private ITaskExecutionService taskExecutionService;
private ISequenceService sequenceService;
private NoticeTempToolProxy noticeTempToolProxy;
public void run() {
while (isNullServiceBean()) {
try {
if (taskExecutionService == null)
taskExecutionService = (ITaskExecutionService) SpringUtils.getBean("taskExecutionService");
if (sequenceService == null)
sequenceService = (ISequenceService) SpringUtils.getBean("sequenceService");
if (noticeTempToolProxy == null)
noticeTempToolProxy = (NoticeTempToolProxy) SpringUtils.getBean("noticeTempToolProxy");
} catch (Exception e) {
e.printStackTrace();
} finally {
sleepSeconds(10);
}
}
while (true) {
try {
TaskExecutionQuery taskExecutionQuery= new TaskExecutionQuery();
taskExecutionQuery.setTaskType(TaskExecution.TaskType.overdueScan);
taskExecutionQuery.setStatus("SUCCESS");
taskExecutionQuery.setSmsFlag("N");
taskExecutionQuery.setEmailFlag("N");
Calendar cal=Calendar.getInstance();
int hour=cal.get(Calendar.HOUR_OF_DAY);
/**每天凌晨1点以后开始检查逾期定时器是否执行成功*/
if(hour>=1){
boolean overdueScanFlag=taskExecutionService.isExecutedDayTask(taskExecutionQuery);
if(!overdueScanFlag){
/**任务类型为逾期扫描检查*/
taskExecutionQuery.setTaskType(TaskExecution.TaskType.overdueScanCheck);
/**判断当天是否已经发送短信或者邮件*/
taskExecutionQuery.setSmsFlag("Y");
taskExecutionQuery.setEmailFlag("N");
boolean smsFlag=taskExecutionService.isExecutedDayTask(taskExecutionQuery);
taskExecutionQuery.setSmsFlag("N");
taskExecutionQuery.setEmailFlag("Y");
boolean emailFlag= taskExecutionService.isExecutedDayTask(taskExecutionQuery);
/**如果没有发送短信或邮件*/
if(!smsFlag||!emailFlag){
TaskExecution taskExecution=new TaskExecution();
taskExecution.setTaskType(TaskExecution.TaskType.overdueScanCheck);
taskExecution.setTaskName("逾期定时扫描检查执行情况");
taskExecution.setInsertBy("sys");//系统
if(!smsFlag){
/**发送短信*/
Map param=new HashMap();
Map result=new HashMap();
param.put("mobile", "18684894397");
param.put("smsContent", "当天逾期定时器未成功执行,请手动执行并检查原因.");
result=noticeTempToolProxy.sendSms(param);
if(null!=result){
Map statusResult=(Map) result.get("data");
if(null!=statusResult&&statusResult.get("status").toString().equals("1")){
taskExecution.setId(sequenceService.nextval(Sequence.SEQ_TASK_EXECUTION));
taskExecution.setStatus("SUCCESS");
taskExecution.setSmsFlag("Y");
taskExecution.setEmailFlag("N");
taskExecutionService.insert(taskExecution);
}
}
}
if(!emailFlag){
/**发送邮件*/
Map param=new HashMap();
Map result=new HashMap();
param.put("email", "[email protected]");
param.put("emailContent", "当天逾期定时器未成功执行,请手动执行并检查原因.");
result=noticeTempToolProxy.sendEmail(param);
if(null!=result){
Map statusResult=(Map) result.get("data");
if(null!=statusResult&&statusResult.get("status").toString().equals("1")){
taskExecution.setId(sequenceService.nextval(Sequence.SEQ_TASK_EXECUTION));
taskExecution.setStatus("SUCCESS");
taskExecution.setSmsFlag("N");
taskExecution.setEmailFlag("Y");
taskExecutionService.insert(taskExecution);
}
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
sleepMinuts(10);
}
}
}
/**
* 检查Service Bean是否加载完毕
*/
public boolean isNullServiceBean() {
if (taskExecutionService == null)
return true;
if (sequenceService == null)
return true;
if (noticeTempToolProxy == null)
return true;
return false;
}
}
public class SingleEmailClient extends AbstractThread
{
private ILogEmailService logEmailService = null;
public void run()
{
while (isNullServiceBean())
{
try
{
if (logEmailService == null)
logEmailService = (ILogEmailService)SpringUtils.getBean("logEmailService");
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
sleepSeconds(10);
}
}
// 查询短信列表中的进行发送
while (true)
{
try
{
send();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
sleepMinuts(1);
}
}
}
/**
* 检查Service Bean是否加载完毕
*/
public boolean isNullServiceBean()
{
if (logEmailService == null)
return true;
return false;
}
/**
* 检查待发送的邮件,并发送
*/
private void send()
{
LogEmailQuery query = new LogEmailQuery();
query.setExpectSendTimeTo(DateUtils.currentTime("yyyy-MM-dd HH:mm:ss"));
List emailList = logEmailService.selectList(query, new Page(1, 200));
if (CollectionUtils.isEmpty(emailList))
return;
List successIdList = new ArrayList();
List failIdList = new ArrayList();
for (LogEmail email : emailList)
{
if (NumberUtils.defaultInt(email.getSendTimes(), 0) >= 3)
{
List list = Arrays.asList(new String[] { String.valueOf(email.getId()) });
logEmailService.insertHis(list, IConstants.FAIL);
continue;
}
String to = email.getMailTo();
String subject = email.getSubject();
String message = email.getMessage();
String smtp = email.getSmtp();
String user = email.getAuthUser();
String password = email.getAuthPassword();
String nick = email.getNick();
String from = email.getMailFrom();
EmailService emailService = new EmailService(smtp, user, password, nick, from, to);
boolean isSuccess = emailService.send(subject, message);
if (isSuccess)
successIdList.add(String.valueOf(email.getId()));
else
failIdList.add(String.valueOf(email.getId()));
}
if (CollectionUtils.isNotEmpty(successIdList))
logEmailService.insertHis(successIdList, IConstants.SUCCESS);
if (CollectionUtils.isNotEmpty(failIdList))
logEmailService.updateList(failIdList, IConstants.FAIL);
}
}