1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/zxporz-job-distribute-excel-excutor

Клонировать/Скачать
README.md 14 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 21:41 ecf0037
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()+"]");
    }
}

到这里就完成了编码的工作


下面是进阶功能文档

关于使用excel分布式处理组件的规范

  • 接入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=?(有就显示)+ |需要打印的内容

配置xxl-job

先打开http://localhost:8080/job-admin/jobinfo注册中心

你需要先配置一个拆分excel的任务,你需要注意的是cron自定义定时间隔、JobHandler需要固定配置为ESJH,路由策略建议设置为“一致性hash”

image

在来配置刚刚写好的任务,你需要注意的是路由策略必须设置为:分片广播、cron自定义定时间隔、JobHandler是你在handler类注解上定义的内容

image

至此就完成全部的内容

非分布式处理excel

分布式锁

支持三种分布式锁的方式,如果没有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下操作,不同操作系统请更换命令

容器化部署有两个特别需要注意的地方,否则可能造成无法正常调度任务

  1. docker容器中的时间,linux的时间都需要保持一致,具体方法如下:
yum install -y ntpdate
ntpdate time.windows.com
  1. 如果通过docker方式启动,需要在调度中心执行器管理界面,将执行器编辑页面中的机器地址设置为你容器集群中的ip:port,多个以逗号隔开,否则无法正常调度

第一部分,公共服务部分

清理docker容器,以及关闭防火墙

systemctl stop firewalld.service
systemctl restart docker

docker安装mysql(配合调度中心所用)

//拉区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安装redis

docker pull  redis:3.2
docker run -d -p 6379:6379 docker.io/redis:3.2

通过dockerfile制作调度中心镜像

>将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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/zxporz-job-distribute-excel-excutor.git
git@api.gitlife.ru:oschina-mirror/zxporz-job-distribute-excel-excutor.git
oschina-mirror
zxporz-job-distribute-excel-excutor
zxporz-job-distribute-excel-excutor
master