消息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高度的自适应网上的解决方案是铺天盖地呢,今天我们的 ...
随机推荐
- 如何避免JS内存泄漏?
简介: 很多开发者可能平时并不关心自己维护的页面是否存在内存泄漏,原因可能是刚开始简单的页面内存泄漏的速度很缓慢,在造成严重卡顿之前可能就被用户刷新了,问题也就被隐藏了,但是随着页面越来越复杂,尤 ...
- [FAQ] docker-ce depends on containerd.io, docker-ce depends on docker-ce-cli
安装 docker 缺少依赖会提示你安装,一般是以下两个: Package containerd.io is not installed Package docker-ce-cli is not in ...
- IIncrementalGenerator 增量 Source Generator 生成代码入门 读取 csproj 项目文件的属性配置
本文告诉大家如何在使用 IIncrementalGenerator 进行增量的 Source Generator 生成代码时,读取项目里的项目文件属性,从而实现为项目定制的逻辑.或者是读取 NuGet ...
- 13.prometheus监控tengine(无用)
一.环境准备 1.1 docker安装tengine带nginx-module-vts模块(二选一) mkdir /data/ -p cd /data/ # 通过git clone下载已经创建好的do ...
- VSCode 打开ESP32工程问题
一.无法跳转 问题现象: 打开ESP32工程头文件提示波浪线不跳转,如下图所示: 解决办法: 删除工程中.vsccode文件夹下的所有文件 VSCode 中打开命令行搜索 ESP-IDF 找到`添加 ...
- 使用 @NoRepositoryBean 简化数据库访问
在 Spring Data JPA 应用程序中管理跨多个存储库接口的数据库访问逻辑可能会变得乏味且容易出错.开发人员经常发现自己为常见查询和方法重复代码,从而导致维护挑战和代码冗余.幸运的是,Spri ...
- k8s-nginx实战部署1
目录 yaml 资源清单 run_deploy.sh .gitlab-ci.yml yaml 资源清单 deploy.yaml apiVersion: v1 kind: ConfigMap metad ...
- 通过ref返回解决C# struct结构体链式调用的问题
通常结构体不能进行链式调用,因为返回值是一个新的值,需要赋回原值.但现在通过ref关键字配合扩展方法,也能进行链式调用了. 结构体: public struct Foo { public int a; ...
- 地理数据可视化的神奇组合:Python和Geopandas
本文分享自华为云社区<Python与Geopandas:地理数据可视化与分析指南>,作者:柠檬味拥抱. 地理数据可视化在许多领域都是至关重要的,无论是研究地理空间分布.城市规划.环境保护还 ...
- Kmesh进入CNCF云原生全景图,实现网格治理sidecarless化
本文分享自华为云社区<Kmesh进入CNCF 云原生全景图> ,作者:云容器大未来. 近日,Kmesh 正式进入 CNCF 云原生全景图,位于 Service Mesh 类别下. CNCF ...