package com.jianwu.task;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Strings;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.jianwu.dao.SmsHttpInfoDao;
import com.jianwu.domain.SmsHttpInfo;
import com.jianwu.domain.SmsPre;
import com.jianwu.domain.SubmitReq;
import com.jianwu.manager.SmsMtManager;
import com.jianwu.manager.SmsPreManager;
import com.jianwu.service.result.SmsResult;
import com.jianwu.sms.dto.SendStatus;
import com.jianwu.util.Md5Utils;
import com.nodewind.member.sso.common.HttpUtils;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* Created by tookbra on 2016/7/27.
*/
@Component
@EnableScheduling
public class SmsTask {
@Autowired
private SmsPreManager smsPreManager;
@Autowired
private SmsMtManager smsMtManager;
@Autowired
private SmsHttpInfoDao smsHttpInfoDao;
private static final ExecutorService bizThreadPool = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat("smsBiz-%s").build()); private static final Logger logger = LoggerFactory.getLogger(SmsTask.class); // @PostConstruct
// public void sendSms() {
// bizThreadPool.submit(new Runnable() {
// @Override
// public void run() {
// while (true) {
// try {
// SmsPre smsPre = Constant.smsQueue.take();
// sendSms(smsPre);
// } catch (Exception e) {
// logger.error("发送号码异常:", e);
// e.printStackTrace();
// }
// }
// }
// });
// } //@Scheduled(cron = "0 0/1 * * * ?")
@Scheduled(fixedDelay = 1000*60*1)
void doTimeTask() {
logger.debug("定时短信扫描");
List<SmsPre> smsPreList = smsPreManager.findDestineSms();
if (!CollectionUtils.isEmpty(smsPreList)) {
logger.debug("当前定时短信"+smsPreList.size()+"条");
for (SmsPre smsPre : smsPreList) {
sendSms(smsPre);
}
} else {
logger.debug("当前没有定时短信");
}
} public SmsResult sendSms(SmsPre smsPre) {
SmsResult smsResult = new SmsResult();
List<String> phones = smsMtManager.getPhonesByPreId(smsPre.getPreId());
if (phones.isEmpty()) {
smsResult.setSuccess(false);
smsResult.setMsgGroup("");
smsResult.setRspcod("");
return smsResult;
}
logger.info("---smsPre.getCompanyId()---:" + smsPre.getCompanyId());
SmsHttpInfo smsHttpInfo = smsHttpInfoDao.findByCompanyId(smsPre.getCompanyId());
if (smsHttpInfo == null) {
return null;
}
logger.info("---smsHttpInfo---:" + smsHttpInfo.toString());
//发送下行短信请求
HttpUtils client = HttpUtils.getInstance();
SubmitReq submitReq = new SubmitReq();
submitReq.setEcName(smsHttpInfo.getEcName());
submitReq.setApId(smsHttpInfo.getApId());
submitReq.setSecretKey(smsHttpInfo.getSecretKey());
if (!Strings.isNullOrEmpty(smsPre.getSign())) {
submitReq.setContent(smsPre.getSmsContent().concat(smsPre.getSign()));
} else {
submitReq.setContent(smsPre.getSmsContent());
}
submitReq.setMobiles(StringUtils.join(phones, ","));
logger.info("---submitReq.getMobiles()---" + submitReq.getMobiles());
submitReq.setAddSerial(smsHttpInfo.getAddSerial());
submitReq.setSign(smsHttpInfo.getSign());
//以下stringBuffer顺序不能打乱
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(submitReq.getEcName());
stringBuffer.append(submitReq.getApId());
stringBuffer.append(submitReq.getSecretKey());
stringBuffer.append(submitReq.getMobiles());
stringBuffer.append(submitReq.getContent());
stringBuffer.append(submitReq.getSign());
stringBuffer.append(submitReq.getAddSerial());
submitReq.setMac(Md5Utils.digest(stringBuffer.toString()));
String reqText = JSON.toJSONString(submitReq);
logger.info("---reqText---:" + reqText);
//加密
String encode = Base64.encodeBase64String(reqText.getBytes());
logger.info("---encode---:" + encode);
String msg = client.sendHttpPost(smsHttpInfo.getSmsUrl(), encode, "application/json");
logger.info("---msg---:" + msg);
JSONObject json = JSON.parseObject(msg);
if (json.containsKey("rspcod")) {
smsResult.setRspcod(json.getString("rspcod"));
}
if (json.containsKey("msgGroup")) {
smsResult.setMsgGroup(json.getString("msgGroup"));
}
if (json.containsKey("success")) {
smsResult.setSuccess(json.getBoolean("success"));
}
logger.info(smsResult.getRspcod() + "," + smsResult.getMsgGroup() + "," + smsResult.isSuccess());
smsPre.setProcessResult(SendStatus.SENT.getValue());
smsPreManager.update(smsPre);
return smsResult;
}
} 、、、、、、、、、、、、、、、、、、、、、、、、、
package com.jianwu.sms.task;

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.jianwu.sms.codec.cmpp.msg.sp.CmppSubmitRequestMessage;
import com.jianwu.sms.common.Constant;
import com.jianwu.sms.handler.SubmitMsgHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import javax.annotation.PostConstruct;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger; /**
* Created by tookbra on 2016/7/27.
*/
@Component
public class SmsTask extends Task {
private static final ExecutorService bizThreadPool = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat("smsBiz-%s").build()); private static final Logger logger = LoggerFactory.getLogger(SmsTask.class); static SpeedControl control = new SpeedControl(); @PostConstruct
public void sendSms() {
bizThreadPool.submit(new Runnable() {
@Override
public void run() {
while (true) {
try {
List<CmppSubmitRequestMessage> sendList = Constant.smsQueue.take();
for (CmppSubmitRequestMessage cmppSubmitRequestMessage : sendList) {
logger.info("发送号码:{}", cmppSubmitRequestMessage.getDestterminalId()[0]);
submitMsgHandler.sendSms(cmppSubmitRequestMessage);
control.control(cmppSubmitRequestMessage.getMsgContent());
}
control.clear();
} catch (Exception e) {
logger.error("发送号码异常:", e);
e.printStackTrace();
}
}
}
});
}
}

java注解类定时器的更多相关文章

  1. Java 工具类 —— 定时器(Timer/TimerTask)

    import java.util.Timer; import java.util.TimerTask; public class Timer { .... public void schedule(T ...

  2. 认识下java注解的实现原理

    1,什么是注解 注解也叫元数据,例如常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包.类.接口.字段.方法参数.局部变量等进行注 ...

  3. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  4. Java 注释类之常用元注解

    Java 注释类之常用元注解 自定义Java注释类时,我们使用方式如下:   @Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD ...

  5. Java中自定义注解类,并加以运用

    在Java框架中,经常会使用注解,而且还可以省很多事,来了解下自定义注解. 注解是一种能被添加到java代码中的元数据,类.方法.变量.参数和包都可以用注解来修饰.注解对于它所修饰的代码并没有直接的影 ...

  6. Java注解

    Java注解其实是代码里的特殊标记,使用其他工具可以对其进行处理.注解是一种元数据,起到了描述.配置的作用,生成文档,所有的注解都隐式地扩展自java.lang.annotation.Annotati ...

  7. 19.Java 注解

    19.Java注解 1.Java内置注解----注解代码 @Deprecated                                    //不推荐使用的过时方法 @Deprecated ...

  8. Java注解入门

    注解的分类   按运行机制分:   源码注解:只在源码中存在,编译后不存在 编译时注解:源码和编译后的class文件都存在(如@Override,@Deprecated,@SuppressWarnin ...

  9. java注解(Annotation)解析

    注解(Annotation)在java中应用非常广泛.它既能帮助我们在编码中减少错误,(比如最常见的Override注解),还可以帮助我们减少各种xml文件的配置,比如定义AOP切面用@AspectJ ...

随机推荐

  1. 比较R语言、perl语言,matlab中for循环和while循环的使用

    http://zhan.renren.com/zxccshkbx?gid=3602888498030523562&from=post&checked=true

  2. Asp.Net MVC项目通过Git同步到新开发设备上后无法作为网站启动

    右键项目名->属性->启动项目->单启动项目,在下拉框中选择你的网站主项目就可以了.(由于用的英文版,所以翻译的内容可能略有差异)

  3. HIVE的transform函数的使用

    Hive的TRANSFORM关键字提供了在SQL中调用自写脚本的功能,适合实现Hive中没有的功能又不想写UDF的情况.例如,按日期统计每天出现的uid数,通常用如下的SQL SELECT date, ...

  4. redis安装和配置(一)

    Redis 的官方下载站是http://redis.io/download 怎么安装 Redis 数据库呢?下面将介绍Linux 版本的安装方法 步骤一: 下载Redis 下载安装包:wget htt ...

  5. MVVMLight

    MVVMLight源码分析之消息机制和ViewModelBase http://www.cnblogs.com/facingwaller/archive/2010/11/06/1870608.html ...

  6. 服务容器——laravel服务器容器(未完)

    参考: https://www.insp.top/learn-laravel-container https://www.cnblogs.com/lilili/p/6953749.html

  7. NGUI的一个bug记录

    在当前帧内触发按钮事件,然后把click事件的list删去,再添加,这时候会再次触发. 不确定,先记一下

  8. JS高程3:Ajax与Comet-进度事件、跨源资源共享

    有以下 6 个进度事件  loadstart:在接收到响应数据的第一个字节时触发.  progress:在接收响应期间持续不断地触发.  error:在请求发生错误时触发.  abort:在因 ...

  9. 李洪强和你一起学习前端之(7)定位盒子 css可见性 滑动门案例

    今天是2017年3月23日 1 复习昨天知识 1.1浮动 Float:left | right 特点: ->浮动的元素不占位置(脱标) ->可以将行内元素转化为行内块元素 ->块级元 ...

  10. Oracle之标示符无效

    一.引言 今天使用Oracle客户端执行一条sql语句 order by colname3 结果一直提示标示符无效,以为是自己把列名写错了打开表的列,一个字母一个字母的比对,还是没有错 二.原因及解决 ...