csvList.get(i);
PrpCMainDemo prpCMainDemo = new PrpCMainDemo();
BeanUtils.copyProperties(dto,prpCMainDemo);
prpCMainDemos.add(prpCMainDemo);
}
try {
demoJobService.saveAll(prpCMainDemos);
} catch (Exception e) {
//如果此处捕获异常,可以通过如下方式处理,否则请将异常抛出,框架自动处理
//打印异常方式必须为:JobConstant.CSV_AOP_A1(阶段名称) + |UUID=?(有就显示)+ |需要打印的内容
String errorInfo = JobConstant.CSV_CUSTOM + "|UUID=" + dealerCallBackInfo.getUuid() + "|保存文件“"+dealerCallBackInfo.getHitFileName()+"”异常:"+e.getMessage();
dealerCallBackInfo.setErrorInfo(errorInfo);
logger.error(errorInfo,e);
}
//处理csv,处理业务逻辑 end
return ReturnT.SUCCESS;
}
/**
* 回调类必须指定名字
*/
@Component("excelDistributeReadDemoCallBack")
public class ExcelDistributeReadDemoCallBack implements ExcelDistributedCallBackIntf {
@Override
public void callBack(Elastic_job_excel_main main) {
System.out.println("我是回调哦["+main.getUuid()+"]");
}
}
到这里就完成了编码的工作
下面是进阶功能文档
接入xxl-job的子任务入口必须放入:org.zxp.jobexcutor.jobhandler.handler包下
handler调用的处理类(这里主要指使用本框架封装的分布式处理excel的方式)必须放入:org.zxp.jobexcutor.jobhandler.dealer,并且命名为*Dealer,同时需要实现ExcelDistributedReadIntf接口并使用ExcelDistributedRead注解,否则无法赋予分布式处理的能力
回调回写的处理类必须放入org.zxp.jobexcutor.jobhandler.callback包下,并实现ExcelDistributedCallBackIntf接口,否则无法自动回调
数据库实体类必须放入:org.zxp.jobexcutor.entity包,mybatis的mapper xml文件必须放入:org.zxp.jobexcutor.entity.xml包,这里推荐使用mybatis-generator:generate -X 插件自动生成基础类,对应配置文件位于:resources/mybatis-generator/generatorConfig.xml
excel对应的实体类必须放入:org.zxp.jobexcutor.csvdto包中,并可以通过CsvHead注解来匹配excel表头的内容
打印异常方式必须为:JobConstant.CSV_AOP_A1(阶段名称) + |UUID=?(有就显示)+ |需要打印的内容
先打开http://localhost:8080/job-admin/jobinfo注册中心
你需要先配置一个拆分excel的任务,你需要注意的是cron自定义定时间隔、JobHandler需要固定配置为ESJH,路由策略建议设置为“一致性hash”
在来配置刚刚写好的任务,你需要注意的是路由策略必须设置为:分片广播、cron自定义定时间隔、JobHandler是你在handler类注解上定义的内容
至此就完成全部的内容
支持三种分布式锁的方式,如果没有redis、zk等基础设施,直接用DB即可
配置方法:
#DB REDIS ZK 分布式锁方式,默认为数据库(不推荐zk方式,推荐redis方式)
ExcelDistributedReadAop.distributedlock=DB
#redis的配置信息
spring.redis.hostName=localhost
spring.redis.port=6379
#redis.password=
#zk的配置信息 可以配置集群 ***:*,***:*
spring.zk.config.uri=localhost:2181
如果配置为zk或redis,需要配置zk和redis的信息
注意:本例是在centos7下操作,不同操作系统请更换命令
容器化部署有两个特别需要注意的地方,否则可能造成无法正常调度任务
yum install -y ntpdate
ntpdate time.windows.com
systemctl stop firewalld.service
systemctl restart docker
//拉区mysql镜像
docker pull hub.c.163.com/library/mysql
//重命名镜像名称
docker tag IMAGEID(镜像id) mysql
//启动mysql容器,并将数据库文件目录挂载宿主机,指定root用户密码
docker run --privileged=true --name mysql5.7 -p 3306:3306 -v /my/mysql/datadir:/var/lib/mysql -v /my/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
mysql建设好后,需要执行脚本,点击下载
docker pull redis:3.2
docker run -d -p 6379:6379 docker.io/redis:3.2
>将job-admin.zip拷贝到与dockerfile同一路径
>dockerfile内容如下:
from hub.c.163.com/library/tomcat:latest
MAINTAINER zxp
ENV DIR_WEBAPP /usr/local/tomcat/webapps/
RUN rm -rf $DIR_WEBAPP/*
ADD job-admin.zip $DIR_WEBAPP/job-admin.zip
RUN unzip $DIR_WEBAPP/job-admin.zip -d $DIR_WEBAPP/
CMD ["catalina.sh", "run"]
>执行生成镜像的命令
docker build -t job-admin:latest .
>启动调度中心的容器
docker run -d -p 8080:8080 job-admin
job-admin.zip中需要将配置文件中的xxl.job.db参数调整为docker的mysql实例地址,xxl.job.mail需要设置为通知邮箱
>先把构建好的job-excutor-0.0.1-SNAPSHOT.jar与jdk1.8放入同一目录
>需要制定多个dockerfile,命名一个文件为9090(对应9090端口),内容为:
编码部分的设定是为了让容器日志不乱码,jdk1.8.0_131是同级目录jdk的名字
FROM centos
MAINTAINER
``` **Поскольку предоставленный текст содержит код на языке Java, то в переводе могут быть неточности.**
Из-за ограничений фреймворка, пожалуйста, настройте следующим образом: ,1,2,3,
> 1. boolean **isNotZero**: не может быть равно нулю. Пустое значение не проверяется. true не допускает значения 0.
> 1. AutoCheckFormat **fieldformat**: выберите формат из следующего списка: date, time, num, none. Формат date — yyyy-mm-dd, формат time — yyyy-mm-dd hh:mi:ss, формат num — число, none — без проверки.
> 1. int **length**: проверка длины. Если значение равно 0, запись невозможна. Пустое значение не проверяется.
> 1. String **cname**: поле по умолчанию содержит китайские иероглифы. Используется для проверки.
Информация о проверке будет сохранена в таблице elastic_job_excel_checkinfo. Система также выполнила некоторые запросы к информации об исключениях через REST API. Подробности см. в разделе функций управления.
## Ручная проверка фреймворка
Информацию об исключениях ручной проверки можно напрямую сохранить в списке List<DealerCallBackErrorInfo<T>> в DealerCallBackInfo. Пример см. ниже.
@Override
@ExcelDistributedRead(type = ExcelJobType.DEMO, isCheckSumAmount = true, clazz = DemoJobDto.class, callBackBeanName = ExcelJobType.DEMO_CALLBACK)
public ReturnT<String> deal(ShardingUtil.ShardingVO shardingVO, DealerCallBackInfo<DemoJobDto> dealerCallBackInfo) {
//Обработка csv, обработка бизнес-логики
List<DemoJobDto> csvList = dealerCallBackInfo.getCsvList();
List<PrpCMainDemo> prpCMainDemos = new ArrayList<PrpCMainDemo>();
List<DealerCallBackErrorInfo<DemoJobDto>> callBackErrorInfoList = new ArrayList<>();
dealerCallBackInfo.setCheckInfoList(callBackErrorInfoList);
for (int i = 0; csvList != null && i < csvList.size(); i++) {
DemoJobDto dto = csvList.get(i);
if (dto.getProposalno().equals("MOP08000046200") ||
dto.getProposalno().equals("MOP0900079790000000") ||
dto.getProposalno().equals("MOP08000082300") ||
dto.getProposalno().equals("MOP090006858000")) {
DealerCallBackErrorInfo<DemoJobDto> checkinfo = new DealerCallBackErrorInfo<>();
checkinfo.setT(dto);
checkinfo.setErrorInfo("Ошибка в полисе страхования: " + dto.getProposalno());
callBackErrorInfoList.add(checkinfo);
}
……
## Сбор содержимого проверки
1. Основной ключ задачи.
1. Порядковый номер (соответствует номеру разделения excel).
1. Путь к файлу с разделённым excel.
1. Содержимое проверки.
1. Код соответствия проверки, который будет одинаковым для одной и той же партии.
1. Строка исходного excel, соответствующая проверяемым данным.
1. Логический основной ключ проверяемых данных.
1. Вспомогательные поля.
1. Дата ввода.
Собранная информация о проверке помогает клиентам легко определить ошибочную строку и причину ошибки.
## Обработка excel без распределения
Для обработки excel без распределения основная таблица задач elastic_job_excel_main.extfield2 должна быть равна 0. Настройка такая же, как и для распределённой обработки, но используемые классы различаются.
@Component("excelReadDemoJobDealer") //Обратите внимание, что здесь необходимо реализовать интерфейс ExcelReadIntf public class ExcelReadDemoJobDealer implements ExcelReadIntf { private final static Logger logger = LoggerFactory.getLogger(ExcelReadDemoJobDealer.class); @Autowired private DemoJobService demoJobService;
@Override
@ExcelRead(type = ExcelJobType.NDEMO, clazz = DemoJobDto.class)
//Обратите внимание, здесь необходимо использовать аннотацию ExcelRead
public ReturnT<String> deal(DealerCallBackInfo dealerCallBackInfo) {
List<DemoJobDto> csvList = dealerCallBackInfo.getCsvList();
List<PrpCMainDemo> prpCMainDemos = new ArrayList<PrpCMainDemo>();
for (int i = 0; csvList != null && i < csvList.size(); i++) {
DemoJobDto dto = csvList.get(i);
PrpCMainDemo prpCMainDemo = new PrpCMainDemo();
BeanUtils.copyProperties(dto, prpCMainDemo);
prpCMainDemos.add(prpCMainDemo);
}
try {
demoJobService.saveAll(prpCMainDemos);
} catch (Exception e) {
//Если здесь перехватывается исключение, его можно обработать следующим способом, иначе исключение следует выбросить, и оно будет автоматически обработано фреймворком
//Способ печати исключений должен быть: JobConstant.CSV_AOP_A1 (имя этапа) + |UUID=? (отображается, если есть) + |содержимое для печати
String errorInfo = JobConstant.CSV_CUSTOM + "|UUID=" + dealerCallBackInfo.getUuid() + "|Ошибка при сохранении файла" + dealerCallBackInfo.getHitFileName() + ": " + e.getMessage();
dealerCallBackInfo.setErrorInfo(errorInfo);
logger.error(errorInfo, e);
}
return ReturnT.SUCCESS;
}
}
## Автоматическое сохранение подзадач после завершения
После завершения подзадачи данные будут автоматически сохранены в таблице elastic_job_excel_sub_his. Исправление задачи, uuid которой уже был разделён в Excel, но распределённая обработка ещё не началась.
> http://localhost:8090/tools/repairtwo/{uuid}
Разблокировка основной задачи по uuid (ручная разблокировка через ZK пока не поддерживается).
> http://localhost:8090/tools/releaseLock/{uuid}
Автоматическое снятие блокировок по таймауту (только для БД и REDIS).
Этот метод гарантирует отсутствие взаимоблокировок (ограничено БД и REDIS).
Можно настроить следующий периодический таск:
Описание задачи: автоматическое снятие блокировок по тайм-ауту на основе базы данных.
Расписание: каждые 10 минут.
JobHandler: deamonClearDeadLockJobHandler.
Маршрутизация: согласованный хэш.
Посмотреть последнюю информацию о проверке определённой задачи.
> http://localhost:8090/tools/newestcheckinfo/{uuid}/{serialno}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )