消息sms 邮箱/手机号/push发送的方案 & 定时任务xxlJob灵活度 & 泛型和发送的模板类设计
消息sms 邮箱/手机号/push发送的方案 & 定时任务xxlJob灵活度 & 泛型和发送的模板类设计
1.消息sms 邮箱/手机号/push发送的方案
1.判断收件人地址是否为空,不为空则发送邮件。为空则不发送。可以通过该方法终止一些消息的发送。
2.收件人的地址可以配置在Apollo中,直接删除该key测试没有生效。需要将该key配置成空字符串。
2.定时任务xxlJob灵活度
xxlJob需要接收外部的参数,来灵活处理调度任务。比如数据表格的邮件发送
需求背景:拉取前一天的数据,生成excel表格,然后通过email发送出来。
@Slf4j
@Component
@JobHandler(value = "sendEmailTask")
public class SendEmailTask extends IJobHandler { @Autowired
@Qualifier("mySendEmailImpl")
private SendBiDataService<MyBiDataEntity> sendBiDataService; //根据实体类类注入也可以。
// @Autowired
// MySendEmailImpl mySendEmailImpl; @Override
public ReturnT<String> execute(String s) throws Exception {
Transaction t = Cat.newTransaction("JOB", "sendEmailTask");
try {
log.info("report start......");
String startTime = "";
String endTime = "";
//获取外部参数,开始时间和结束时间
if(StringUtils.isNotBlank(s)){
startTime = s.split(",")[0];
endTime = s.split(",")[1];
}else{
//获取系统设置时间,前天的开始时间和结束时间
LocalDate today = LocalDate.now();
LocalDate yesterday = today.plusDays(-1);
LocalTime lt1 = LocalTime.of(0,0,1);
LocalTime lt2 = LocalTime.of(23,59,59);
LocalDateTime startLdt = yesterday.atTime(lt1);
LocalDateTime endLdt = yesterday.atTime(lt2);
startTime = LocalDateTimeUtils.formatDateTime(startLdt);
endTime = LocalDateTimeUtils.formatDateTime(endLdt);
}
//业务逻辑 查询数据
List<MyBiDataEntity> list = sendBiDataService.queryBiData(startTime,endTime);
if(CollectionUtils.isEmpty(list)){
log.info("report 数据为空......");
return ReturnT.SUCCESS;
}
//业务逻辑 创建excel
String fileName = sendBiDataService.createBiExcel(list);
log.info("report fileName......" + fileName);
//业务逻辑 发送邮件
boolean flag = sendBiDataService.sendBiExcel(fileName);
log.info("report flag......" + flag);
log.info("report end......");
t.setStatus(Transaction.SUCCESS);
return SUCCESS;
} catch (Exception e) {
log.error("report邮件发送异常:", e);
Cat.logError("report邮件发送异常:", e);
t.setStatus(e);
return FAIL;
} finally {
t.complete();
}
}
} public class LocalDateTimeUtils {
public static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss"; public static String formatDateTime(LocalDateTime dateTime) {
if(dateTime == null) {
return "";
}
return formatDateTime(dateTime, DEFAULT_PATTERN);
}
}
3.泛型和发送的模板类设计
@Service
public interface SendBiDataService<T extends Object> {
List<T> queryBiData(String startTime,String endTime);
String createBiExcel(List<T> list);
boolean sendBiExcel(String fileName);
} @Service
public abstract class SendBiDataCommonService<T> implements SendBiDataService<T> {
private Logger logger = LoggerFactory.getLogger(this.getClass()); @Override
public String createBiExcel(List<T> list) {
//通用公共逻辑实现
}
} @Slf4j
@Service("mySendEmailImpl")
public class MySendEmailImpl extends SendBiDataCommonService<MyBiDataEntity> implements SendBiDataService<MyBiDataEntity> {
private Logger logger = LoggerFactory.getLogger(this.getClass()); @Override
public List<MyBiDataEntity> queryBiData(String startTime, String endTime) {
logger.info("queryBiData startTime=[{}],endTime=[{}]",startTime,endTime);
//具体业务,查询数据 } @Override
public String createBiExcel(List<MyBiDataEntity> list) {
//调用公用的抽象类方法
return super.createBiExcel(list);
} @Override
public boolean sendBiExcel(String fileName) {
//具体业务,发送人,邮件标题等参数,邮件发送实现
}
}
消息sms 邮箱/手机号/push发送的方案 & 定时任务xxlJob灵活度 & 泛型和发送的模板类设计的更多相关文章
- 7个自定义定时任务并发送消息至邮箱或企业微信案例(crontab和at)
前言 更好熟悉掌握at.crontab定时自定义任务用法. 实验at.crontab定时自定义任务运用场景案例. 作业.笔记需要. 定时计划任务相关命令及配置文件简要说明 at 工具 由包 at 提供 ...
- RocketMQ源码详解 | Consumer篇 · 其一:消息的 Pull 和 Push
概述 当消息被存储后,消费者就会将其消费. 这句话简要的概述了一条消息的最总去向,也引出了本文将讨论的问题: 消息什么时候才对被消费者可见? 是在 page cache 中吗?还是在落盘后?还是像 K ...
- iOS 验证邮箱手机号格式
做登录界面时,用户在UITextfield中输入输入邮箱账号后,我们应该在本地验证格式是否正确,再将参数传给服务器验证. 最简单的就是利用系统的NSPredicate //利用正则表达式验证 -(BO ...
- js 正则表达式,匹配邮箱/手机号/用户名
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- asp.net利用QQ邮箱发送邮件,关键在于开启pop并设置授权码为发送密码
public static bool SendEmail(string mailTo, string mailSubject, string mailContent) { ...
- php 常用正则表达 邮箱 手机号啥的
class RegexConst { const REGEX_MOBLIE_86 = '/^1(3|4|5|7|8)\d{9}$/';//中国手机号 const REGEX_MOBLIE_852 = ...
- 个人永久性免费-Excel催化剂功能第85波-灵活便捷的批量发送短信功能(使用腾讯云接口)
微信时代的今天,短信一样不可缺席,大系统都有集成短信接口.若只是临时用一下,若能够直接在Excel上加工好内容就可以直接发送,这些假设在此篇批量群发短信功能中都为大家带来完美答案. 业务场景 不多说, ...
- 使用Python发送HTML格式的邮件(收到的邮件有发送方才是正解)
发送html格式的和普通文本格式差不多,只是MIMEText(content,"html","utf-8"))与MIMEText(content,"p ...
- 一个python的邮件发送脚本,自动,定时,可以附件发送,抄送,附有说明文件
#!/bin/env python # -*- coding: utf-8 -*- import datetime import smtplib import os,sys from email.mi ...
- iOS开发之多种Cell高度自适应实现方案的UI流畅度分析
本篇博客的主题是关于UI操作流畅度优化的一篇博客,我们以TableView中填充多个根据内容自适应高度的Cell来作为本篇博客的使用场景.当然Cell高度的自适应网上的解决方案是铺天盖地呢,今天我们的 ...
随机推荐
- [FAQ] Member "address" not found or not visible after argument-dependent lookup in address payable.
顾名思义,address 属性不存在,请检查调用方. 比如:msg.sender.address 会有此提示,在 Solidity Contract 中,msg.sender.balance 是存在的 ...
- dotnet CBB 为什么决定推送 Tag 才能打包
通过推送 Tag 才打 NuGet 包的方法的作用不仅仅是让打包方便,让打包这个动作可以完全在本地执行,无需关注其他系统的使用步骤.更重要的是可以强制每个可能被安装的 NuGet 包版本都能有一个和他 ...
- 自动生成robot自动化测试用例
背景:java项目使用swagger管理接口,随着需求的开发接口也有增加,要从swagger界面中去查找出新增的接口是件很费时,效率很低的事情. 适用情况: java项目且适用swagger管理接口 ...
- 【Python Web】flask视频流
这篇文档,完全借鉴miguelgrinberg的博客. https://blog.miguelgrinberg.com/post/flask-video-streaming-revisited 想看具 ...
- 数据库—ER模型概念设计
文章目录 ER模型的概念 如何画ER图 ER图转换为关系数据库 ER模型的概念 实体 画图时用方形表示 属性 用椭圆形表示 关系 用菱形表示 主键(主码) 在主属性下面画划线 外键(外码) 这里一般是 ...
- C语言:使用链式栈检测txt文件中的括号匹配
便捷目录 前言 本程序最终会完成的任务 栈的理解 代码运行过程的解释 说明 ==代码思想 (重要部分)== 全局变量和结构体代码 进栈:创建链表空间函数 出栈:删除链表空间函数 释放申请的链式栈空间 ...
- windows安装nginx可视化工具nginxWebUI
一.官网下载ngixn * 官网地址<http://nginx.org/> 选取稳定版(Stable Version)二.解压压缩包三.启动Nginx1.进入安装目录下,找到nginx.e ...
- WPF使用Shape实现复杂线条动画
看到巧用 CSS/SVG 实现复杂线条光效动画的文章,便也想尝试用WPF的Shape配合动画实现同样的效果.ChokCoco大佬的文章中介绍了基于SVG的线条动画效果和通过角向渐变配合 MASK 实现 ...
- flask-wtf和WTForms官网翻译详解
https://flask-wtf.readthedocs.io/en/stable/# https://wtforms.readthedocs.io/en/2.3.x/ 介绍: wtformflas ...
- TypingLearn解决了我在学习英语中的一大痛点
上一次在博客园发贴还是在上一次(2021年),那个时候博客园就遇到了危机(被罚款).彼时在疫情期间,我个人生活也受到了影响,先后去了多个城市,最终在上海找到了 .NET Web开发的岗位,还是比较幸运 ...