/**
* @ Project : p2pt notify
* @ File Name : NotifySender.java
* @ Date : 2014/8/20
* @ Author : harry.zhang
*
*/
package com.hehenian.biz.service.notify.impl;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import com.hehenian.biz.common.exception.BusinessException;
import com.hehenian.biz.common.notify.INotifyService;
import com.hehenian.biz.common.notify.SMSConfig;
import com.hehenian.biz.common.notify.dataobject.NotifyDo;
import com.hehenian.biz.common.notify.dataobject.NotifyManagerDo;
import com.hehenian.biz.common.util.DateUtil;
import com.hehenian.biz.common.util.JsonUtil;
import com.hehenian.biz.common.util.StringUtil;
import com.hehenian.biz.component.notify.INotifyComponent;
import com.hehenian.biz.component.notify.manager.INotifyManagerComponent;
/**
* 发送器
*
* @author zhangyunhmf
*
*/
public class NotifyServiceImpl implements INotifyService {
protected static final Logger logger = Logger.getLogger(INotifyService.class);
/**
* 短信管理操作类
*/
private INotifyManagerComponent notifyManager;
/**
* 短信类型做key: MAIL, SMS, 短信类型对应的component做value
*/
private Map<String, INotifyComponent> notifyComponentMap;
/**
* 短信类型做key: MAIL, SMS, 短信类型对应的发生器做value
* 通知发送器:mail实现或者短信实现
*/
private Map<String,INotifyService> senderMap;
/**
*
*/
@Autowired
private SMSConfig smsConfig;
//getter and setter
public void setNotifyManager(INotifyManagerComponent notifyManager) {
this.notifyManager = notifyManager;
}
public void setNotifyComponentMap(
Map<String, INotifyComponent> notifyComponentMap) {
this.notifyComponentMap = notifyComponentMap;
}
public void setSenderMap(Map<String, INotifyService> senderMap) {
this.senderMap = senderMap;
}
//end getter and setter
/**
* 定时发送方法入口
* @param notifyDo
* @return
*/
public boolean scheduleSend(NotifyDo notifyDo){
return send(notifyDo);
}
/**
* 发送消息
* @param msg
* @return
*/
public boolean send(NotifyDo notifyDo) {
boolean isOk = false;
NotifyManagerDo notifyManagerDo = notifyManager.listNotifyManagerByNotifyType(notifyDo.getMessageType());
if(null == notifyManagerDo){
logger.error("没有正确配置消息发送,请检查 notifyManager的数据");
return false;
}
if(! notifyManagerDo.isSend()){//开关控制不发送
logger.warn("消息配置成不发送,请检查 notifyManager的数据");
logger(notifyDo);
return true;
}
if("T".equals(notifyDo.getSendFlag())){ //已经发送
logger.error("消息发送状态是已发送了,不需要重复发送");
return false;
}
int redo = notifyManagerDo.getReDo();
/**
* 默认为一次
*/
if(redo == 0 ){
redo = 1;
}
INotifyService notifyService = senderMap.get(notifyDo.getMessageType());
for(int i = 0 ; i < redo ; i++){//重做次数
// 发送成功
isOk = notifyService.send(notifyDo);
logger.debug("====================================call send sms result:" + isOk);
if (isOk) { // 成功退出
break;
}
}
if (isOk) {
notifyDo.setSendFlag("T");
}else if(notifyDo.isFailConvertSchedule()){
notifyDo.setSendFlag("F");
}
try{
logger(notifyDo);
}catch(Throwable t){
logger.error("保持消息失败:");
logger.error(t);
return false;
}
return false;
}
/**
*
* 如果是定时任务发送需要更新发送成功状态
* @param notifyDo
*/
private void logger(NotifyDo notifyDo){
INotifyComponent notifyComponent = notifyComponentMap.get(notifyDo.getMessageType());
if(notifyDo.getMessageId() != 0){
NotifyDo tempNotify = notifyComponent.getMessageById(notifyDo.getMessageId());
if(null != tempNotify){
notifyComponent.updateMessageFlag("T", notifyDo.getMessageId());
}else{
notifyComponent.addMessage(notifyDo);
}
}else{
notifyComponent.addMessage(notifyDo);
}
}
/*
* (no-Javadoc) <p>Title: checkIdentifyCode</p> <p>Description: </p>
*
* @param mobile
*
* @param identifyCode
*
* @return
*
* @see
* com.hehenian.biz.common.notify.INotifyService#checkIdentifyCode(java.
* lang.String, java.lang.String)
*/
@Override
public boolean checkIdentifyCode(String mobile, String identifyCode) {
NotifyManagerDo notifyManagerDo = notifyManager.listNotifyManagerByNotifyType(NotifyDo.SMS);
if (null == notifyManagerDo) {
logger.error("没有正确配置消息发送,请检查 notifyManager的数据");
return false;
}
if (!notifyManagerDo.isSend()) {// 开关控制不发送
logger.warn("消息配置成不发送,请检查 notifyManager的数据");
return true;
}
INotifyComponent smsComponent = notifyComponentMap.get("SMS");
if (null == smsComponent) {
throw new BusinessException("没配置 SMSComponent");
}
List<NotifyDo> notifyList = smsComponent.getLastIdentifyCode(mobile);
if (null == notifyList) {
return false;
}
for (NotifyDo notify : notifyList) {
Map<String, String> msgMap = (Map) JsonUtil.json2Bean(notify.getMessage(), Map.class);
if (identifyCode.equals(msgMap.get("content")) && "T".equals(notify.getSendFlag())
&& "T".equals(notify.getValidate())) {
Date now = new Date();
long ss = DateUtil.diffDate(notify.getUpdateTime(), now);
notify.setValidate("F");
smsComponent.updateMessage(notify);
if (ss < StringUtil.strToInt(smsConfig.getSmsValidateTime()) * 60) {// 30分钟*60秒
return true;
}
}
}
return false;
}
/**
* @param smsConfig
* the smsConfig to set
*/
public void setSmsConfig(SMSConfig smsConfig) {
this.smsConfig = smsConfig;
}
}