1、spring boot之定时器任务
@Component
public class JobScheduler {
protected final static Logger logger = LoggerFactory.getLogger(JobScheduler.class);
@Autowired
private IResponsionService responsionService;
//每天凌晨两点执行
@Scheduled(cron = "0 0 2 * * ?")
//@Scheduled(cron="0/10 * * * * ? ")//每10秒执行一次
public void checkUserLoginStatus() {
logger.info("定时任务开始......");
long begin = System.currentTimeMillis();
try{
int falg = responsionService.updateCloseJobOrder();
}catch (Exception e){
logger.error(e.getMessage());
}
long end = System.currentTimeMillis();
logger.info("定时任务结束,共耗时:[" + (end-begin) / 1000 + "]秒");
}
}
2、OKHttp请求接口数据
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
formBody.add("username","zhangsan");//传递键值对参数
Request request = new Request.Builder()//创建Request 对象。
.url("http://www.baidu.com")
.post(formBody.build())//传递请求体
.build();
try{
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
String msg = response.body().string();
System.out.println(msg);
} else {
System.out.println("连接服务器失败返回错误代码" + response.code());
}
}catch(Exception e){
}
在调用外部接口获取数据的时候,用于接受数据的参数类型(dto的属性)最好简单一点,简单不易出错的类型一般有:Long,Integer,String等,一些“偏僻”的类型例如Byte,BigDecimal,LocalDateTime,Date等必要的时候(如果不是经常参与运算,只是用来数据的展示等)用String类接收,这样能避免通过Json对象转Java对象的时候出现问题。
下面写一下Json字符串转java对象:
String msg = response.body().string(); //msg是符合json格式的字符串
ReciveResultDTO resultDTO=JSON.parseObject(msg,ReciveResultDTO.class);
注意:这里用的JSON是阿里巴巴的 com.alibaba.fastjson.JSON
maven引入fastjson的配置:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.32</version>
</dependency>
3、数据源的使用
数据源的切换:
//用法1:
//使用@DataSource注解在方法级别切换数据源(推荐)
@DataSource(DataSourceNames.WDS_INFO)
public int getCountUnReadBycid(MessageInfoDTO messageInfoDTO){
return messageDAO.getCountByUnread(messageInfoDTO);
}
//@DataSource配置的数据源有效范围在本方法内, 就是本方法内无论调用多少次DAO查询都会使用该数据源.
//@DataSource注解只能加在Service方法上, 加在DAO上是无效的.
//在Service方法内调用本实例的其他方法, 将导致其他方法的@DataSource配置失效. 例如:
@DataSource(DataSourceNames.WDS_INFO)
public void method1(MessageInfoDTO messageInfoDTO){
//此处使用数据源WDS_INFO
messageDAO.getCountByUnread(messageInfoDTO);
//调用method2不会使用数据源RDS_COMMON
method2();
}
@DataSource(DataSourceNames.RDS_COMMON)
public void method2(){
readDAO.readSomething();
}
/**因为在method1方法内部调用method2, 导致AOP失效, @DataSource注解不会被读取, 所以method2执行的时候依然使用WDS_INFO数据源. 这种情况需要用到下面的手动切换数据源.*/
//用法2:
/**手动切换数据源(不推荐)
手动切换数据源需要考虑数据源的作用范围以及回收, 如果使用不慎很容易出现BUG, 所以推荐使用DataSource注解的方式切换数据源*/
try {
DataSourceHolder.putDataSource(DataSourceNames.RDS_COMMON);
//do your work
} finally {
DataSourceHolder.removeDataSource(DataSourceNames.RDS_COMMON);
}
/**调用DataSourceHolder.putDataSource切换到你想设置的数据源
此时可以发起DAO调用, 无论调用多少次, 都会使用你手动设置的数据源.
如果发起对其他Service的调用, 而且Service方法上有@DataSource注解, 则在Service方法范围内会使用该注解配置的数据源, 调用完成会退回成你手动设置的数据源.
手动设置数据源的话, 大部分情况下需要在finally块中删除你设置的数据源, 以免对后面代码的数据源产生影响.*/
4、Mybatis 批量插入数据
Dao:
//批量同步来电通话记录
Integer batchInsertInRecords(List<CallRecordDTO> list);
Xml:
<insert id="batchInsertInRecords">
INSERT INTO t_call_record_tr(
in_id,unique_id,combo_cost,
...
) VALUES
<foreach collection="list" item="item" index="index" separator="," >
<trim prefix="(" suffix=")">
#{item.id},#{item.unique_id},
<choose>
<when test="item.combo_cost != null and item.combo_cost !=''">
#{item.combo_cost},
</when>
<otherwise>
'',
</otherwise>
</choose>
...
</trim>
</foreach>
</insert>