Showing preview only (3,135K chars total). Download the full file or copy to clipboard to get everything.
Repository: xuxueli/xxl-job
Branch: master
Commit: 1f4ba7bed77e
Files: 268
Total size: 2.9 MB
Directory structure:
gitextract_80xsumby/
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE
│ ├── PULL_REQUEST_TEMPLATE
│ └── workflows/
│ └── maven.yml
├── .gitignore
├── LICENSE
├── NOTICE
├── README.md
├── doc/
│ ├── XXL-JOB-English-Documentation.md
│ ├── XXL-JOB官方文档.md
│ ├── XXL-JOB架构图.key
│ └── db/
│ └── tables_xxl_job.sql
├── docker/
│ └── docker-compose.yml
├── pom.xml
├── xxl-job-admin/
│ ├── Dockerfile
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── xxl/
│ │ │ └── job/
│ │ │ └── admin/
│ │ │ ├── XxlJobAdminApplication.java
│ │ │ ├── constant/
│ │ │ │ ├── Consts.java
│ │ │ │ └── TriggerStatus.java
│ │ │ ├── controller/
│ │ │ │ ├── base/
│ │ │ │ │ ├── IndexController.java
│ │ │ │ │ └── LoginController.java
│ │ │ │ └── biz/
│ │ │ │ ├── JobCodeController.java
│ │ │ │ ├── JobGroupController.java
│ │ │ │ ├── JobInfoController.java
│ │ │ │ ├── JobLogController.java
│ │ │ │ └── JobUserController.java
│ │ │ ├── mapper/
│ │ │ │ ├── XxlJobGroupMapper.java
│ │ │ │ ├── XxlJobInfoMapper.java
│ │ │ │ ├── XxlJobLockMapper.java
│ │ │ │ ├── XxlJobLogGlueMapper.java
│ │ │ │ ├── XxlJobLogMapper.java
│ │ │ │ ├── XxlJobLogReportMapper.java
│ │ │ │ ├── XxlJobRegistryMapper.java
│ │ │ │ └── XxlJobUserMapper.java
│ │ │ ├── model/
│ │ │ │ ├── XxlJobGroup.java
│ │ │ │ ├── XxlJobInfo.java
│ │ │ │ ├── XxlJobLog.java
│ │ │ │ ├── XxlJobLogGlue.java
│ │ │ │ ├── XxlJobLogReport.java
│ │ │ │ ├── XxlJobRegistry.java
│ │ │ │ ├── XxlJobUser.java
│ │ │ │ └── dto/
│ │ │ │ └── XxlBootResourceDTO.java
│ │ │ ├── scheduler/
│ │ │ │ ├── alarm/
│ │ │ │ │ ├── JobAlarm.java
│ │ │ │ │ ├── JobAlarmer.java
│ │ │ │ │ └── impl/
│ │ │ │ │ └── EmailJobAlarm.java
│ │ │ │ ├── complete/
│ │ │ │ │ └── JobCompleter.java
│ │ │ │ ├── config/
│ │ │ │ │ └── XxlJobAdminBootstrap.java
│ │ │ │ ├── cron/
│ │ │ │ │ └── CronExpression.java
│ │ │ │ ├── exception/
│ │ │ │ │ └── XxlJobException.java
│ │ │ │ ├── misfire/
│ │ │ │ │ ├── MisfireHandler.java
│ │ │ │ │ ├── MisfireStrategyEnum.java
│ │ │ │ │ └── strategy/
│ │ │ │ │ ├── MisfireDoNothing.java
│ │ │ │ │ └── MisfireFireOnceNow.java
│ │ │ │ ├── openapi/
│ │ │ │ │ └── OpenApiController.java
│ │ │ │ ├── route/
│ │ │ │ │ ├── ExecutorRouteStrategyEnum.java
│ │ │ │ │ ├── ExecutorRouter.java
│ │ │ │ │ └── strategy/
│ │ │ │ │ ├── ExecutorRouteBusyover.java
│ │ │ │ │ ├── ExecutorRouteConsistentHash.java
│ │ │ │ │ ├── ExecutorRouteFailover.java
│ │ │ │ │ ├── ExecutorRouteFirst.java
│ │ │ │ │ ├── ExecutorRouteLFU.java
│ │ │ │ │ ├── ExecutorRouteLRU.java
│ │ │ │ │ ├── ExecutorRouteLast.java
│ │ │ │ │ ├── ExecutorRouteRandom.java
│ │ │ │ │ └── ExecutorRouteRound.java
│ │ │ │ ├── thread/
│ │ │ │ │ ├── JobCompleteHelper.java
│ │ │ │ │ ├── JobFailAlarmMonitorHelper.java
│ │ │ │ │ ├── JobLogReportHelper.java
│ │ │ │ │ ├── JobRegistryHelper.java
│ │ │ │ │ ├── JobScheduleHelper.java
│ │ │ │ │ └── JobTriggerPoolHelper.java
│ │ │ │ ├── trigger/
│ │ │ │ │ ├── JobTrigger.java
│ │ │ │ │ └── TriggerTypeEnum.java
│ │ │ │ └── type/
│ │ │ │ ├── ScheduleType.java
│ │ │ │ ├── ScheduleTypeEnum.java
│ │ │ │ └── strategy/
│ │ │ │ ├── CronScheduleType.java
│ │ │ │ ├── FixRateScheduleType.java
│ │ │ │ └── NoneScheduleType.java
│ │ │ ├── service/
│ │ │ │ ├── XxlJobService.java
│ │ │ │ └── impl/
│ │ │ │ ├── AdminBizImpl.java
│ │ │ │ └── XxlJobServiceImpl.java
│ │ │ ├── util/
│ │ │ │ ├── I18nUtil.java
│ │ │ │ ├── JobGroupPermissionUtil.java
│ │ │ │ └── old/
│ │ │ │ ├── CommonDataInterceptor.java
│ │ │ │ ├── CookieUtil.java
│ │ │ │ ├── FtlUtil.java
│ │ │ │ ├── JacksonUtil.java
│ │ │ │ ├── LocalCacheUtil.java
│ │ │ │ ├── RemoteHttpJobBean.java
│ │ │ │ ├── XxlJobDynamicScheduler.java
│ │ │ │ └── XxlJobThreadPool.java
│ │ │ └── web/
│ │ │ ├── error/
│ │ │ │ ├── WebErrorPageRegistrar.java
│ │ │ │ └── WebHandlerExceptionResolver.java
│ │ │ └── xxlsso/
│ │ │ ├── SimpleLoginStore.java
│ │ │ └── XxlSsoConfig.java
│ │ └── resources/
│ │ ├── application.properties
│ │ ├── i18n/
│ │ │ ├── message_en.properties
│ │ │ ├── message_zh_CN.properties
│ │ │ └── message_zh_TC.properties
│ │ ├── logback.xml
│ │ ├── mapper/
│ │ │ ├── XxlJobGroupMapper.xml
│ │ │ ├── XxlJobInfoMapper.xml
│ │ │ ├── XxlJobLockMapper.xml
│ │ │ ├── XxlJobLogGlueMapper.xml
│ │ │ ├── XxlJobLogMapper.xml
│ │ │ ├── XxlJobLogReportMapper.xml
│ │ │ ├── XxlJobRegistryMapper.xml
│ │ │ └── XxlJobUserMapper.xml
│ │ ├── static/
│ │ │ ├── adminlte/
│ │ │ │ ├── bower_components/
│ │ │ │ │ ├── bootstrap-daterangepicker/
│ │ │ │ │ │ ├── daterangepicker.css
│ │ │ │ │ │ └── daterangepicker.js
│ │ │ │ │ ├── ckeditor/
│ │ │ │ │ │ ├── ckeditor.js
│ │ │ │ │ │ ├── config.js
│ │ │ │ │ │ ├── contents.css
│ │ │ │ │ │ ├── lang/
│ │ │ │ │ │ │ └── zh-cn.js
│ │ │ │ │ │ ├── plugins/
│ │ │ │ │ │ │ ├── image/
│ │ │ │ │ │ │ │ └── dialogs/
│ │ │ │ │ │ │ │ └── image.js
│ │ │ │ │ │ │ ├── link/
│ │ │ │ │ │ │ │ └── dialogs/
│ │ │ │ │ │ │ │ ├── anchor.js
│ │ │ │ │ │ │ │ └── link.js
│ │ │ │ │ │ │ ├── scayt/
│ │ │ │ │ │ │ │ ├── dialogs/
│ │ │ │ │ │ │ │ │ ├── dialog.css
│ │ │ │ │ │ │ │ │ ├── options.js
│ │ │ │ │ │ │ │ │ └── toolbar.css
│ │ │ │ │ │ │ │ └── skins/
│ │ │ │ │ │ │ │ └── moono-lisa/
│ │ │ │ │ │ │ │ └── scayt.css
│ │ │ │ │ │ │ ├── specialchar/
│ │ │ │ │ │ │ │ └── dialogs/
│ │ │ │ │ │ │ │ ├── lang/
│ │ │ │ │ │ │ │ │ └── zh-cn.js
│ │ │ │ │ │ │ │ └── specialchar.js
│ │ │ │ │ │ │ ├── table/
│ │ │ │ │ │ │ │ └── dialogs/
│ │ │ │ │ │ │ │ └── table.js
│ │ │ │ │ │ │ ├── tableselection/
│ │ │ │ │ │ │ │ └── styles/
│ │ │ │ │ │ │ │ └── tableselection.css
│ │ │ │ │ │ │ └── wsc/
│ │ │ │ │ │ │ └── skins/
│ │ │ │ │ │ │ └── moono-lisa/
│ │ │ │ │ │ │ └── wsc.css
│ │ │ │ │ │ ├── skins/
│ │ │ │ │ │ │ └── moono-lisa/
│ │ │ │ │ │ │ ├── dialog.css
│ │ │ │ │ │ │ ├── dialog_ie.css
│ │ │ │ │ │ │ ├── dialog_ie8.css
│ │ │ │ │ │ │ ├── dialog_iequirks.css
│ │ │ │ │ │ │ ├── editor.css
│ │ │ │ │ │ │ ├── editor_gecko.css
│ │ │ │ │ │ │ ├── editor_ie.css
│ │ │ │ │ │ │ ├── editor_ie8.css
│ │ │ │ │ │ │ ├── editor_iequirks.css
│ │ │ │ │ │ │ └── readme.md
│ │ │ │ │ │ └── styles.js
│ │ │ │ │ ├── fastclick/
│ │ │ │ │ │ └── fastclick.js
│ │ │ │ │ └── font-awesome/
│ │ │ │ │ └── fonts/
│ │ │ │ │ └── FontAwesome.otf
│ │ │ │ └── plugins/
│ │ │ │ └── iCheck/
│ │ │ │ └── square/
│ │ │ │ └── blue.css
│ │ │ ├── biz/
│ │ │ │ └── common/
│ │ │ │ ├── admin.setting.js
│ │ │ │ ├── admin.tab.css
│ │ │ │ ├── admin.tab.js
│ │ │ │ ├── admin.table.js
│ │ │ │ └── admin.util.js
│ │ │ └── plugins/
│ │ │ ├── codemirror/
│ │ │ │ ├── addon/
│ │ │ │ │ └── hint/
│ │ │ │ │ ├── anyword-hint.js
│ │ │ │ │ ├── show-hint.css
│ │ │ │ │ └── show-hint.js
│ │ │ │ ├── lib/
│ │ │ │ │ ├── codemirror.css
│ │ │ │ │ └── codemirror.js
│ │ │ │ └── mode/
│ │ │ │ ├── clike/
│ │ │ │ │ └── clike.js
│ │ │ │ ├── javascript/
│ │ │ │ │ └── javascript.js
│ │ │ │ ├── php/
│ │ │ │ │ └── php.js
│ │ │ │ ├── powershell/
│ │ │ │ │ └── powershell.js
│ │ │ │ ├── python/
│ │ │ │ │ └── python.js
│ │ │ │ └── shell/
│ │ │ │ └── shell.js
│ │ │ ├── cronGen/
│ │ │ │ ├── cronGen.js
│ │ │ │ └── cronGen_en.js
│ │ │ ├── fullscreen/
│ │ │ │ └── jquery.fullscreen.js
│ │ │ ├── jquery-treegrid/
│ │ │ │ └── jquery.treegrid.css
│ │ │ ├── layer/
│ │ │ │ ├── layer.js
│ │ │ │ └── theme/
│ │ │ │ └── default/
│ │ │ │ └── layer.css
│ │ │ ├── nprogress/
│ │ │ │ ├── nprogress.css
│ │ │ │ └── nprogress.js
│ │ │ └── zTree/
│ │ │ ├── css/
│ │ │ │ └── metroStyle/
│ │ │ │ └── metroStyle.css
│ │ │ └── js/
│ │ │ ├── jquery.ztree.core.js
│ │ │ └── jquery.ztree.excheck.js
│ │ └── templates/
│ │ ├── base/
│ │ │ ├── dashboard.ftl
│ │ │ ├── help.ftl
│ │ │ ├── index.ftl
│ │ │ └── login.ftl
│ │ ├── biz/
│ │ │ ├── group.list.ftl
│ │ │ ├── job.code.ftl
│ │ │ ├── job.list.ftl
│ │ │ ├── log.detail.ftl
│ │ │ ├── log.list.ftl
│ │ │ └── user.list.ftl
│ │ └── common/
│ │ ├── common.errorpage.ftl
│ │ └── common.macro.ftl
│ └── test/
│ └── java/
│ └── com/
│ └── xxl/
│ └── job/
│ ├── admin/
│ │ ├── controller/
│ │ │ ├── AbstractSpringMvcTest.java
│ │ │ └── JobInfoControllerTest.java
│ │ ├── core/
│ │ │ └── util/
│ │ │ ├── CronExpressionTest.java
│ │ │ └── JacksonUtilTest.java
│ │ ├── mapper/
│ │ │ ├── XxlJobGroupMapperTest.java
│ │ │ ├── XxlJobInfoMapperTest.java
│ │ │ ├── XxlJobLogGlueMapperTest.java
│ │ │ ├── XxlJobLogMapperTest.java
│ │ │ ├── XxlJobLogReportMapperTest.java
│ │ │ └── XxlJobRegistryMapperTest.java
│ │ ├── schedule/
│ │ │ └── JobScheduleTest.java
│ │ └── util/
│ │ └── I18nUtilTest.java
│ └── openapi/
│ ├── AdminBizTest.java
│ └── ExecutorBizTest.java
├── xxl-job-core/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── xxl/
│ └── job/
│ └── core/
│ ├── constant/
│ │ ├── Const.java
│ │ ├── ExecutorBlockStrategyEnum.java
│ │ └── RegistType.java
│ ├── context/
│ │ ├── XxlJobContext.java
│ │ └── XxlJobHelper.java
│ ├── executor/
│ │ ├── XxlJobExecutor.java
│ │ └── impl/
│ │ ├── XxlJobSimpleExecutor.java
│ │ └── XxlJobSpringExecutor.java
│ ├── glue/
│ │ ├── GlueFactory.java
│ │ ├── GlueTypeEnum.java
│ │ └── impl/
│ │ └── SpringGlueFactory.java
│ ├── handler/
│ │ ├── IJobHandler.java
│ │ ├── annotation/
│ │ │ ├── JobHandler.java
│ │ │ └── XxlJob.java
│ │ └── impl/
│ │ ├── GlueJobHandler.java
│ │ ├── MethodJobHandler.java
│ │ └── ScriptJobHandler.java
│ ├── log/
│ │ └── XxlJobFileAppender.java
│ ├── openapi/
│ │ ├── AdminBiz.java
│ │ ├── ExecutorBiz.java
│ │ ├── impl/
│ │ │ └── ExecutorBizImpl.java
│ │ └── model/
│ │ ├── CallbackRequest.java
│ │ ├── IdleBeatRequest.java
│ │ ├── KillRequest.java
│ │ ├── LogRequest.java
│ │ ├── LogResult.java
│ │ ├── RegistryRequest.java
│ │ └── TriggerRequest.java
│ ├── server/
│ │ └── EmbedServer.java
│ ├── thread/
│ │ ├── ExecutorRegistryThread.java
│ │ ├── JobLogFileCleanThread.java
│ │ ├── JobThread.java
│ │ └── TriggerCallbackThread.java
│ └── util/
│ ├── ScriptUtil.java
│ └── deprecated/
│ ├── AdminBizClient.java
│ ├── DateUtil.java
│ ├── ExecutorBizClient.java
│ ├── FileUtil.java
│ ├── GsonTool.java
│ ├── IpUtil.java
│ ├── JdkSerializeTool.java
│ ├── NetUtil.java
│ ├── ReturnT.java
│ ├── ShardingUtil.java
│ ├── ThrowableUtil.java
│ └── XxlJobRemotingUtil.java
└── xxl-job-executor-samples/
├── pom.xml
├── xxl-job-executor-sample-frameless/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── xxl/
│ │ │ └── job/
│ │ │ └── executor/
│ │ │ └── sample/
│ │ │ └── frameless/
│ │ │ ├── XxlJobFramelessApplication.java
│ │ │ ├── config/
│ │ │ │ └── FrameLessXxlJobConfig.java
│ │ │ └── jobhandler/
│ │ │ └── SampleXxlJob.java
│ │ └── resources/
│ │ ├── log4j.xml
│ │ └── xxl-job-executor.properties
│ └── test/
│ └── java/
│ └── com/
│ └── xxl/
│ └── job/
│ └── executor/
│ └── sample/
│ └── frameless/
│ └── test/
│ └── FramelessApplicationTest.java
├── xxl-job-executor-sample-springboot/
│ ├── Dockerfile
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── xxl/
│ │ │ └── job/
│ │ │ └── executor/
│ │ │ ├── XxlJobExecutorApplication.java
│ │ │ ├── config/
│ │ │ │ └── XxlJobConfig.java
│ │ │ ├── controller/
│ │ │ │ └── IndexController.java
│ │ │ └── jobhandler/
│ │ │ └── SampleXxlJob.java
│ │ └── resources/
│ │ ├── application.properties
│ │ └── logback.xml
│ └── test/
│ └── java/
│ └── com/
│ └── xxl/
│ └── job/
│ └── executor/
│ └── test/
│ └── XxlJobExecutorExampleBootApplicationTests.java
└── xxl-job-executor-sample-springboot-ai/
├── Dockerfile
├── pom.xml
└── src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── xxl/
│ │ └── job/
│ │ └── executor/
│ │ ├── XxlJobAIExecutorApplication.java
│ │ ├── config/
│ │ │ └── XxlJobConfig.java
│ │ ├── controller/
│ │ │ └── IndexController.java
│ │ └── jobhandler/
│ │ └── AIXxlJob.java
│ └── resources/
│ ├── application.properties
│ └── logback.xml
└── test/
└── java/
└── com/
└── xxl/
└── job/
└── executor/
└── test/
├── BaseTests.java
├── dify/
│ └── DifyTest.java
└── ollama/
└── OllamaTest.java
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: ['https://www.xuxueli.com/page/donate.html'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
================================================
FILE: .github/ISSUE_TEMPLATE
================================================
Please answer some questions before submitting your issue. Thanks!
### Which version of XXL-JOB do you using?
### Expected behavior
### Actual behavior
### Steps to reproduce the behavior
### Other information
================================================
FILE: .github/PULL_REQUEST_TEMPLATE
================================================
**What kind of change does this PR introduce?** (check at least one)
- [ ] Bugfix
- [ ] Feature
- [ ] Code style update
- [ ] Refactor
- [ ] Build-related changes
- [ ] Other, please describe:
**The description of the PR:**
**Other information:**
================================================
FILE: .github/workflows/maven.yml
================================================
name: Java CI
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: maven
- name: Build with Maven
run: mvn -B package --file pom.xml
================================================
FILE: .gitignore
================================================
.idea
.classpath
.project
*.iml
target/
.DS_Store
.gitattributes
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
{one line to give the program's name and a brief idea of what it does.}
Copyright (C) {year} {name of author}
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
{project} Copyright (C) {year} {fullname}
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
================================================
FILE: NOTICE
================================================
Copyright (c) 2015-present, xuxueli.
Dependencies:
================================================================
Spring:
* LICENSE:
* http://www.apache.org/licenses/LICENSE-2.0 (Apache License 2.0)
* HOMEPAGE:
* http://www.springsource.org
Netty:
* LICENSE:
* http://www.apache.org/licenses/LICENSE-2.0 (Apache License 2.0)
* HOMEPAGE:
* https://github.com/netty/netty
Mybatis:
* LICENSE:
* http://www.apache.org/licenses/LICENSE-2.0 (Apache License 2.0)
* HOMEPAGE:
* https://mybatis.org/mybatis-3/
SLF4J:
* LICENSE:
* http://www.apache.org/licenses/LICENSE-2.0 (Apache License 2.0)
* HOMEPAGE:
* http://www.slf4j.org
================================================
FILE: README.md
================================================
<p align="center" >
<img src="https://www.xuxueli.com/doc/static/xxl-job/images/xxl-logo.jpg" width="150">
<h3 align="center">XXL-JOB</h3>
<p align="center">
XXL-JOB, a distributed task scheduling framework.
<br>
<a href="https://www.xuxueli.com/xxl-job/"><strong>-- Home Page --</strong></a>
<br>
<br>
<a href="https://github.com/xuxueli/xxl-job/actions">
<img src="https://github.com/xuxueli/xxl-job/workflows/Java%20CI/badge.svg" >
</a>
<a href="https://central.sonatype.com/artifact/com.xuxueli/xxl-job-core">
<img src="https://img.shields.io/maven-central/v/com.xuxueli/xxl-job-core" >
</a>
<a href="https://github.com/xuxueli/xxl-job/releases">
<img src="https://img.shields.io/github/release/xuxueli/xxl-job.svg" >
</a>
<a href="https://github.com/xuxueli/xxl-job/">
<img src="https://img.shields.io/github/stars/xuxueli/xxl-job" >
</a>
<a href="https://hub.docker.com/r/xuxueli/xxl-job-admin/">
<img src="https://img.shields.io/docker/pulls/xuxueli/xxl-job-admin" >
</a>
<a href="http://www.gnu.org/licenses/gpl-3.0.html">
<img src="https://img.shields.io/badge/license-GPLv3-blue.svg" >
</a>
<a href="https://www.xuxueli.com/page/donate.html">
<img src="https://img.shields.io/badge/%24-donate-ff69b4.svg?style=flat" >
</a>
</p>
</p>
## Introduction
XXL-JOB is a distributed task scheduling framework.
It's core design goal is to develop quickly and learn simple, lightweight, and easy to expand.
Now, it's already open source, and many companies use it in production environments, real "out-of-the-box".
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
## Sponsor
XXL-JOB is an open source and free project, with its ongoing development made possible entirely by the support of these awesome backers.
XXL-JOB 是一个开源且免费项目,其正在进行的开发完全得益于支持者的支持。开源不易,[前往赞助项目开发](https://www.xuxueli.com/page/donate.html )
<!-- supporter start -->
<h3 style="color: #E6BE8A;" >金牌赞助方</h3>
<table>
<tr>
<td>
<a href="https://www.aliyun.com/product/aliware/mse?utm_content=g_1000401794" title="" target="_blank" >
<img width="150px" src="http://www.xuxueli.com/page/static/images/logo_aliyun2.png" >
<br>
<span style="text-decoration:underline;color: #E6BE8A;" >阿里云 提供云上托管 XXL-JOB</span>
</a>
</td>
<td>
<a href="https://www.mall4j.com/cn/?statId=10" title="" target="_blank" >
<img width="150px" src="http://www.xuxueli.com/page/static/images/logo_mail4j.png" >
</a>
</td>
</tr>
</table>
<!-- supporter end -->
## Documentation
- [中文文档](https://www.xuxueli.com/xxl-job/)
- [English Documentation](https://www.xuxueli.com/xxl-job/en/)
## Communication
- [社区交流](https://www.xuxueli.com/page/community.html)
## Features
- 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
- 2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;
- 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA;
- 4、执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA;
- 5、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
- 6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;
- 7、触发策略:提供丰富的任务触发策略,包括:Cron触发、固定间隔触发、固定延时触发、API(事件)触发、人工触发、父子任务触发;
- 8、调度过期策略:调度中心错过调度时间的补偿处理策略,包括:忽略、立即补偿触发一次等;
- 9、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
- 10、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务;
- 11、任务失败重试:支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;其中分片任务支持分片粒度的失败重试;
- 12、任务失败告警;默认提供邮件方式失败告警,同时预留扩展接口,可方便的扩展短信、钉钉等告警方式;
- 13、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;
- 14、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务;
- 15、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。
- 16、故障转移:任务路由策略选择"故障转移"情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。
- 17、任务进度监控:支持实时监控任务进度;
- 18、Rolling实时日志:支持在线查看调度结果,并且支持以Rolling方式实时查看执行器输出的完整的执行日志;
- 19、GLUE:提供Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。支持30个版本的历史版本回溯。
- 20、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python、NodeJS、PHP、PowerShell等类型脚本;
- 21、命令行任务:原生提供通用命令行任务Handler(Bean任务,"CommandJobHandler");业务方只需要提供命令行即可;
- 22、任务依赖:支持配置子任务依赖,当父任务执行结束且执行成功后将会主动触发一次子任务的执行, 多个子任务用逗号分隔;
- 23、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行;
- 24、自定义任务参数:支持在线配置调度任务入参,即时生效;
- 25、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞;
- 26、数据加密:调度中心和执行器之间的通讯进行数据加密,提升调度信息安全性;
- 27、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件;
- 28、推送maven中央仓库: 将会把最新稳定版推送到maven中央仓库, 方便用户接入和使用;
- 29、运行报表:支持实时查看运行数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等;
- 30、全异步:任务调度流程全异步化设计实现,如异步调度、异步运行、异步回调等,有效对密集调度进行流量削峰,理论上支持任意时长任务的运行;
- 31、跨语言/OpenAPI:调度中心与执行器提供语言无关的 OpenApi(RESTful 格式),第三方任意语言可据此对接调度中心或者实现执行器,实现多语言支持。除此之外,还提供了 “多任务模式”和“httpJobHandler”等其他跨语言方案;
- 32、国际化:调度中心支持国际化设置,提供中文、英文两种可选语言,默认为中文;
- 33、容器化:提供官方docker镜像,并实时更新推送dockerhub,进一步实现产品开箱即用;
- 34、线程池隔离:调度线程池进行隔离拆分,慢任务自动降级进入"Slow"线程池,避免耗尽调度线程,提高系统稳定性;
- 35、用户管理:支持在线管理系统用户,存在管理员、普通用户两种角色;
- 36、权限控制:执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作;
- 37、AI任务:原生提供AI执行器,并内置多个AI任务Handler,与spring-ai、ollama、dify等集成打通,支持快速开发AI类任务。
- 38、审计日志:记录任务操作敏感信息,用于系统监控、审计和安全分析,可快速追溯异常行为以及定位排查问题。
- 39、优雅停机:调度中心停机,检测时间轮非空时主动等待调度完成;客户端停机,检测存在运行中任务时,停止接收新任务并主动等待任务执行完成;
## Development
于2015年中,我在github上创建XXL-JOB项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计……
于2015-11月,XXL-JOB终于RELEASE了第一个大版本V1.0, 随后我将之发布到OSCHINA,XXL-JOB在OSCHINA上获得了@红薯的热门推荐,同期分别达到了OSCHINA的“热门动弹”排行第一和git.oschina的开源软件月热度排行第一,在此特别感谢红薯,感谢大家的关注和支持。
于2015-12月,我将XXL-JOB发表到我司内部知识库,并且得到内部同事认可。
于2016-01月,我司展开XXL-JOB的内部接入和定制工作,在此感谢袁某和尹某两位同事的贡献,同时也感谢内部其他给与关注与支持的同事。
于2017-05-13,在上海举办的 "[第62期开源中国源创会](https://www.oschina.net/event/2236961)" 的 "放码过来" 环节,我登台对XXL-JOB做了演讲,台下五百位在场观众反响热烈([图文回顾](https://www.oschina.net/question/2686220_2242120) )。
于2017-10-22,又拍云 Open Talk 联合 Spring Cloud 中国社区举办的 "[进击的微服务实战派上海站](https://opentalk.upyun.com/303.html)",我登台对XXL-JOB做了演讲,现场观众反响热烈并在会后与XXL-JOB用户热烈讨论交流。
于2017-12-11,XXL-JOB有幸参会《[InfoQ ArchSummit全球架构师峰会](http://bj2017.archsummit.com/)》,并被拍拍贷架构总监"杨波老师"在专题 "[微服务原理、基础架构和开源实践](http://bj2017.archsummit.com/training/2)" 中现场介绍。
于2017-12-18,XXL-JOB参与"[2017年度最受欢迎中国开源软件](http://www.oschina.net/project/top_cn_2017?sort=1)"评比,在当时已录入的约九千个国产开源项目中角逐,最终进入了前30强。
于2018-01-15,XXL-JOB参与"[2017码云最火开源项目](https://www.oschina.net/news/92438/2017-mayun-top-50)"评比,在当时已录入的约六千五百个码云项目中角逐,最终进去了前20强。
于2018-04-14,iTechPlus在上海举办的 "[2018互联网开发者大会](http://www.itdks.com/eventlist/detail/2065)",我登台对XXL-JOB做了演讲,现场观众反响热烈并在会后与XXL-JOB用户热烈讨论交流。
于2018-05-27,在上海举办的 "[第75期开源中国源创会](https://www.oschina.net/event/2278742)" 的 "架构" 主题专场,我登台进行“基础架构与中间件图谱”主题演讲,台下上千位在场观众反响热烈([图文回顾](https://www.oschina.net/question/3802184_2280606) )。
于2018-12-05,XXL-JOB参与"[2018年度最受欢迎中国开源软件](https://www.oschina.net/project/top_cn_2018?sort=1)"评比,在当时已录入的一万多个开源项目中角逐,最终排名第19名。
于2019-12-10,XXL-JOB参与"[2019年度最受欢迎中国开源软件](https://www.oschina.net/project/top_cn_2019)"评比,在当时已录入的一万多个开源项目中角逐,最终排名"开发框架和基础组件类"第9名。
于2020-11-16,XXL-JOB参与"[2020年度最受欢迎中国开源软件](https://www.oschina.net/project/top_cn_2020)"评比,在当时已录入的一万多个开源项目中角逐,最终排名"开发框架和基础组件类"第8名。
于2021-12-06,XXL-JOB参与"[2021年度OSC中国开源项目评选](https://www.oschina.net/project/top_cn_2021) "评比,在当时已录入的一万多个开源项目中角逐,最终当选"最受欢迎项目"。
于2024-11-06,XXL-JOB经 GitCode 官方评审,获得 “G-Star项目毕业认证”。
> 我司大众点评目前已接入XXL-JOB,内部别名《Ferrari》(Ferrari基于XXL-JOB的V1.1版本定制而成,新接入应用推荐升级最新版本)。
据最新统计, 自2016-01-21接入至2017-12-01期间,该系统已调度约100万次,表现优异。新接入应用推荐使用最新版本,因为经过数十个版本的更新,系统的任务模型、UI交互模型以及底层调度通讯模型都有了较大的优化和提升,核心功能更加稳定高效。
至今,XXL-JOB已接入多家公司的线上产品线,接入场景如电商业务,O2O业务和大数据作业等,截止最新统计时间为止,XXL-JOB已接入的公司包括不限于:
- 1、大众点评【美团点评】
- 2、山东学而网络科技有限公司;
- 3、安徽慧通互联科技有限公司;
- 4、人人聚财金服;
- 5、上海棠棣信息科技股份有限公司
- 6、运满满【运满满】
- 7、米其林 (中国区)【米其林】
- 8、妈妈联盟
- 9、九樱天下(北京)信息技术有限公司
- 10、万普拉斯科技有限公司【一加手机】
- 11、上海亿保健康管理有限公司
- 12、海尔馨厨【海尔】
- 13、河南大红包电子商务有限公司
- 14、成都顺点科技有限公司
- 15、深圳市怡亚通
- 16、深圳麦亚信科技股份有限公司
- 17、上海博莹科技信息技术有限公司
- 18、中国平安科技有限公司【中国平安】
- 19、杭州知时信息科技有限公司
- 20、博莹科技(上海)有限公司
- 21、成都依能股份有限责任公司
- 22、湖南高阳通联信息技术有限公司
- 23、深圳市邦德文化发展有限公司
- 24、福建阿思可网络教育有限公司
- 25、优信二手车【优信】
- 26、上海悠游堂投资发展股份有限公司【悠游堂】
- 27、北京粉笔蓝天科技有限公司
- 28、中秀科技(无锡)有限公司
- 29、武汉空心科技有限公司
- 30、北京蚂蚁风暴科技有限公司
- 31、四川互宜达科技有限公司
- 32、钱包行云(北京)科技有限公司
- 33、重庆欣才集团
- 34、咪咕互动娱乐有限公司【中国移动】
- 35、北京诺亦腾科技有限公司
- 36、增长引擎(北京)信息技术有限公司
- 37、北京英贝思科技有限公司
- 38、刚泰集团
- 39、深圳泰久信息系统股份有限公司
- 40、随行付支付有限公司
- 41、广州瀚农网络科技有限公司
- 42、享点科技有限公司
- 43、杭州比智科技有限公司
- 44、圳临界线网络科技有限公司
- 45、广州知识圈网络科技有限公司
- 46、国誉商业上海有限公司
- 47、海尔消费金融有限公司,嗨付、够花【海尔】
- 48、广州巴图鲁信息科技有限公司
- 49、深圳市鹏海运电子数据交换有限公司
- 50、深圳市亚飞电子商务有限公司
- 51、上海趣医网络有限公司
- 52、聚金资本
- 53、北京父母邦网络科技有限公司
- 54、中山元赫软件科技有限公司
- 55、中商惠民(北京)电子商务有限公司
- 56、凯京集团
- 57、华夏票联(北京)科技有限公司
- 58、拍拍贷【拍拍贷】
- 59、北京尚德机构在线教育有限公司
- 60、任子行股份有限公司
- 61、北京时态电子商务有限公司
- 62、深圳卷皮网络科技有限公司
- 63、北京安博通科技股份有限公司
- 64、未来无线网
- 65、厦门瓷禧网络有限公司
- 66、北京递蓝科软件股份有限公司
- 67、郑州创海软件科技公司
- 68、北京国槐信息科技有限公司
- 69、浪潮软件集团
- 70、多立恒(北京)信息技术有限公司
- 71、广州极迅客信息科技有限公司
- 72、赫基(中国)集团股份有限公司
- 73、海投汇
- 74、上海润益创业孵化器管理股份有限公司
- 75、汉纳森(厦门)数据股份有限公司
- 76、安信信托
- 77、岚儒财富
- 78、捷道软件
- 79、湖北享七网络科技有限公司
- 80、湖南创发科技责任有限公司
- 81、深圳小安时代互联网金融服务有限公司
- 82、湖北享七网络科技有限公司
- 83、钱包行云(北京)科技有限公司
- 84、360金融【360】
- 85、易企秀
- 86、摩贝(上海)生物科技有限公司
- 87、广东芯智慧科技有限公司
- 88、联想集团【联想】
- 89、怪兽充电
- 90、行圆汽车
- 91、深圳店店通科技邮箱公司
- 92、京东【京东】
- 93、米庄理财
- 94、咖啡易融
- 95、梧桐诚选
- 96、恒大地产【恒大】
- 97、昆明龙慧
- 98、上海涩瑶软件
- 99、易信【网易】
- 100、铜板街
- 101、杭州云若网络科技有限公司
- 102、特百惠(中国)有限公司
- 103、常山众卡运力供应链管理有限公司
- 104、深圳立创电子商务有限公司
- 105、杭州智诺科技股份有限公司
- 106、北京云漾信息科技有限公司
- 107、深圳市多银科技有限公司
- 108、亲宝宝
- 109、上海博卡软件科技有限公司
- 110、智慧树在线教育平台
- 111、米族金融
- 112、北京辰森世纪
- 113、云南滇医通
- 114、广州市分领网络科技有限责任公司
- 115、浙江微能科技有限公司
- 116、上海馨飞电子商务有限公司
- 117、上海宝尊电子商务有限公司
- 118、直客通科技技术有限公司
- 119、科度科技有限公司
- 120、上海数慧系统技术有限公司
- 121、我的医药网
- 122、多粉平台
- 123、铁甲二手机
- 124、上海海新得数据技术有限公司
- 125、深圳市珍爱网信息技术有限公司【珍爱网】
- 126、小蜜蜂
- 127、吉荣数科技
- 128、上海恺域信息科技有限公司
- 129、广州荔支网络有限公司【荔枝FM】
- 130、杭州闪宝科技有限公司
- 131、北京互联新网科技发展有限公司
- 132、誉道科技
- 133、山西兆盛房地产开发有限公司
- 134、北京蓝睿通达科技有限公司
- 135、月亮小屋(中国)有限公司【蓝月亮】
- 136、青岛国瑞信息技术有限公司
- 137、博雅云计算(北京)有限公司
- 138、华泰证券香港子公司
- 139、杭州东方通信软件技术有限公司
- 140、武汉博晟安全技术股份有限公司
- 141、深圳市六度人和科技有限公司
- 142、杭州趣维科技有限公司(小影)
- 143、宁波单车侠之家科技有限公司【单车侠】
- 144、丁丁云康信息科技(北京)有限公司
- 145、云钱袋
- 146、南京中兴力维
- 147、上海矽昌通信技术有限公司
- 148、深圳萨科科技
- 149、中通服创立科技有限责任公司
- 150、深圳市对庄科技有限公司
- 151、上证所信息网络有限公司
- 152、杭州火烧云科技有限公司【婚礼纪】
- 153、天津青芒果科技有限公司【芒果头条】
- 154、长飞光纤光缆股份有限公司
- 155、世纪凯歌(北京)医疗科技有限公司
- 156、浙江霖梓控股有限公司
- 157、江西腾飞网络技术有限公司
- 158、安迅物流有限公司
- 159、肉联网
- 160、北京北广梯影广告传媒有限公司
- 161、上海数慧系统技术有限公司
- 162、大志天成
- 163、上海云鹊医
- 164、上海云鹊医
- 165、墨迹天气【墨迹天气】
- 166、上海逸橙信息科技有限公司
- 167、沅朋物联
- 168、杭州恒生云融网络科技有限公司
- 169、绿米联创
- 170、重庆易宠科技有限公司
- 171、安徽引航科技有限公司(乐职网)
- 172、上海数联医信企业发展有限公司
- 173、良彬建材
- 174、杭州求是同创网络科技有限公司
- 175、荷马国际
- 176、点雇网
- 177、深圳市华星光电技术有限公司
- 178、厦门神州鹰软件科技有限公司
- 179、深圳市招商信诺人寿保险有限公司
- 180、上海好屋网信息技术有限公司
- 181、海信集团【海信】
- 182、信凌可信息科技(上海)有限公司
- 183、长春天成科技发展有限公司
- 184、用友金融信息技术股份有限公司【用友】
- 185、北京咖啡易融有限公司
- 186、国投瑞银基金管理有限公司
- 187、晋松(上海)网络信息技术有限公司
- 188、深圳市随手科技有限公司【随手记】
- 189、深圳水务科技有限公司
- 190、易企秀【易企秀】
- 191、北京磁云科技
- 192、南京蜂泰互联网科技有限公司
- 193、章鱼直播
- 194、奖多多科技
- 195、天津市神州商龙科技股份有限公司
- 196、岩心科技
- 197、车码科技(北京)有限公司
- 198、贵阳市投资控股集团
- 199、康旗股份
- 200、龙腾出行
- 201、杭州华量软件
- 202、合肥顶岭医疗科技有限公司
- 203、重庆表达式科技有限公司
- 204、上海米道信息科技有限公司
- 205、北京益友会科技有限公司
- 206、北京融贯电子商务有限公司
- 207、中国外汇交易中心
- 208、中国外运股份有限公司
- 209、中国上海晓圈教育科技有限公司
- 210、普联软件股份有限公司
- 211、北京科蓝软件股份有限公司
- 212、江苏斯诺物联科技有限公司
- 213、北京搜狐-狐友【搜狐】
- 214、新大陆网商金融
- 215、山东神码中税信息科技有限公司
- 216、河南汇顺网络科技有限公司
- 217、北京华夏思源科技发展有限公司
- 218、上海东普信息科技有限公司
- 219、上海鸣勃网络科技有限公司
- 220、广东学苑教育发展有限公司
- 221、深圳强时科技有限公司
- 222、上海云砺信息科技有限公司
- 223、重庆愉客行网络有限公司
- 224、数云
- 225、国家电网运检部
- 226、杭州找趣
- 227、浩鲸云计算科技股份有限公司
- 228、科大讯飞【科大讯飞】
- 229、杭州行装网络科技有限公司
- 230、即有分期金融
- 231、深圳法司德信息科技有限公司
- 232、上海博复信息科技有限公司
- 233、杭州云嘉云计算有限公司
- 234、有家民宿(有家美宿)
- 235、北京赢销通软件技术有限公司
- 236、浙江聚有财金融服务外包有限公司
- 237、易族智汇(北京)科技有限公司
- 238、合肥顶岭医疗科技开发有限公司
- 239、车船宝(深圳)旭珩科技有限公司)
- 240、广州富力地产有限公司
- 241、氢课(上海)教育科技有限公司
- 242、武汉氪细胞网络技术有限公司
- 243、杭州有云科技有限公司
- 244、上海仙豆智能机器人有限公司
- 245、拉卡拉支付股份有限公司【拉卡拉】
- 246、虎彩印艺股份有限公司
- 247、北京数微科技有限公司
- 248、广东智瑞科技有限公司
- 249、找钢网
- 250、九机网
- 251、杭州跑跑网络科技有限公司
- 252、深圳未来云集
- 253、杭州每日给力科技有限公司
- 254、上海齐犇信息科技有限公司
- 255、滴滴出行【滴滴】
- 256、合肥云诊信息科技有限公司
- 257、云知声智能科技股份有限公司
- 258、南京坦道科技有限公司
- 259、爱乐优(二手平台)
- 260、猫眼电影(私有化部署)【猫眼电影】
- 261、美团大象(私有化部署)【美团大象】
- 262、作业帮教育科技(北京)有限公司【作业帮】
- 263、北京小年糕互联网技术有限公司
- 264、山东矩阵软件工程股份有限公司
- 265、陕西国驿软件科技有限公司
- 266、君开信息科技
- 267、村鸟网络科技有限责任公司
- 268、云南国际信托有限公司
- 269、金智教育
- 270、珠海市筑巢科技有限公司
- 271、上海百胜软件股份有限公司
- 272、深圳市科盾科技有限公司
- 273、哈啰出行【哈啰】
- 274、途虎养车【途虎】
- 275、卡思优派人力资源集团
- 276、南京观为智慧软件科技有限公司
- 277、杭州城市大脑科技有限公司
- 278、猿辅导【猿辅导】
- 279、洛阳健创网络科技有限公司
- 280、魔力耳朵
- 281、亿阳信通
- 282、上海招鲤科技有限公司
- 283、四川商旅无忧科技服务有限公司
- 284、UU跑腿
- 285、北京老虎证券【老虎证券】
- 286、悠活省吧(北京)网络科技有限公司
- 287、F5未来商店
- 288、深圳环阳通信息技术有限公司
- 289、遠傳電信
- 290、作业帮(北京)教育科技有限公司【作业帮】
- 291、成都科鸿智信科技有限公司
- 292、北京木屋时代科技有限公司
- 293、大学通(哈尔滨)科技有限责任公司
- 294、浙江华坤道威数据科技有限公司
- 295、吉祥航空【吉祥航空】
- 296、南京圆周网络科技有限公司
- 297、广州市洋葱omall电子商务
- 298、天津联物科技有限公司
- 299、跑哪儿科技(北京)有限公司
- 300、深圳市美西西餐饮有限公司(喜茶)
- 301、平安不动产有限公司【平安】
- 302、江苏中海昇物联科技有限公司
- 303、湖南牙医帮科技有限公司
- 304、重庆民航凯亚信息技术有限公司(易通航)
- 305、递易(上海)智能科技有限公司
- 306、亚朵
- 307、浙江新课堂教育股份有限公司
- 308、北京蜂创科技有限公司
- 309、德一智慧城市信息系统有限公司
- 310、北京翼点科技有限公司
- 311、湖南智数新维度信息科技有限公司
- 312、北京玖扬博文文化发展有限公司
- 313、上海宇珩信息科技有限公司
- 314、全景智联(武汉)科技有限公司
- 315、天津易客满国际物流有限公司
- 316、南京爱福路汽车科技有限公司
- 317、我房旅居集团
- 318、湛江亲邻科技有限公司
- 319、深圳市姜科网络有限公司
- 320、青岛日日顺物流有限公司
- 321、南京太川信息技术有限公司
- 322、美图之家科技有限公司【美图】
- 323、南京太川信息技术有限公司
- 324、众薪科技(北京)有限公司
- 325、武汉安安物联科技有限公司
- 326、北京智客朗道网络科技有限公司
- 327、深圳市超级猩猩健身管理管理有限公司
- 328、重庆达志科技有限公司
- 329、上海享评信息科技有限公司
- 330、薪得付信息科技
- 331、跟谁学
- 332、中道(苏州)旅游网络科技有限公司
- 333、广州小卫科技有限公司
- 334、上海非码网络科技有限公司
- 335、途家网网络技术(北京)有限公司【途家】
- 336、广州辉凡信息科技有限公司
- 337、天维尔信息科技股份有限公司
- 338、上海极豆科技有限公司
- 339、苏州触达信息技术有限公司
- 340、北京热云科技有限公司
- 341、中智企服(北京)科技有限公司
- 342、易联云计算(杭州)有限责任公司
- 343、青岛航空股份有限公司【青岛航空】
- 344、山西博睿通科技有限公司
- 345、网易杭州网络有限公司【网易】
- 346、北京果果乐学科技有限公司
- 347、百望股份有限公司
- 348、中保金服(深圳)科技有限公司
- 349、天津运友物流科技股份有限公司
- 350、广东创能科技股份有限公司
- 351、上海倚博信息科技有限公司
- 352、深圳百果园实业(集团)股份有限公司
- 353、广州细刻网络科技有限公司
- 354、武汉鸿业众创科技有限公司
- 355、金锡科技(广州)有限公司
- 356、易瑞国际电子商务有限公司
- 357、奇点云
- 358、中视信息科技有限公司
- 359、开源项目:datax-web
- 360、云知声智能科技股份有限公司
- 361、开源项目:bboss
- 362、成都深驾科技有限公司
- 363、FunPlus【趣加】
- 364、杭州创匠信科技有限公司
- 365、龙匠(北京)科技发展有限公司
- 366、广州一链通互联网科技有限公司
- 367、上海星艾网络科技有限公司
- 368、虎博网络技术(上海)有限公司
- 369、青岛优米信息技术有限公司
- 370、八维通科技有限公司
- 371、烟台合享智星数据科技有限公司
- 372、东吴证券股份有限公司
- 373、中通云仓股份有限公司【中通】
- 374、北京加菲猫科技有限公司
- 375、北京匠心演绎科技有限公司
- 376、宝贝走天下
- 377、厦门众库科技有限公司
- 378、海通证券数据中心
- 389、湖南快乐通宝小额贷款有限公司
- 380、浙江大华技术股份有限公司
- 381、杭州魔筷科技有限公司
- 382、青岛掌讯通区块链科技有限公司
- 383、新大陆金融科技
- 384、常州玺拓软件科技有限公司
- 385、北京正保网格教育科技有限公司
- 386、统一企业(中国)投资有限公司【统一】
- 387、微革网络科技有限公司
- 388、杭州融易算科技有限公司
- 399、青岛上啥班网络科技有限公司
- 390、京东酒世界
- 391、杭州爱博仕科技有限公司
- 392、五星金服控股有限公司
- 393、福建乐摩物联科技有限公司
- 394、百炼智能科技有限公司
- 395、山东能源数智云科技有限公司
- 396、招商局能源运输股份有限公司
- 397、三一集团【三一】
- 398、东巴文(深圳)健康管理有限公司
- 399、索易软件
- 400、深圳市宁远科技有限公司
- 401、熙牛医疗
- 402、南京智鹤电子科技有限公司
- 403、嘀嗒出行【嘀嗒出行】
- 404、广州虎牙信息科技有限公司【虎牙】
- 405、广州欧莱雅百库网络科技有限公司【欧莱雅】
- 406、微微科技有限公司
- 407、我爱我家房地产经纪有限公司【我爱我家】
- 408、九号发现
- 409、薪人薪事
- 410、武汉氪细胞网络技术有限公司
- 411、广州市斯凯奇商业有限公司
- 412、微淼商学院
- 413、杭州车盛科技有限公司
- 414、深兰科技(上海)有限公司
- 415、安徽中科美络信息技术有限公司
- 416、比亚迪汽车工业有限公司【比亚迪】
- 417、湖南小桔信息技术有限公司
- 418、安徽科大国创软件科技有限公司
- 419、克而瑞
- 420、陕西云基华海信息技术有限公司
- 421、安徽深宁科技有限公司
- 422、广东康爱多数字健康有限公司
- 423、嘉里电子商务
- 424、上海时代光华教育发展有限公司
- 425、CityDo
- 426、上海禹知信息科技有限公司
- 427、广东智瑞科技有限公司
- 428、西安爱铭网络科技有限公司
- 429、心医国际数字医疗系统(大连)有限公司
- 430、乐其电商
- 431、锐达科技
- 432、天津长城滨银汽车金融有限公司
- 433、代码网
- 434、东莞市东城乔伦软件开发工作室
- 435、浙江百应科技有限公司
- 436、上海力爱帝信息技术有限公司(Red E)
- 437、云徙科技有限公司
- 438、北京康智乐思网络科技有限公司【大姨吗APP】
- 439、安徽开元瞬视科技有限公司
- 440、立方
- 441、厦门纵行科技
- 442、乐山-菲尼克斯半导体有限公司
- 443、武汉光谷联合集团有限公司
- 444、上海金仕达软件科技有限公司
- 445、深圳易世通达科技有限公司
- 446、爱动超越人工智能科技(北京)有限责任公司
- 447、迪普信(北京)科技有限公司
- 448、掌站科技(北京)有限公司
- 449、深圳市华云中盛股份有限公司
- 450、上海原圈科技有限公司
- 451、广州赞赏信息科技有限公司
- 452、Amber Group
- 453、德威国际货运代理(上海)公司
- 454、浙江杰夫兄弟智慧科技有限公司
- 455、信也科技
- 456、开思时代科技(深圳)有限公司
- 457、大连槐德科技有限公司
- 458、同程生活
- 459、松果出行
- 460、企鹅杏仁集团
- 461、宁波科云信息科技有限公司
- 462、上海格蓝威驰信息科技有限公司
- 463、杭州趣淘鲸科技有限公司
- 464、湖州市数字惠民科技有限公司
- 465、乐普(北京)医疗器械股份有限公司
- 466、广州市晴川高新技术开发有限公司
- 467、山西缇客科技有限公司
- 468、徐州卡西穆电子商务有限公司
- 469、格创东智科技有限公司
- 470、世纪龙信息网络有限责任公司
- 471、邦道科技有限公司
- 472、河南中盟新云科技股份有限公司
- 473、横琴人寿保险有限公司
- 474、上海海隆华钟信息技术有限公司
- 475、上海久湛
- 476、上海仙豆智能机器人有限公司
- 477、广州汇尚网络科技有限公司
- 478、深圳市阿卡索资讯股份有限公司
- 479、青岛佳家康健康管理有限责任公司
- 480、蓝城兄弟
- 481、成都天府通金融服务股份有限公司
- 482、深圳云镖网络科技有限公司
- 483、上海影创科技
- 484、成都艾拉物联
- 485、北京客邻尚品网络技术有限公司
- 486、IT实战联盟
- 487、杭州尤拉夫科技有限公司
- 488、中大检测(湖南)股份有限公司
- 489、江苏电老虎工业互联网股份有限公司
- 490、上海助通信息科技有限公司
- 491、北京符节科技有限公司
- 492、杭州英祐科技有限公司
- 493、江苏电老虎工业互联网股份有限公司
- 494、深圳市点猫科技有限公司
- 495、杭州天音
- 496、深圳市二十一科技互联网有限公司
- 497、海南海口翎度科技
- 498、北京小趣智品科技有限公司
- 499、广州石竹计算机软件有限公司
- 500、深圳市惟客数据科技有限公司
- 501、中国医疗器械有限公司
- 502、上海云谦科技有限公司
- 503、上海磐农信息科技有限公司
- 504、广州领航食品有限公司
- 505、青岛掌讯通区块链科技有限公司
- 506、北京新网数码信息技术有限公司
- 507、超体信息科技(深圳)有限公司
- 508、长沙店帮手信息科技有限公司
- 509、上海助弓装饰工程有限公司
- 510、杭州寻联网络科技有限公司
- 511、成都大淘客科技有限公司
- 512、松果出行
- 513、深圳市唤梦科技有限公司
- 514、上汽集团商用车技术中心
- 515、北京中航讯科技股份有限公司
- 516、北龙中网(北京)科技有限责任公司
- 517、前海超级前台(深圳)信息技术有限公司
- 518、上海中商网络股份有限公司
- 519、上海助通信息科技有限公司
- 520、宁波聚臻智能科技有限公司
- 521、上海零动数码科技股份有限公司
- 522、浙江学海教育科技有限公司
- 523、聚学云(山东)信息技术有限公司
- 524、多氟多新材料股份有限公司
- 525、智慧眼科技股份有限公司
- 526、广东智通人才连锁股份有限公司
- 527、世纪开元智印互联科技集团股份有限公司
- 528、北京理想汽车【理想汽车】
- 529、巽逸科技(重庆)有限公司
- 530、义乌购电子商务有限公司
- 531、深圳市珂莱蒂尔服饰有限公司
- 532、江西国泰利民信息科技有限公司
- 533、广西广电大数据科技有限公司
- 534、杭州艾麦科技有限公司
- 535、广州小滴科技有限公司
- 536、佳缘科技股份有限公司
- 537、上海深擎信息科技有限公司
- 538、武商网
- 539、福建民本信息科技有限公司
- 540、杭州惠合信息科技有限公司
- 541、厦门爱立得科技有限公司
- 542、成都拟合未来科技有限公司
- 543、宁波聚臻智能科技有限公司
- 544、广东百慧科技有限公司
- 545、笨马网络
- 546、深圳市信安数字科技有限公司
- 547、深圳市思乐数据技术有限公司
- 548、四川绿源集科技有限公司
- 549、湖南云医链生物科技有限公司
- 550、杭州源诚科技有限公司
- 551、北京开课吧科技有限公司
- 552、北京多来点信息技术有限公司
- 553、JEECG BOOT低代码开发平台
- 554、苏州同元软控信息技术有限公司
- 555、江苏大泰信息技术有限公司
- 556、北京大禹汇智
- 557、北京盛哲科技有限公司
- 558、广州钛动科技有限公司
- 559、北京大禹汇智科技有限公司
- 560、湖南鼎翰文化股份有限公司
- 561、苏州安软信息科技有限公司
- 562、芒果tv
- 563、上海艺赛旗软件股份有限公司
- 564、中盈优创资讯科技有限公司
- 565、乐乎公寓
- 566、启明信息
- 567、苏州安软
- 568、南京富金的软件科技有限公司
- 569、深圳市新科聚合网络技术有限公司
- 570、你好现在(北京)科技股份有限公司
- 571、360考试宝典
- 572、北京一零科技有限公司
- 573、厦门星纵信息
- 574、Dalligent Solusi Indonesia
- 575、深圳华普物联科技有限公司
- 576、深圳行健自动化股份有限公司
- 577、深圳市富融信息科技服务有限公司
- 578、蓝鸟云
- 579、上海澎博财经资讯有限公司
- 580、北京小鸦科技有限公司
- 581、杭州盈泉云科技有限公司
- 582、惟客数据
- 583、GOSO香蜜闺秀
- 584、普乐师(上海)数字科技有限公司
- 585、西安市雁塔区咖北堂网络科技部
- 586、宁波聚臻智能科技有限公司
- 587、普乐师数字科技有限公司
- 588、江苏蟹联网科技有限公司
- 589、杭州未智科技有限公司
- 590、安吉智行物流有限公司
- 591、华生大家居集团有限公司
- 592、美心食品(广州)有限公司
- 593、货拉拉【货拉拉APP】
- 594、杭州思韬瑞科技有限公司
- 595、杭州玖融科技有限公司
- 596、北京优海网络科技有限公司
- 597、浙江大维高新技术股份有限公司
- 598、粤港澳大湾区数字经济研究院
- 599、普康(杭州)健康科技有限公司
- 600、华西证券股份有限公司【华西证券】
- 601、杭州海康机器人股份有限公司【海康】
- 602、河南宸邦信息技术有限公司
- 603、成都次元节点网络科技有限公司
- 604、富士康科技集团【富士康】
- 605、青岛东软载波科技股份有限公司
- 606、小菊快跑科技有限公司
- 607、视源股份
- 608、宁波聚臻智能科技有限公司
- 609、阔天科技有限公司
- 610、网宿科技有限公司
- 611、南京梵鼎信息技术有限公司
- 612、房天下【房天下】
- 613、特瓦特能源科技有限公司
- 614、拓迪智能科技有限公司
- 615、东软集团【东软】
- 616、开普云
- 617、领课网络
- 618、南京特维软件有限公司
- 619、福建易联众保睿通信息科技有限公司
- 620、浙江核心同花顺金融科技有限公司【同花顺】
- 621、浙江博观瑞思科技有限公司
- 622、北京新美互通科技有限公司
- 623、北京有生博大软件股份有限公司
- 624、时代中国
- 625、鱼泡网
- 626、一粒方糖(安徽)科技有限公司
- 627、北京外研在线数字科技有限公司
- 628、德电(中国)通信技术有限公司
- 629、杭州寻联网络科技有限公司
- 630、橙联(中国)有限公司
- 631、北京承启通科技有限公司
- 632、银联数据服务有限公司【银联】
- 633、上海晶确科技有限公司
- 634、亚信科技有限公司
- 635、福建新航物联网科技有限公司
- 636、上扬软件
- 637、深蓝汽车科技有限公司
- 638、南昌节点汇智科技有限公司
- 639、锐明技术
- 640、再造再生健康科技有限公司
- 641、华宝证券
- 642、卓正医疗
- 643、深圳湛信科技
- 644、陕西鑫众为软件有限公司
- 645、深圳市润农科技有限公司
- 646、庚商教育智能科技有限公司
- 647、杭州祎声科技
- 648、四川久远银海软件股份有限公司
- 649、GeeFox极狐低代码
- 650、浙江和仁科技股份有限公司
- 651、宁波聚臻智能科技有限公司
- 652、福建福昕软件开发股份有限公司【福昕】
- 653、广州中长康达信息技术有限公司
- 654、武汉趣改信息科技有限公司
- 655、北京华夏思源科技发展有限公司
- 656、宁波关关通科技有限公司
- 657、青岛吕氏餐饮有限公司
- 658、杭州乐刻网络科技有限公司
- 659、上海红瓦信息科技有限公司
- 660、陕西旅小宝信息科技有限公司
- 661、中科卓恒(大连)科技有限公司
- 662、北京华益精点生物技术有限公司
- 663、马士基(中国)航运有限公司【马士基】
- 664、陕西美咚网络科技有限公司
- 665、山东新北洋信息技术股份有限公司
- 666、福建中瑞文化发展集团有限公司
- 667、黑龙江省建工集团有限责任公司【黑龙江省建工】
- 668、志信能达安全科技(广州)有限公司
- 669、重庆开源共创科技有限公司
- 670、华泰人寿保险股份有限公司【华泰人寿】
- 671、成都盘古纵横集团
- 672、北京果果乐学科技有限公司
- 673、北京凌云空间科技有限公司
- 674、临工重机股份有限公司
- 675、上海热风时尚管理集团【热风】
- 676、HashKey Exchange
- 677、傲基(深圳)跨境商务股份有限公司
- 678、青岛文达通科技股份有限公司
- 679、杭州普罗云科技有限公司
- 680、浙江云鹭科技有限公司
- 681、中山市芯宏柿网络科技有限公司
- 682、深圳市家家顺物联科技
- 683、重庆斑西科技有限公司
- 684、福建省泰古信息技术有限公司
- 685、贵阳永青仪电科技有限公司
- 686、广州博依特智能信息科技有限公司
- 687、河南宠呦呦信息技术有限公司
- 688、陕西星邑空间技术有限公司
- 689、广东西欧克实业有限公司
- 690、唱吧麦颂KTV
- 691、联通云
- 692、北京爱话本科技有限公司
- 693、北京起创科技有限公司
- 694、平安证券【平安证券】
- 695、合肥中科类脑智能技术有限公司
- 696、南京同仁堂健康产业有限公司【同仁堂】
- 697、铜仁市碧江区智惠加油站
- 698、惟客数据
- 699、凤凰新闻【凤凰新闻】
- 700、深圳王力智能
- 701、返利网数字科技股份有限公司
- 702、上海阜能信息科技有限公司
- 703、深圳市极能超电数字科技有限公司
- 704、海目星激光科技集团股份有限公司
- 705、安克创新科技股份有限公司【安克】
- 706、大庆点神科技有限公司
- 707、浙江零跑科技股份有限公司【零跑】
- 708、成都成电金盘健康数据技术有限公司
- 709、成都极米科技股份有限公司【极米】
- 710、顺德职业技术大学
- 711、中邮证券有限责任公司【中邮证券】
- 712、志豪链云科技有限公司
- 713、湖南万鲸科技有限公司
- 714、广州万表
- 715、再惠(上海)网络科技有限公司
- 716、上海爱诚裕信息科技有限公司
- 717、杭州迈瑞数字科技有限公司
- 718、广州串联网络科技有限公司
- ……
> 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。
欢迎大家的关注和使用,XXL-JOB也将拥抱变化,持续发展。
## Contributing
Contributions are welcome! Open a pull request to fix a bug, or open an [Issue](https://github.com/xuxueli/xxl-job/issues/) to discuss a new feature or change.
欢迎参与项目贡献!比如提交PR修复一个bug,或者新建 [Issue](https://github.com/xuxueli/xxl-job/issues/) 讨论新特性或者变更。
## Copyright and License
This product is open source and free, and will continue to provide free community technical support. Individual or enterprise users are free to access and use.
- Licensed under the GNU General Public License (GPL) v3.
- Copyright (c) 2015-present, xuxueli.
产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。如有需要可 [邮件联系](https://www.xuxueli.com/page/community.html) 作者免费获取项目授权。
================================================
FILE: doc/XXL-JOB-English-Documentation.md
================================================
## 《Distributed task scheduling framework XXL-JOB》
[](https://github.com/xuxueli/xxl-job/actions)
[](https://central.sonatype.com/artifact/com.xuxueli/xxl-job-core)
[](https://github.com/xuxueli/xxl-job/releases)
[](https://github.com/xuxueli/xxl-job/)
[](https://hub.docker.com/r/xuxueli/xxl-job-admin/)
[](http://www.gnu.org/licenses/gpl-3.0.html)
[](https://www.xuxueli.com/page/donate.html)
[TOCM]
[TOC]
## 1. Brief introduction
### 1.1 Overview
XXL-JOB is a distributed task scheduling framework, the core design goal is to develop quickly, learning simple, lightweight, easy to expand. Is now open source and access to a number of companies online product line, download and use it now.
> English document update slightly delayed, Please check the Chinese version for the latest document.
### 1.2 Features
- 1.Simple: support through the Web page on the task CRUD operation, simple operation, a minute to get started;
- 2.Dynamic: support dynamic modification of task status, pause / resume tasks, and termination of running tasks,immediate effect;
- 3.Dispatch center HA (center type): Dispatch with central design, "dispatch center" based on the cluster of Quartz implementation, can guarantee the scheduling - center HA;
- 4.Executor HA (Distributed): Task Distributed Execution, Task " Executer " supports cluster deployment to ensure that tasks perform HA;
- 5.Task Failover: Deploy the Excutor cluster,tasks will be smooth to switch excuter when the strategy of the router choose ‘failover’;
- 6.Consistency: "Dispatch Center" through the DB lock to ensure the consistency of cluster distributed scheduling,one task excuted for once;
- 7.Custom task parameters: support online configuration scheduling tasks into the parameters, immediate effect;
- 8.Scheduling thread pool: scheduling system multi-threaded trigger scheduling operation, to ensure accurate scheduling, not blocked;
- 9.Elastic expansion capacity: once the new executor machine on the line or off the assembly line, the next time scheduling will be re-assigned tasks;
- 10.Mail alarm: the task fails to support e-mail alarm, support configuring multiple email addresses to send bulk alert messages;
- 11.Status monitoring: support real-time monitoring of the progress of the task;
- 12.Rolling execution log: support online view scheduling results, and support Rolling real-time view of the executer output of the complete implementation of the log;
- 13.GLUE: provide Web IDE, support online development task logic code, dynamic release, real-time compiler effective, omit the deployment of the on-line process. Supports historical versions of 30 versions back;
- 14.Data Encryption: The communication between the dispatching center and the executor is used for data encryption, Enhancing the security of dispatching information;
- 15.Task Dependency: Support configuration subtask dependencies, When the parent task executed end and after the success of the implementation will take the initiative to trigger a second task execution, multiple sub tasks are separated by commas;
- 16.Push the Maven central warehouse: The latest stable version will be sent to the Maven central warehouse to facilitate user access and use;
- 17.Task registration: The executor automatically registers tasks periodically, and the dispatch center automatically finds the registered tasks and triggers execution. It also supports manual input of executor address;
- 18.Router strategy: A rich routing strategy is provided when the executor cluster is deployed, these include: first, last, poll, random, consistent HASH, least frequently used, least recently used, failover, busy over, sharding broadcast,etc.;
- 19.Report monitor: Support real-time view of running data, such as the number of tasks, the number of dispatch, the number of executors, etc .; and scheduling reports, such as scheduling date distribution, scheduling success map;
- 20.Script task: Support the development and operation of script tasks in GLUE mode, including shell, Python and other types of script;
- 21.Blocking handling strategy: The scheduling is too dense and the executor is too late to handle. The strategy includes: single machine serial (default), discarding the following scheduling, and Override the previous scheduling;
- 22.Failure handling strategy:Handling strategy when scheduling fails, the strategy includes: failure alarm (default), failure retry;
- 23.Sharding broadcast task: When an executor cluster is deployed, task routing strategy select "sharding broadcast", a task schedule will broadcast all the actuators in the cluster to perform it once, you can develop sharding tasks based on sharding parameters;
- 24.Dynamic sharding: The sharding broadcast task is sharded by the executors to support the dynamic expansion of the executor cluster to dynamically increase the number of shardings and cooperate with the business handle; In the large amount of data operations can significantly improve the task processing capacity and speed.
- 25、Event trigger:In addition to "Cron" and "Task Dependency" to trigger tasks, support event-based triggering tasks. The dispatch center provides API service that triggers a single execution of the task, it can be triggered flexibly according to business events.
### 1.3 Development
In 2015, I created the XXL-JOB project repository on github and submitted the first commit, followed by the system structure design, UI selection, interactive design ...
In 2015 - November, XXL-JOB finally RELEASE the first big version of V1.0, then I will be released to OSCHINA, XXL-JOB OSCHINA won the popular recommendation of @红薯, the same period reached OSCHINA's " Popular move "ranked first and git.oschina open source software monthly heat ranked first, especially thanks for @红薯, thank you for the attention and support.
In 2015 - December, I will XXL-JOB published to our internal knowledge base, and get internal colleagues recognized.
In 2016 - 01 months, my company started XXL-JOB internal access and custom work, in this thank Yuan and Yin two colleagues contribution, but also to thank the internal other attention and support colleagues.
In 2017-05-13, the link of "let the code run" in "[the 62nd source of open source China Genesis](https://www.oschina.net/event/2236961)" held in Shanghai,, I stepped on and made a speech about the XXL-JOB, five hundred spectators in the audience reacted enthusiastically ([pictorial review](https://www.oschina.net/question/2686220_2242120)).
> Our company have access to XXL-JOB, internal alias "Ferrari" (Ferrari based on XXL-JOB V1.1 version customization, new access application recommended to upgrade the latest version).
According to the latest statistics, from 2016-01-21 to 2017-07-07 period, the system has been scheduled about 600,000 times, outstanding performance. New access applications recommend the latest version, because after several major updates, the system's task model, UI interaction model and the underlying scheduling communication model has a greater optimization and upgrading, the core function more stable and efficient.
So far, XXL-JOB has access to a number of companies online product line, access to scenes such as electronic commerce, O2O business and large data operations, as of 2016-07-19, XXL-JOB has access to the company But not limited to:
- 1、大众点评【美团点评】
- 2、山东学而网络科技有限公司;
- 3、安徽慧通互联科技有限公司;
- 4、人人聚财金服;
- 5、上海棠棣信息科技股份有限公司
- 6、运满满【运满满】
- 7、米其林 (中国区)【米其林】
- 8、妈妈联盟
- 9、九樱天下(北京)信息技术有限公司
- 10、万普拉斯科技有限公司【一加手机】
- 11、上海亿保健康管理有限公司
- 12、海尔馨厨【海尔】
- 13、河南大红包电子商务有限公司
- 14、成都顺点科技有限公司
- 15、深圳市怡亚通
- 16、深圳麦亚信科技股份有限公司
- 17、上海博莹科技信息技术有限公司
- 18、中国平安科技有限公司【中国平安】
- 19、杭州知时信息科技有限公司
- 20、博莹科技(上海)有限公司
- 21、成都依能股份有限责任公司
- 22、湖南高阳通联信息技术有限公司
- 23、深圳市邦德文化发展有限公司
- 24、福建阿思可网络教育有限公司
- 25、优信二手车【优信】
- 26、上海悠游堂投资发展股份有限公司【悠游堂】
- 27、北京粉笔蓝天科技有限公司
- 28、中秀科技(无锡)有限公司
- 29、武汉空心科技有限公司
- 30、北京蚂蚁风暴科技有限公司
- 31、四川互宜达科技有限公司
- 32、钱包行云(北京)科技有限公司
- 33、重庆欣才集团
- 34、咪咕互动娱乐有限公司【中国移动】
- 35、北京诺亦腾科技有限公司
- 36、增长引擎(北京)信息技术有限公司
- 37、北京英贝思科技有限公司
- 38、刚泰集团
- 39、深圳泰久信息系统股份有限公司
- 40、随行付支付有限公司
- 41、广州瀚农网络科技有限公司
- 42、享点科技有限公司
- 43、杭州比智科技有限公司
- 44、圳临界线网络科技有限公司
- 45、广州知识圈网络科技有限公司
- 46、国誉商业上海有限公司
- 47、海尔消费金融有限公司,嗨付、够花【海尔】
- 48、广州巴图鲁信息科技有限公司
- 49、深圳市鹏海运电子数据交换有限公司
- 50、深圳市亚飞电子商务有限公司
- 51、上海趣医网络有限公司
- 52、聚金资本
- 53、北京父母邦网络科技有限公司
- 54、中山元赫软件科技有限公司
- 55、中商惠民(北京)电子商务有限公司
- 56、凯京集团
- 57、华夏票联(北京)科技有限公司
- 58、拍拍贷【拍拍贷】
- 59、北京尚德机构在线教育有限公司
- 60、任子行股份有限公司
- 61、北京时态电子商务有限公司
- 62、深圳卷皮网络科技有限公司
- 63、北京安博通科技股份有限公司
- 64、未来无线网
- 65、厦门瓷禧网络有限公司
- 66、北京递蓝科软件股份有限公司
- 67、郑州创海软件科技公司
- 68、北京国槐信息科技有限公司
- 69、浪潮软件集团
- 70、多立恒(北京)信息技术有限公司
- 71、广州极迅客信息科技有限公司
- 72、赫基(中国)集团股份有限公司
- 73、海投汇
- 74、上海润益创业孵化器管理股份有限公司
- 75、汉纳森(厦门)数据股份有限公司
- 76、安信信托
- 77、岚儒财富
- 78、捷道软件
- 79、湖北享七网络科技有限公司
- 80、湖南创发科技责任有限公司
- 81、深圳小安时代互联网金融服务有限公司
- 82、湖北享七网络科技有限公司
- 83、钱包行云(北京)科技有限公司
- 84、360金融【360】
- 85、易企秀
- 86、摩贝(上海)生物科技有限公司
- 87、广东芯智慧科技有限公司
- 88、联想集团【联想】
- 89、怪兽充电
- 90、行圆汽车
- 91、深圳店店通科技邮箱公司
- 92、京东【京东】
- 93、米庄理财
- 94、咖啡易融
- 95、梧桐诚选
- 96、恒大地产【恒大】
- 97、昆明龙慧
- 98、上海涩瑶软件
- 99、易信【网易】
- 100、铜板街
- 101、杭州云若网络科技有限公司
- 102、特百惠(中国)有限公司
- 103、常山众卡运力供应链管理有限公司
- 104、深圳立创电子商务有限公司
- 105、杭州智诺科技股份有限公司
- 106、北京云漾信息科技有限公司
- 107、深圳市多银科技有限公司
- 108、亲宝宝
- 109、上海博卡软件科技有限公司
- 110、智慧树在线教育平台
- 111、米族金融
- 112、北京辰森世纪
- 113、云南滇医通
- 114、广州市分领网络科技有限责任公司
- 115、浙江微能科技有限公司
- 116、上海馨飞电子商务有限公司
- 117、上海宝尊电子商务有限公司
- 118、直客通科技技术有限公司
- 119、科度科技有限公司
- 120、上海数慧系统技术有限公司
- 121、我的医药网
- 122、多粉平台
- 123、铁甲二手机
- 124、上海海新得数据技术有限公司
- 125、深圳市珍爱网信息技术有限公司【珍爱网】
- 126、小蜜蜂
- 127、吉荣数科技
- 128、上海恺域信息科技有限公司
- 129、广州荔支网络有限公司【荔枝FM】
- 130、杭州闪宝科技有限公司
- 131、北京互联新网科技发展有限公司
- 132、誉道科技
- 133、山西兆盛房地产开发有限公司
- 134、北京蓝睿通达科技有限公司
- 135、月亮小屋(中国)有限公司【蓝月亮】
- 136、青岛国瑞信息技术有限公司
- 137、博雅云计算(北京)有限公司
- 138、华泰证券香港子公司
- 139、杭州东方通信软件技术有限公司
- 140、武汉博晟安全技术股份有限公司
- 141、深圳市六度人和科技有限公司
- 142、杭州趣维科技有限公司(小影)
- 143、宁波单车侠之家科技有限公司【单车侠】
- 144、丁丁云康信息科技(北京)有限公司
- 145、云钱袋
- 146、南京中兴力维
- 147、上海矽昌通信技术有限公司
- 148、深圳萨科科技
- 149、中通服创立科技有限责任公司
- 150、深圳市对庄科技有限公司
- 151、上证所信息网络有限公司
- 152、杭州火烧云科技有限公司【婚礼纪】
- 153、天津青芒果科技有限公司【芒果头条】
- 154、长飞光纤光缆股份有限公司
- 155、世纪凯歌(北京)医疗科技有限公司
- 156、浙江霖梓控股有限公司
- 157、江西腾飞网络技术有限公司
- 158、安迅物流有限公司
- 159、肉联网
- 160、北京北广梯影广告传媒有限公司
- 161、上海数慧系统技术有限公司
- 162、大志天成
- 163、上海云鹊医
- 164、上海云鹊医
- 165、墨迹天气【墨迹天气】
- 166、上海逸橙信息科技有限公司
- 167、沅朋物联
- 168、杭州恒生云融网络科技有限公司
- 169、绿米联创
- 170、重庆易宠科技有限公司
- 171、安徽引航科技有限公司(乐职网)
- 172、上海数联医信企业发展有限公司
- 173、良彬建材
- 174、杭州求是同创网络科技有限公司
- 175、荷马国际
- 176、点雇网
- 177、深圳市华星光电技术有限公司
- 178、厦门神州鹰软件科技有限公司
- 179、深圳市招商信诺人寿保险有限公司
- 180、上海好屋网信息技术有限公司
- 181、海信集团【海信】
- 182、信凌可信息科技(上海)有限公司
- 183、长春天成科技发展有限公司
- 184、用友金融信息技术股份有限公司【用友】
- 185、北京咖啡易融有限公司
- 186、国投瑞银基金管理有限公司
- 187、晋松(上海)网络信息技术有限公司
- 188、深圳市随手科技有限公司【随手记】
- 189、深圳水务科技有限公司
- 190、易企秀【易企秀】
- 191、北京磁云科技
- 192、南京蜂泰互联网科技有限公司
- 193、章鱼直播
- 194、奖多多科技
- 195、天津市神州商龙科技股份有限公司
- 196、岩心科技
- 197、车码科技(北京)有限公司
- 198、贵阳市投资控股集团
- 199、康旗股份
- 200、龙腾出行
- 201、杭州华量软件
- 202、合肥顶岭医疗科技有限公司
- 203、重庆表达式科技有限公司
- 204、上海米道信息科技有限公司
- 205、北京益友会科技有限公司
- 206、北京融贯电子商务有限公司
- 207、中国外汇交易中心
- 208、中国外运股份有限公司
- 209、中国上海晓圈教育科技有限公司
- 210、普联软件股份有限公司
- 211、北京科蓝软件股份有限公司
- 212、江苏斯诺物联科技有限公司
- 213、北京搜狐-狐友【搜狐】
- 214、新大陆网商金融
- 215、山东神码中税信息科技有限公司
- 216、河南汇顺网络科技有限公司
- 217、北京华夏思源科技发展有限公司
- 218、上海东普信息科技有限公司
- 219、上海鸣勃网络科技有限公司
- 220、广东学苑教育发展有限公司
- 221、深圳强时科技有限公司
- 222、上海云砺信息科技有限公司
- 223、重庆愉客行网络有限公司
- 224、数云
- 225、国家电网运检部
- 226、杭州找趣
- 227、浩鲸云计算科技股份有限公司
- 228、科大讯飞【科大讯飞】
- 229、杭州行装网络科技有限公司
- 230、即有分期金融
- 231、深圳法司德信息科技有限公司
- 232、上海博复信息科技有限公司
- 233、杭州云嘉云计算有限公司
- 234、有家民宿(有家美宿)
- 235、北京赢销通软件技术有限公司
- 236、浙江聚有财金融服务外包有限公司
- 237、易族智汇(北京)科技有限公司
- 238、合肥顶岭医疗科技开发有限公司
- 239、车船宝(深圳)旭珩科技有限公司)
- 240、广州富力地产有限公司
- 241、氢课(上海)教育科技有限公司
- 242、武汉氪细胞网络技术有限公司
- 243、杭州有云科技有限公司
- 244、上海仙豆智能机器人有限公司
- 245、拉卡拉支付股份有限公司【拉卡拉】
- 246、虎彩印艺股份有限公司
- 247、北京数微科技有限公司
- 248、广东智瑞科技有限公司
- 249、找钢网
- 250、九机网
- 251、杭州跑跑网络科技有限公司
- 252、深圳未来云集
- 253、杭州每日给力科技有限公司
- 254、上海齐犇信息科技有限公司
- 255、滴滴出行【滴滴】
- 256、合肥云诊信息科技有限公司
- 257、云知声智能科技股份有限公司
- 258、南京坦道科技有限公司
- 259、爱乐优(二手平台)
- 260、猫眼电影(私有化部署)【猫眼电影】
- 261、美团大象(私有化部署)【美团大象】
- 262、作业帮教育科技(北京)有限公司【作业帮】
- 263、北京小年糕互联网技术有限公司
- 264、山东矩阵软件工程股份有限公司
- 265、陕西国驿软件科技有限公司
- 266、君开信息科技
- 267、村鸟网络科技有限责任公司
- 268、云南国际信托有限公司
- 269、金智教育
- 270、珠海市筑巢科技有限公司
- 271、上海百胜软件股份有限公司
- 272、深圳市科盾科技有限公司
- 273、哈啰出行
- 274、途虎养车
- 275、卡思优派人力资源集团
- 276、南京观为智慧软件科技有限公司
- 277、杭州城市大脑科技有限公司
- 278、猿辅导【猿辅导】
- 279、洛阳健创网络科技有限公司
- 280、魔力耳朵
- 281、亿阳信通
- 282、上海招鲤科技有限公司
- 283、四川商旅无忧科技服务有限公司
- 284、UU跑腿
- 285、北京老虎证券【老虎证券】
- 286、悠活省吧(北京)网络科技有限公司
- 287、F5未来商店
- 288、深圳环阳通信息技术有限公司
- 289、遠傳電信
- 290、作业帮(北京)教育科技有限公司【作业帮】
- 291、成都科鸿智信科技有限公司
- 292、北京木屋时代科技有限公司
- 293、大学通(哈尔滨)科技有限责任公司
- 294、浙江华坤道威数据科技有限公司
- 295、吉祥航空【吉祥航空】
- 296、南京圆周网络科技有限公司
- 297、广州市洋葱omall电子商务
- 298、天津联物科技有限公司
- 299、跑哪儿科技(北京)有限公司
- 300、深圳市美西西餐饮有限公司(喜茶)
- 301、平安不动产有限公司【平安】
- 302、江苏中海昇物联科技有限公司
- 303、湖南牙医帮科技有限公司
- 304、重庆民航凯亚信息技术有限公司(易通航)
- 305、递易(上海)智能科技有限公司
- 306、亚朵
- 307、浙江新课堂教育股份有限公司
- 308、北京蜂创科技有限公司
- 309、德一智慧城市信息系统有限公司
- 310、北京翼点科技有限公司
- 311、湖南智数新维度信息科技有限公司
- 312、北京玖扬博文文化发展有限公司
- 313、上海宇珩信息科技有限公司
- 314、全景智联(武汉)科技有限公司
- 315、天津易客满国际物流有限公司
- 316、南京爱福路汽车科技有限公司
- 317、我房旅居集团
- 318、湛江亲邻科技有限公司
- 319、深圳市姜科网络有限公司
- 320、青岛日日顺物流有限公司
- 321、南京太川信息技术有限公司
- 322、美图之家科技优先公司【美图】
- 323、南京太川信息技术有限公司
- 324、众薪科技(北京)有限公司
- 325、武汉安安物联科技有限公司
- 326、北京智客朗道网络科技有限公司
- 327、深圳市超级猩猩健身管理管理有限公司
- 328、重庆达志科技有限公司
- 329、上海享评信息科技有限公司
- 330、薪得付信息科技
- 331、跟谁学
- 332、中道(苏州)旅游网络科技有限公司
- 333、广州小卫科技有限公司
- 334、上海非码网络科技有限公司
- 335、途家网网络技术(北京)有限公司【途家】
- 336、广州辉凡信息科技有限公司
- 337、天维尔信息科技股份有限公司
- 338、上海极豆科技有限公司
- 339、苏州触达信息技术有限公司
- 340、北京热云科技有限公司
- 341、中智企服(北京)科技有限公司
- 342、易联云计算(杭州)有限责任公司
- 343、青岛航空股份有限公司【青岛航空】
- 344、山西博睿通科技有限公司
- 345、网易杭州网络有限公司【网易】
- 346、北京果果乐学科技有限公司
- 347、百望股份有限公司
- 348、中保金服(深圳)科技有限公司
- 349、天津运友物流科技股份有限公司
- 350、广东创能科技股份有限公司
- 351、上海倚博信息科技有限公司
- 352、深圳百果园实业(集团)股份有限公司
- 353、广州细刻网络科技有限公司
- 354、武汉鸿业众创科技有限公司
- 355、金锡科技(广州)有限公司
- 356、易瑞国际电子商务有限公司
- 357、奇点云
- 358、中视信息科技有限公司
- 359、开源项目:datax-web
- 360、云知声智能科技股份有限公司
- 361、开源项目:bboss
- 362、成都深驾科技有限公司
- 363、FunPlus【趣加】
- 364、杭州创匠信科技有限公司
- 365、龙匠(北京)科技发展有限公司
- 366、广州一链通互联网科技有限公司
- 367、上海星艾网络科技有限公司
- 368、虎博网络技术(上海)有限公司
- 369、青岛优米信息技术有限公司
- 370、八维通科技有限公司
- 371、烟台合享智星数据科技有限公司
- 372、东吴证券股份有限公司
- 373、中通云仓股份有限公司【中通】
- 374、北京加菲猫科技有限公司
- 375、北京匠心演绎科技有限公司
- 376、宝贝走天下
- 377、厦门众库科技有限公司
- 378、海通证券数据中心
- 389、湖南快乐通宝小额贷款有限公司
- 380、浙江大华技术股份有限公司
- 381、杭州魔筷科技有限公司
- 382、青岛掌讯通区块链科技有限公司
- 383、新大陆金融科技
- 384、常州玺拓软件科技有限公司
- 385、北京正保网格教育科技有限公司
- 386、统一企业(中国)投资有限公司【统一】
- 387、微革网络科技有限公司
- 388、杭州融易算科技有限公司
- 399、青岛上啥班网络科技有限公司
- 390、京东酒世界
- 391、杭州爱博仕科技有限公司
- 392、五星金服控股有限公司
- 393、福建乐摩物联科技有限公司
- 394、百炼智能科技有限公司
- 395、山东能源数智云科技有限公司
- 396、招商局能源运输股份有限公司
- 397、三一集团【三一】
- 398、东巴文(深圳)健康管理有限公司
- 399、索易软件
- 400、深圳市宁远科技有限公司
- 401、熙牛医疗
- 402、南京智鹤电子科技有限公司
- 403、嘀嗒出行【嘀嗒出行】
- 404、广州虎牙信息科技有限公司【虎牙】
- 405、广州欧莱雅百库网络科技有限公司【欧莱雅】
- 406、微微科技有限公司
- 407、我爱我家房地产经纪有限公司【我爱我家】
- 408、九号发现
- 409、薪人薪事
- 410、武汉氪细胞网络技术有限公司
- 411、广州市斯凯奇商业有限公司
- 412、微淼商学院
- 413、杭州车盛科技有限公司
- 414、深兰科技(上海)有限公司
- 415、安徽中科美络信息技术有限公司
- 416、比亚迪汽车工业有限公司【比亚迪】
- 417、湖南小桔信息技术有限公司
- 418、安徽科大国创软件科技有限公司
- 419、克而瑞
- 420、陕西云基华海信息技术有限公司
- 421、安徽深宁科技有限公司
- 422、广东康爱多数字健康有限公司
- 423、嘉里电子商务
- 424、上海时代光华教育发展有限公司
- 425、CityDo
- 426、上海禹知信息科技有限公司
- 427、广东智瑞科技有限公司
- 428、西安爱铭网络科技有限公司
- 429、心医国际数字医疗系统(大连)有限公司
- 430、乐其电商
- 431、锐达科技
- 432、天津长城滨银汽车金融有限公司
- 433、代码网
- 434、东莞市东城乔伦软件开发工作室
- 435、浙江百应科技有限公司
- 436、上海力爱帝信息技术有限公司(Red E)
- 437、云徙科技有限公司
- 438、北京康智乐思网络科技有限公司【大姨吗APP】
- 439、安徽开元瞬视科技有限公司
- 440、立方
- 441、厦门纵行科技
- 442、乐山-菲尼克斯半导体有限公司
- 443、武汉光谷联合集团有限公司
- 444、上海金仕达软件科技有限公司
- 445、深圳易世通达科技有限公司
- 446、爱动超越人工智能科技(北京)有限责任公司
- 447、迪普信(北京)科技有限公司
- 448、掌站科技(北京)有限公司
- 449、深圳市华云中盛股份有限公司
- 450、上海原圈科技有限公司
- 451、广州赞赏信息科技有限公司
- 452、Amber Group
- 453、德威国际货运代理(上海)公司
- 454、浙江杰夫兄弟智慧科技有限公司
- 455、信也科技
- 456、开思时代科技(深圳)有限公司
- 457、大连槐德科技有限公司
- 458、同程生活
- 459、松果出行
- 460、企鹅杏仁集团
- 461、宁波科云信息科技有限公司
- 462、上海格蓝威驰信息科技有限公司
- 463、杭州趣淘鲸科技有限公司
- 464、湖州市数字惠民科技有限公司
- 465、乐普(北京)医疗器械股份有限公司
- 466、广州市晴川高新技术开发有限公司
- 467、山西缇客科技有限公司
- 468、徐州卡西穆电子商务有限公司
- 469、格创东智科技有限公司
- 470、世纪龙信息网络有限责任公司
- 471、邦道科技有限公司
- 472、河南中盟新云科技股份有限公司
- 473、横琴人寿保险有限公司
- 474、上海海隆华钟信息技术有限公司
- 475、上海久湛
- 476、上海仙豆智能机器人有限公司
- 477、广州汇尚网络科技有限公司
- 478、深圳市阿卡索资讯股份有限公司
- 479、青岛佳家康健康管理有限责任公司
- 480、蓝城兄弟
- 481、成都天府通金融服务股份有限公司
- 482、深圳云镖网络科技有限公司
- 483、上海影创科技
- 484、成都艾拉物联
- 485、北京客邻尚品网络技术有限公司
- 486、IT实战联盟
- 487、杭州尤拉夫科技有限公司
- 488、中大检测(湖南)股份有限公司
- 489、江苏电老虎工业互联网股份有限公司
- 490、上海助通信息科技有限公司
- 491、北京符节科技有限公司
- 492、杭州英祐科技有限公司
- 493、江苏电老虎工业互联网股份有限公司
- 494、深圳市点猫科技有限公司
- 495、杭州天音
- 496、深圳市二十一科技互联网有限公司
- 497、海南海口翎度科技
- 498、北京小趣智品科技有限公司
- 499、广州石竹计算机软件有限公司
- 500、深圳市惟客数据科技有限公司
- 501、中国医疗器械有限公司
- 502、上海云谦科技有限公司
- 503、上海磐农信息科技有限公司
- 504、广州领航食品有限公司
- 505、青岛掌讯通区块链科技有限公司
- 506、北京新网数码信息技术有限公司
- 507、超体信息科技(深圳)有限公司
- 508、长沙店帮手信息科技有限公司
- 509、上海助弓装饰工程有限公司
- 510、杭州寻联网络科技有限公司
- 511、成都大淘客科技有限公司
- 512、松果出行
- 513、深圳市唤梦科技有限公司
- 514、上汽集团商用车技术中心
- 515、北京中航讯科技股份有限公司
- 516、北龙中网(北京)科技有限责任公司
- 517、前海超级前台(深圳)信息技术有限公司
- 518、上海中商网络股份有限公司
- 519、上海助通信息科技有限公司
- 520、宁波聚臻智能科技有限公司
- 521、上海零动数码科技股份有限公司
- 522、浙江学海教育科技有限公司
- 523、聚学云(山东)信息技术有限公司
- 524、多氟多新材料股份有限公司
- 525、智慧眼科技股份有限公司
- 526、广东智通人才连锁股份有限公司
- 527、世纪开元智印互联科技集团股份有限公司
- 528、北京理想汽车【理想汽车】
- 529、巽逸科技(重庆)有限公司
- 530、义乌购电子商务有限公司
- 531、深圳市珂莱蒂尔服饰有限公司
- 532、江西国泰利民信息科技有限公司
- 533、广西广电大数据科技有限公司
- 534、杭州艾麦科技有限公司
- 535、广州小滴科技有限公司
- 536、佳缘科技股份有限公司
- 537、上海深擎信息科技有限公司
- 538、武商网
- 539、福建民本信息科技有限公司
- 540、杭州惠合信息科技有限公司
- 541、厦门爱立得科技有限公司
- 542、成都拟合未来科技有限公司
- 543、宁波聚臻智能科技有限公司
- 544、广东百慧科技有限公司
- 545、笨马网络
- 546、深圳市信安数字科技有限公司
- 547、深圳市思乐数据技术有限公司
- 548、四川绿源集科技有限公司
- 549、湖南云医链生物科技有限公司
- 550、杭州源诚科技有限公司
- 551、北京开课吧科技有限公司
- 552、北京多来点信息技术有限公司
- 553、JEECG BOOT低代码开发平台
- 554、苏州同元软控信息技术有限公司
- 555、江苏大泰信息技术有限公司
- 556、北京大禹汇智
- 557、北京盛哲科技有限公司
- 558、广州钛动科技有限公司
- 559、北京大禹汇智科技有限公司
- 560、湖南鼎翰文化股份有限公司
- 561、苏州安软信息科技有限公司
- 562、芒果tv
- 563、上海艺赛旗软件股份有限公司
- 564、中盈优创资讯科技有限公司
- 565、乐乎公寓
- 566、启明信息
- 567、苏州安软
- 568、南京富金的软件科技有限公司
- 569、深圳市新科聚合网络技术有限公司
- 570、你好现在(北京)科技股份有限公司
- 571、360考试宝典
- 572、北京一零科技有限公司
- 573、厦门星纵信息
- 574、Dalligent Solusi Indonesia
- 575、深圳华普物联科技有限公司
- 576、深圳行健自动化股份有限公司
- 577、深圳市富融信息科技服务有限公司
- 578、蓝鸟云
- 579、上海澎博财经资讯有限公司
- 580、北京小鸦科技有限公司
- 581、杭州盈泉云科技有限公司
- 582、惟客数据
- 583、GOSO香蜜闺秀
- 584、普乐师(上海)数字科技有限公司
- 585、西安市雁塔区咖北堂网络科技部
- 586、宁波聚臻智能科技有限公司
- 587、普乐师数字科技有限公司
- 588、江苏蟹联网科技有限公司
- 589、杭州未智科技有限公司
- 590、安吉智行物流有限公司
- 591、华生大家居集团有限公司
- 592、美心食品(广州)有限公司
- 593、货拉拉【货拉拉APP】
- 594、杭州思韬瑞科技有限公司
- 595、杭州玖融科技有限公司
- 596、北京优海网络科技有限公司
- 597、浙江大维高新技术股份有限公司
- 598、粤港澳大湾区数字经济研究院
- 599、普康(杭州)健康科技有限公司
- 600、华西证券股份有限公司【华西证券】
- 601、杭州海康机器人股份有限公司【海康】
- 602、河南宸邦信息技术有限公司
- 603、成都次元节点网络科技有限公司
- 604、富士康科技集团【富士康】
- 605、青岛东软载波科技股份有限公司
- 606、小菊快跑科技有限公司
- 607、视源股份
- 608、宁波聚臻智能科技有限公司
- 609、阔天科技有限公司
- 610、网宿科技有限公司
- 611、南京梵鼎信息技术有限公司
- 612、房天下【房天下】
- 613、特瓦特能源科技有限公司
- 614、拓迪智能科技有限公司
- 615、东软集团【东软】
- 616、开普云
- 617、领课网络
- 618、南京特维软件有限公司
- 619、福建易联众保睿通信息科技有限公司
- 620、浙江核心同花顺金融科技有限公司【同花顺】
- 621、浙江博观瑞思科技有限公司
- 622、北京新美互通科技有限公司
- 623、北京有生博大软件股份有限公司
- 624、时代中国
- 625、鱼泡网
- 626、一粒方糖(安徽)科技有限公司
- 627、北京外研在线数字科技有限公司
- 628、德电(中国)通信技术有限公司
- 629、杭州寻联网络科技有限公司
- 630、橙联(中国)有限公司
- 631、北京承启通科技有限公司
- 632、银联数据服务有限公司【银联】
- 633、上海晶确科技有限公司
- 634、亚信科技有限公司
- 635、福建新航物联网科技有限公司
- 636、上扬软件
- 637、深蓝汽车科技有限公司
- 638、南昌节点汇智科技有限公司
- 639、锐明技术
- 640、再造再生健康科技有限公司
- 641、华宝证券
- 642、卓正医疗
- 643、深圳湛信科技
- 644、陕西鑫众为软件有限公司
- 645、深圳市润农科技有限公司
- 646、庚商教育智能科技有限公司
- 647、杭州祎声科技
- 648、四川久远银海软件股份有限公司
- 649、GeeFox极狐低代码
- 650、浙江和仁科技股份有限公司
- 651、宁波聚臻智能科技有限公司
- 652、福建福昕软件开发股份有限公司【福昕】
- 653、广州中长康达信息技术有限公司
- 654、武汉趣改信息科技有限公司
- 655、北京华夏思源科技发展有限公司
- 656、宁波关关通科技有限公司
- 657、青岛吕氏餐饮有限公司
- 658、杭州乐刻网络科技有限公司
- 659、上海红瓦信息科技有限公司
- 660、陕西旅小宝信息科技有限公司
- 661、中科卓恒(大连)科技有限公司
- 662、北京华益精点生物技术有限公司
- 663、马士基(中国)航运有限公司【马士基】
- 664、陕西美咚网络科技有限公司
- 665、山东新北洋信息技术股份有限公司
- 666、福建中瑞文化发展集团有限公司
- 667、黑龙江省建工集团有限责任公司【黑龙江省建工】
- 668、志信能达安全科技(广州)有限公司
- 669、重庆开源共创科技有限公司
- 670、华泰人寿保险股份有限公司【华泰人寿】
- 671、成都盘古纵横集团
- 672、北京果果乐学科技有限公司
- 673、北京凌云空间科技有限公司
- 674、临工重机股份有限公司
- 675、上海热风时尚管理集团【热风】
- 676、HashKey Exchange
- 677、傲基(深圳)跨境商务股份有限公司
- 678、青岛文达通科技股份有限公司
- 679、杭州普罗云科技有限公司
- 680、浙江云鹭科技有限公司
- 681、中山市芯宏柿网络科技有限公司
- 682、深圳市家家顺物联科技
- 683、重庆斑西科技有限公司
- 684、福建省泰古信息技术有限公司
- 685、贵阳永青仪电科技有限公司
- 686、广州博依特智能信息科技有限公司
- 687、河南宠呦呦信息技术有限公司
- 688、陕西星邑空间技术有限公司
- 689、广东西欧克实业有限公司
- 690、唱吧麦颂KTV
- 691、联通云
- 692、北京爱话本科技有限公司
- 693、北京起创科技有限公司
- 694、平安证券【平安证券】
- 695、合肥中科类脑智能技术有限公司
- 696、南京同仁堂健康产业有限公司【同仁堂】
- 697、铜仁市碧江区智惠加油站
- 698、惟客数据
- 699、凤凰新闻【凤凰新闻】
- 700、深圳王力智能
- 701、返利网数字科技股份有限公司
- 702、上海阜能信息科技有限公司
- 703、深圳市极能超电数字科技有限公司
- 704、海目星激光科技集团股份有限公司
- 705、安克创新科技股份有限公司【安克】
- 706、大庆点神科技有限公司
- 707、浙江零跑科技股份有限公司【零跑】
- 708、成都成电金盘健康数据技术有限公司
- 709、成都极米科技股份有限公司【极米】
- 710、顺德职业技术大学
- 711、中邮证券有限责任公司【中邮证券】
- 712、志豪链云科技有限公司
- 713、湖南万鲸科技有限公司
- 714、广州万表
- 715、再惠(上海)网络科技有限公司
- 716、上海爱诚裕信息科技有限公司
- 717、杭州迈瑞数字科技有限公司
- 718、广州串联网络科技有限公司
- ……
> The company that access and use this product is welcome to register at the [address](https://github.com/xuxueli/xxl-job/issues/1 ), only for product promotion.
Welcome everyone's attention and use, XXL-JOB will also embrace changes, sustainable development.
### 1.4 Download
#### Documentation
- [中文文档](https://www.xuxueli.com/xxl-job/)
- [English Documentation](https://www.xuxueli.com/xxl-job/en/)
#### Source repository address (The latest code will be released in the two git warehouse in the same time)
Source repository address | Release Download
--- | ---
[https://github.com/xuxueli/xxl-job](https://github.com/xuxueli/xxl-job) | [Download](https://github.com/xuxueli/xxl-job/releases)
[http://gitee.com/xuxueli0323/xxl-job](http://gitee.com/xuxueli0323/xxl-job) | [Download](http://gitee.com/xuxueli0323/xxl-job/releases)
#### Center repository address (The latest Release version:1.8.1)
```
<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${version}</version>
</dependency>
```
#### Technical exchange group
- [社区交流](https://www.xuxueli.com/page/community.html)
- [Gitter](https://gitter.im/xuxueli/xxl-job)
### 1.5 Environment
- JDK:1.8+
- Mysql:5.7+
- Maven:3+
## 2. Quick Start
### 2.1 Init database
Please download project source code,get db scripts and execute, it will generate 16 tables if succeed.
The relative path of db scripts is as follows:
/xxl-job/doc/db/tables_xxl_job.sql
The xxl-job-admin can be deployed as a cluster,all nodes of the cluster must connect to the same mysql instance.
If mysql instances is deployed in master-slave mode,all nodes of the cluster must connect to master instace.
### 2.2 Compile
Source code is organized by maven,unzip it and structure is as follows:
xxl-job-admin:schedule admin center
xxl-job-core:public common dependent library
xxl-job-executor:executor Sample(Select appropriate version of executor,Can be used directly,You can also refer to it and transform existing projects into executors)
:xxl-job-executor-sample-spring:Spring version,executors managed by Spring,general and recommend;
:xxl-job-executor-sample-springboot:Springboot version,executors managed by Springboot;
### 2.3 Configure and delploy "Schedule Center"
schedule center project:xxl-job-admin
target:Centralized management、Schedule and trigger task
#### Step 1:Configure Schedule Center
Configure file’s path of schedule center is as follows:
/xxl-job/xxl-job-admin/src/main/resources/application.properties
The concrete contet describe as follows:
### JDBC connection info of schedule center:keep Consistent with chapter 2.1
xxl.job.db.driverClass=com.mysql.jdbc.Driver
xxl.job.db.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
xxl.job.db.user=root
xxl.job.db.password=root_pwd
### Alarm mailbox
xxl.job.mail.host=smtp.163.com
xxl.job.mail.port=25
xxl.job.mail.username=ovono802302@163.com
xxl.job.mail.password=asdfzxcv
xxl.job.mail.sendFrom=ovono802302@163.com
xxl.job.mail.sendNick=《任务调度平台XXL-JOB》
### Login account
xxl.job.login.username=admin
xxl.job.login.password=123456
### TOKEN used for communication between the executor and schedule center, enabled if it’s not null
xxl.job.accessToken=
### Internationalized Settings, the default is Chinese version,Switch to English when the value is "en".
xxl.job.i18n=en
#### Step 2:Deploy:
If you has finished step 1,then you can compile the project in maven and deploy the war package to tomcat.
the url to visit is :http://localhost:8080/xxl-job-admin (this address will be used by executor and use it as callback url),the index page after login in is as follow

Now,the “xxl-job-admin” project is deployed success.
#### Step3:schedule center Cluster(Option):
xxl-job-admin can be deployed as a cluster to improve system availability.
Prerequisites for cluster is to keep all node configuration(db and login account info) consistent with each other. Different xxl-job-admin cluster distinguish with each other by db configuration.
xxl-job-admin can be visited through nginx proxy and configure a domain for nginx,and the domain url can be configured as the executor’s callback url.
### 2.4 Configur and Deploy "xxl-job-executor-example"
Executor Project:xxl-job-executor-example (if you want to create new executor project you can refer this demo);
Target:receive xxl-job-admin’s schedule command and execute it;
#### Step 1:import maven dependence
Pleast confirm import xxl-job-core jar in pom.xml;
#### Step 2:Executor Configuration
Relative path of the executor configuration file is as follows:
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties
The concret content of configuration file as follows:
### xxl-job admin address list:xxl-job-admin address list: Multiple addresses are separated by commas,this address is used for "heart beat and register" and "task execution result callback" between the executor and xxl-job-admin.
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### xxl.job.executor.appname is used to group by executors
xxl.job.executor.appname=xxl-job-executor-sample
### xxl.job.executor.ip :1,used to register with xxl-job-admin;2,xxl-job-admin dispatch task to executor through it;3,if it is blank executor will get ip automatically, multi network card need to be configured.
xxl.job.executor.ip=
### xxl.job.executor.port :the port of the executor runned by,if multiple executor instance run on the same computer the port must different with each other
xxl.job.executor.port=9999
### xxl-job log path:runtime log path of the job instance
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/
### xxl-job, access token:xxl-job access token,enabled if it not blank
xxl.job.accessToken=
#### Step 3:executor configuration
configure file path of executor:
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/applicationcontext-xxl-job.xml
Concrete contet describe as follows:
```
<!-- configure 01、JobHandler scan path:auto scan JobHandler bean managed by container -->
<context:component-scan base-package="com.xxl.job.executor.service.jobhandler" />
<!-- configure 02、Excutor:executer core configure -->
<bean id="xxlJobExecutor" class="com.xxl.job.core.executor.XxlJobExecutor" init-method="start" destroy-method="destroy" >
<!-- executor IP[required],auto get if it blank -->
<property name="ip" value="${xxl.job.executor.ip}" />
<!-- executor port[required] -->
<property name="port" value="${xxl.job.executor.port}" />
<!-- executor AppName[required],auto register will be closed if it blank -->
<property name="appname" value="${xxl.job.executor.appname}" />
<!-- register center address of executor [required],auto register will be closed if it blank -->
<property name="adminAddresses" value="${xxl.job.admin.addresses}" />
<!-- log path of executor[required] -->
<property name="logPath" value="${xxl.job.executor.logpath}" />
<!-- access token, match check enabled if it not blank[required] -->
<property name="accessToken" value="${xxl.job.accessToken}" />
</bean>
```
#### Step 4:deploy executor project
You can compile and package the project If have done all the steps above successfully,the project supply two executor demo projects,you can choose any one to deploy:
xxl-job-executor-sample-spring:compile and package in WAR,can be deployed to tomcat;
xxl-job-executor-sample-springboot:compile and package in JAR,and run in springboot mode;
Now you have deployed the executor project.
#### Step 5:executor cluster(optional)
In order to improve system availability and job process capacity,executor project can be deployed as cluster.
Prerequisites:keep all node’s configuration item "xxl.job.admin.addresses" exactly the same with each other,all executors can be register automatically.
### 2.5 Start first job "Hello World"
Now let’s create a "GLUE模式(Java)" job,if you want to learn more about it , please see “chapter 3:Task details”。( "GLUE模式(Java)"'s code is maintained online through xxl-job-admin,compare with "Bean模式任务" it’s not need to develop, deploy the code on the executor and it’s not need to restart the executor, so it’s lightweight)
#### Prerequisites:please confirm xxl-job-admin and executor project has been deployed successfully.
#### Step 1:Create new job
Login in xxl-job-admin,click on the"新建任务" button, configure the job params as follows and click "保存" button to save the job info.


#### Step 2:develop “GLUE模式(Java)” job
Click “GLUE” button on the right of the job to go to GLUE editor view as shown below。“GLUE模式(Java)” mode task has been inited with default task code for printing Hello World。 ( “GLUE模式(Java)” mode task is a java code fragment implements IJobHandler interface,it will be executed in executor,you can use @Resource/@Autowire to inject other java bean instance,if you want to see more info please go to chapter 3)


#### Step 3:trigger task
If you want to run the job manually please click "执行" button on the right of the job(usually we trigger job by Cron expression)
#### Step 4:view log
Click “日志” button on the right side of the task you will go to the task log list ,you will see the schedule history records of the task and the schedule detail info,execution info and execution params.If you click the “执行日志” button on the right side of the task log record,you will go to log console and view the execute log in the course of task execution.

On the log console,you can view task execution log on the executor immediately after it dump to log file,so you can monitor the task execution process by Rolling way.

## 3. Task details
### Description of configuration item:
- 执行器:the container where job executed in,it will be discovered automaticly if it has registered success when job was scheduled,and the job will be executed automaticly through this way.On the other side all tasks was grouped by this way.Tasks must be binded to a executor and it can be configured on "执行器管理" page;
- 描述:the decription of task
- 路由策略:when executors deployed as a cluster,it can configure multi route policys,include:
FIRST(第一个):default select the first executor;
LAST(最后一个):default select the last executor;
ROUND(轮询):round select the executor;;
RANDOM(随机):random select the executor;
CONSISTENT_HASH(一致性HASH):all jobs was evenly scheduled on different machines,make sure load balance of executors under the same group and the same job will be scheduled to the same machine.
LEAST_FREQUENTLY_USED(最不经常使用):default select the least often used executor.
LEAST_RECENTLY_USED(最近最久未使用):defalut select the longest not used executor.
FAILOVER(故障转移):beat with the executor in order and select the first beat success executor as target executor.
BUSYOVER(忙碌转移):check the executor busy or not in order,the first executor checked not busy is to be select as the target scheduled executor.
SHARDING_BROADCAST(分片广播):broadcast all executor nodes under the same executor group execute the job, slice number will be transferred at the same time,shard task will be executed accordate with the shard number.
- Cron:Cron expression used to trigger job execution;
- 运行模式:
BEAN模式:job was maintained on the side of executor by as JobHandler instance,it will be executed accordate with "JobHandler" properties.
GLUE模式(Java):task source code is maintened in the schedule center,it must implement IJobHandler and explain by "groovy" in the executor instance,inject other bean instace by annotation @Resource/@Autowire.
GLUE模式(Shell):it’s source code is a shell script and maintained in the schedule center.
GLUE模式(Python):it’s source code is a python script and maintained in the schedule center.
- JobHandler:it’s used in "BEAN模式",it’s instance is defined by annotation @JobHandler on the JobHandler class name.
- 子任务Key:every task has a unique key (task Key can acquire from task list),when main task is done successfully it’s child task stand for by this key will be scheduled.
- 阻塞处理策略:the stategy handle the task when this task is scheduled too frequently and the task is block to wait for cpu time.
单机串行(默认):task schedule request go into the FIFO queue and execute serially.
丢弃后续调度:the schedule request will be discarded and marked as fail when the same task’s instance scheduled befor is running in the target executor.
覆盖之前调度:the schedule request will be executed and clear before task queue when the same task’s instance scheduled befor is running in the target executor.
- 失败处理策略:handle policy for schedule fail
失败告警(默认):it will trigger alarm such as send alarm mail when it’s scheduled fail.
失败重试:it will try another time when it’s scheduled fai,if try fail it will trigger alarm for fail.every time it will trigger a new schedule request.
- 执行参数:the params needed in the run time of the task, multiple values are separated by commas,it will be passed to task instace as an array when task is scheduled.
- 报警邮件:the email used to receive the alarm mail when task is scheduled fail or execute fail, multiple values are separated by commas.
- 负责人:The person name response for the task.
### 3.1 BEAN模式
The task logic exist in the executor project as JobHandler,the develop steps as shown below:
#### Step 1:develp obHandler in the executor project
- 1, create new java class implent com.xxl.job.core.handler.IJobHandler;
- 2, if you add @Component annotation on the top of the class name it’s will be managed as a bean instance by spring container;
- 3, add “@JobHandler(value=" customize jobhandler name")” annotation,the value stand for JobHandler name,it will be used as JobHandler property when create a new task in the schedule center.
#### Step 2:create task in schedule center
If you want learn more about configure item please go and sedd “Description of configuration item”,select "BEAN模式" as run mode,property JobHandler please fill in the value defined by @JobHande.

### 3.2 GLUE模式(Java)
Task source code is maintained in the schedule center and can be updated by Web IDE online, it will be compiled and effective real-time,didn’t need to assign JobHandler,develop flow shown as below:
#### Step 1:create task in schedule center
If you want learn more about configure item please go and sedd “Description of configuration item”,select "GLUE模式(Java)" as run mode.

#### Step 2:develop task source code
Select the task record and click “GLUE” button on the righe of it,it will go to GLUE task’s WEB IDE page,on this page yo can edit you task code(also can edit in other IDE tools,copy and paste into this page).
Version backtrack(support 30 versions while backtrack):on the WEB IDE page of GLUE task,on upper right corner drop down box please select “版本回溯”,it will display GLUE updated history,select the version you want it will display the source code of this version,it will backtrace the version while click save button.

### 3.3 GLUE模式(Shell)
#### Step 1:create new task in schedule center
If you want learn more about configure item please go and sedd “Description of configuration item”,select "GLUE模式(Shell)"as run mode.
#### Step 2:develop task source code
Select the task record and click “GLUE” button on the righe of it,it will go to GLUE task’s WEB IDE page,on this page yo can edit you task code(also can edit in other IDE tools,copy and paste into this page).
Actually it is a shell script fragment.

### 3.4 GLUE模式(Python)
#### Step 1:create new task in schedule center
If you want learn more about configure item please go and sedd “Description of configuration item”,select "GLUE模式(Python)"as run mode.
#### Step 2:develop task source code
Select the task record and click “GLUE” button on the righe of it,it will go to GLUE task’s WEB IDE page,on this page yo can edit you task code(also can edit in other IDE tools,copy and paste into this page).
Actually it is a python script fragment.

## 4. Task Management
### 4.0 configure executor
click"执行器管理" on the left menu,it will go to the page as shown below:

1,"调度中心OnLine”:display schedule center machine list,when task is scheduled it will callback schedule center for notify the execution result in failover mode, so that it can avoid a single point scheduler;
2,"执行器列表" :display all nodes under this executor group.
If you want to create a new executor,please click "+新增执行器" button:

### Description of executor attributes
Appname: the unique identity of the executor cluster,executor will registe automatically and periodically by appname so that it can be scheduled.
名称: the name of ther executor,it is used to describe the executor.
排序: the order of executor,it will be used in the place where need to select executor.
注册方式:which way the schedule center used to acquire executor address through;
自动注册:executor will register automatically,through this schedule center can discover executor dynamically.
手动录入:fill in executor address manually and it will be used by schedule center, multiple address separated by commas.
机器地址:only effective when "注册方式" is "手动录入",support fill in executor address manually.
### 4.1 create new task
Go to task management list page,click “新增任务” button on the upper right corner,on the pop-up window“新增任务”page configure task property and save.learn more info please go and see "3,task details".
### 4.2 edit task
Go to task management list page and choose the task you want to edit ,click”编辑”button on the right side of the task,on the pop-up window “编辑任务”page edit task property and save.
### 4.3 edit GLUE source code
Only fit to GLUE task.
choose the task you want to edit and click” GLUE”button on the right side of the task, it will go to the Web IDE page of GLUE task,then you can edit task source code on this page.you can read "3.2 GLUE模式(Java)" for more info.
### 4.4 pause/recover task
You can pause or recover task but it just fit to follow up schedule trigger and won’t affect scheduled tasks,if you want to stop tasks which has been triggered,please go and see “4.8 stop the running task”

### 4.5 manually trigger
You can trigger a task manually by Click “执行”button,it won’t affect original scheduling rules.

### 4.6 view schedule log
You can view task’s history schedule log by click “日志” button,on the history schedule log list page you can view every time of task’s schedule result,execution result and so on,click “执行日志” button can view the task’s full execute log.


调度时间:schedule center trigger time when schedule and send execution signal to executor;
调度结果:schedule center trigger task’s result, 200 represent success,500 or other number stands for fail;
调度备注:schedule center trigger task’s remark info;
执行器地址:the machine address where the task was executed;
运行模式:run mode of triggered task,go and see "3,Task Details" for more info;
任务参数:the input params of the executed task;
执行时间:the callback time task was done in the executor;
执行结果:task’s execute result in the executor, 200 represent success,500 or other number stands for fail;
执行备注:task’s execute remark info in the executor;
操作:
"执行日志"button:click this button you can view task’s execution detail log,go and see chapter 4.7 “view execution log” for more info;
"终止任务"button:click this button you can stop the task’s execution thread on this executor,include bloked task instance which didn’t has started;
### 4.7 view execution log
Click the “执行日志” button on the right side of the record,you can go to the execution log page,you can view the full execution log of the logic business code, shown as below:

### 4.8 stop running tasks
Just fit to running tasks,on the task log list page,click “终止任务” button on the right side of the record, it will send stop command to the executor where the task was executed,finally the task was killed and the task instance execute queue of this task will be clear.

It is implemented by interrupt execute thread, it will trigger InterruptedException.so if JobHandler catch this execuption and handle this exception this function is unavailable.
So if you want stop the running task ,the JobHandler need to handle InterruptedException separately by throw this exception.the right logic is as shown below:
```
try{
// do something
} catch (Exception e) {
if (e instanceof InterruptedException) {
throw e;
}
logger.warn("{}", e);
}
```
If JobHandler start child thread,child thread also must not catch InterruptedException,and it should throw exception.
### 4.9 delete execution log
On the task log list page, after you select executor and task, you can click"删除" button on the right side and it will pop-up "日志清理" window,on the pop-up window you can choose different log delete policy,choose the policy you want to execute and click "确定" button it will delele relative logs:


### 4.10 delete task
Click the delete button on the right side of the task,the task will be deteted.

## 5. Overall design
### 5.1 Source directory introduction
- /doc :documentation and material
- /db :db scripts
- /xxl-job-admin :schedule and admin center
- /xxl-job-core :common core Jar
- /xxl-job-executor-samples :executor,Demo project(you can develop on this demo project or adjust your own exist project to executor project)
### 5.2 configure database
XXL-JOB schedule module is implemented based on Quartz cluster,it’s “database” is extended based on Quartz’s 11 mysql tables.
XXL-JOB custom Quartz table structure prefix(XXL_JOB_QRTZ_).

The added tables as shown below:
- XXL_JOB_QRTZ_TRIGGER_GROUP:executor basic table, maintain the info about the executor;
- XXL_JOB_QRTZ_TRIGGER_REGISTRY:executor register table, maintain addressed of online executors and schedule center machines.
- XXL_JOB_QRTZ_TRIGGER_INFO:schedule extend table,it is used to save XXL-JOB schedule extended info,such as task group,task name,machine address,executor,input params of task and alarm email and so on.
- XXL_JOB_QRTZ_TRIGGER_LOG:schedule log table,it is used to save XXL-JOB task’s histry schedule info,such as :schedule result,execution result,input param of scheduled task,scheduled machine and executor and so on.
- XXL_JOB_QRTZ_TRIGGER_LOGGLUE:schedule log table,it is used to save XXL-JOB task’s histry schedule info,such as :schedule result,execution result,input param of scheduled task,scheduled machine and executor and so on.
So XXL-JOB database total has 16 tables.
### 5.3 Architecture design
#### 5.3.1 Design target
All schedule behavior has been abstracted into “schedule center” common platform , it dosen’t include business logic and just responsible for starting schedule requests.
All tasks was abstracted into separate JobHandler and was managed by executors, executor is responsible for receiving schedule request and execute the relative JobHandler business.
So schedule and task can be decoupled from each other, by the way it can improve the overall stability and scalability of the system.
#### 5.3.2 System composition
- **Schedule module(schedule center)**:
it is responsible for manage schedule info,send schedule request accord task configuration and it is not include an business code.schedule system decouple with the task, improve the overall stability and scalability of the system, at the same time schedule system performance is no longer limited to task modules.
Support visualization, simple and dynamic management schedule information, include create,update,delete, GLUE develop and task alarm and so on, All of the above operations will take effect in real time,support monitor schedule result and execution log and executor failover.
- **Executor module(Executor)**:
it is responsible for receive schedule request and execute task logic,task module focuses on the execution of the task, Development and maintenance is simpler and more efficient.
Receive execution request, end request and log request from schedule center.
#### 5.3.3 Architecture diagram

### 5.4 Schedule module analysis
#### 5.4.1 Disadvantage of quartz
Quartz is a good open source project and was often as the first choice for job schedule.Tasks was managed by api in quartz cluster so it can avoid some disadvantages of single quartz instance,but it also has some disadvantage as shown below:
- problem 1:it is not humane while operate task by call apill.
- problem 2:it is need to store business QuartzJobBean into database, System Invasion is quite serious.
- problem 3:schedule logic and couple with QuartzJobBean in the same project,it will lead a problem in case that if schedule tasks gradually increased and task logic gradually increased,under this situation the performance of the schedule system will be greatly limited by business.
XXL-JOB solve above problems of quartz.
#### 5.4.2 RemoteHttpJobBean
Under Quartz develop,task logic often was maintained by QuartzJobBean, couple is very serious.in XXL-JOB"Schedule module" and "task module" are completely decoupled,all scheduled tasks in schedule module use the same QuartzJobBean called RemoteHttpJobBean.the params of the tasks was maintained in the extended tables,when trigger RemoteHttpJobBean,it will parse different params and start remote cal l and it wil call relative remote executor.
This call module is like RPC,RemoteHttpJobBean provide call proxy functionality,the executor is provided as remote service.
#### 5.4.3 Schedule Center HA(Cluster)
It is based on Quartz cluster,databse use Mysql;while QUARTZ task schedule is used in Clustered Distributed Concurrent Environment,all nodes will report task info and store into database.it will fetch trigger from database while execute task,if trigger name and execute time is the same only one node will execute the task.
```
# for cluster
org.quartz.jobStore.tablePrefix = XXL_JOB_QRTZ_
org.quartz.scheduler.instanceId: AUTO
org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.isClustered: true
org.quartz.jobStore.clusterCheckinInterval: 1000
```
#### 5.4.4 Schedule threadpool
Default threads in the threadpool is 10 so it can avoid task schedule delay because of single thread block.
```
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
```
business logic was executed on remote executor in XXL-JOB,schedule center just start one schedule request at every schedule time,executor will inqueue the request and response schedule center immediately. There is a huge difference from run business logic in quartz’s QuartzJobBean directly,just as Elephants and feathers;
the logic of task in XXL-JOB schedule center is very light and single job average run time alaways under 100ms,(most is network time consume).so it can use limited threads to support a large mount of job run concurrently, 10 threads configured above can support at least 100 JOB normal execution.
#### 5.4.5 @DisallowConcurrentExecution
This annotation is not used default by the schedule center of XXL-JOB schedule module, it use concurrent policy default,because RemoteHttpJobBean is common QuartzJobBean,so it greatly improve the capacity of schedule system and decrease the blocked chance of schedule module in the case of multi-threaded schedule.
Every schedule module was scheduled and executed parallel in XXL-JOB,but tasks in executor is executed serially and support stop task.
#### 5.4.6 misfire
The handle policy when miss the job’s trigger time.
he reason may be:restart service,schedule thread was blocked by QuartzJobBean, threads was exhausted,some task enable @DisallowConcurrentExecution,the last schedule was blocked and next schedule was missed.
The default value of misfire in quartz.properties as shown below, unit in milliseconds:
```
org.quartz.jobStore.misfireThreshold: 60000
```
Misfire rule:
withMisfireHandlingInstructionDoNothing:does not trigger execute immediately and wait for next time schedule.
withMisfireHandlingInstructionIgnoreMisfires:execute immediately at the first frequency of the missed time.
withMisfireHandlingInstructionFireAndProceed:trigger task execution immediately at the frequency of the current time.
XXL-JOB’s default misfire rule:withMisfireHandlingInstructionDoNothing
```
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobInfo.getJobCron()).withMisfireHandlingInstructionDoNothing();
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
```
#### 5.4.7 log callback service
When schedule center of the schedule module was deployed as web service, on one side it play as schedule center, on the other side it also provide api service for executor.
The source code location of schedule center’s “log callback api service” as shown below:
```
xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback
```
Executor will execute task when it receive task execute request.it will notify the task execute result to schedule center when the task is done.
#### 5.4.8 task HA(Failover)
If executor project was deployed as cluster schedule center will known all online executor nodes,such as:“127.0.0.1:9997, 127.0.0.1:9998, 127.0.0.1:9999”.
When "路由策略" select "故障转移(FAILOVER)",it will send heart beat check request in order while schedule center start schedule request. The first alive checked executor node will be selected and send schedule request to it.
“调度备注” can be viewed on the monitor page when schedule success. As shown below:

“调度备注” will display local schedule route path、executor’s "注册方式"、"地址列表" and task’s "路由策略"。Under "故障转移(FAILOVER)" policy, schedule center take first address to do heartbeat detection, heat beat fail will automatically skip, the second address heart beat fail…… until the third address “127.0.0.1:9999” heart beat success, it was selected as target executor, then send schedule request to target executor, now the schedule process is end wait for the executor’s callback execution result.
#### 5.4.9 schedule log
Every time when task was scheduled in the schedule center it will record a task log, the task log include three part as shown below:
- 任务信息:include executor address、JobHandler and executor params,accord these parameters it can locate specific machine and task code that the task will be executed.
- 调度信息:include schedule time、schedule result and schedule log and so on,accord these parameters you can understand some task schedule info of schedule center.
- 执行信息:include execute time、execute result and execute log and so on, accord these parameters you can understand the task execution info in the executor.
Schedule log stands fo single task schedule, attribute description is as follows:
- 执行器地址:machine addresses on which task will be executed.
- JobHandler:JobHandler name of task under Bean module.
- 任务参数:the input parameters of task
- 调度时间:the schedule time started by schedule center.
- 调度结果:schedule result of schedule center,SUCCESS or FAIL.
- 调度备注:remark info of task scheduled by schedule center, such as address heart beat log.
- 执行时间:the callback time when the task is done in the executor.
- 执行结果:task execute result in the executor,SUCCESS or FAIL.
- 执行备注:task execute remark info in the executor,such as exception log.
- 执行日志:full execution log of the business code during execution of the task,go and see “4.7 view execution log”.
#### 5.4.10 Task dependency
principle:every task has a task key in XXL-JOB, every task can configure property “child task Key”,it can match task dependency relationship through task key.
When parent task end execute and success, it will match child task dependency accord child task key, it will trigger child task execute once if it matched child task.
On the task log page ,you can see matched child task and triggered child task’s log info when you “查看”button of “执行备注”,otherwise the child task didin’t execute, as shown beleow:


### 5.5 Task "run mode" analysis
#### 5.5.1 "Bean模式" task
Development steps:go and see "chapter 3" .
principle: every Bean mode task is a Spring Bean instance and it is maintained in executor project’s Spring container. task class nedd to add “@JobHandler(value="name")” annotation, because executor identify task bean instance in spring container through annotation. Task class nedd to implements interface IJobHandler, task logic code in method execute(), the task logic in execute() method will be executed when executor received a schedule request from schedule center.
#### 5.5.2 "GLUE模式(Java)" task
Development steps:go and see "chapter 3" .
Principle : every "GLUE模式(Java)" task code is a class implemets interface IJobHandler, when executor received schedule request from schedule center these code will be loaded by Groovy classloader and instantiate into a Java object and inject spring bean service declared in this code at the same time(please confirm service and class reference in Glue code exist in executor project), then call the object’s execute() method and execute task logic.
#### 5.5.3 GLUE模式(Shell) + GLUE模式(Python)
Development steps:go and see "chapter 3" .
principle:the source code of script task is maintained in schedule center and script logic will be executed in executor. when script task was triggered, executor will load script source code and generate a script file on the machine where executor was deployed, the script will be called by java code, the script output log will be written to the task log file in real time so that we can monitor script execution in real time through schedule center, the return code 0 stands for success other for fail.
All supported types of scripts as shown beloes:
- shell script:shell script task will be enabled when select "GLUE模式(Shell)"as task run mode.
- python script: python script task will be enabled when select " GLUE模式(Python)"as task run mode.
#### 5.5.4 executor
Executor is actually an embedded Jetty server with default port 9999, as shown below(parameter:xxl.job.executor.port).
Executor will identify Bean mode task in spring container through @JobHandler When project start, it will be managed use the value of annotation as key.
When executor received schedule request from schedule center, if task type is “Bean模式” it will match bean mode task in Spring container and call it’s execute() method and execute task logic. if task type is “GLUE模式”, it will load Glue code, instantiate a Java object and inject other spring service(notice: the spring service injected in Glue code must exist in the same executor project), then call execute() method and execute task logic.
#### 5.5.5 task log
XXL-JOB will generate a log file for every schedule request, the log info will be recorded by XxlJobLogger.log() method, the log file will be loaded when view log info through schedule center.
(history version is implemented by overriding LOG4J’s Appender so it exists dependency restrictions, The way has been discraded in the new version)
The location of log file can be specified in executor configuration file, default pattern is : /data/applogs/xxl-job/jobhandler/formatted date/primary key for database scheduling log records.log”.
When start child thread in JobHandler, child thread will print log in parent JobHandler thread’s execute log in order to trace execute log.
### 5.6 Communication module analysis
#### 5.6.1 A complete task schedule communication process
- 1,schedule center send http request to executor, and the service in executor in fact is a jetty server with default port 9999.
- 2,executor execute task logic.
- 3,executor http callback with schedule center for schedule result, the service in schedule center used to receive callback request from executor is a set of api opended to executor.
#### 5.6.2 Encrypt Communication data
When scheduler center send request to executor, it will use RequestModel and ResponseModel object to encapsulate schedule request parameters and response data, these two object will be serialized before communication, data protocol and time stamp will be checked so that achieve data encryption target.
### 5.7 task register and task auto discover
Task executor machine property has been canceled from v1.5, instead of task register and auto discovery, get remote machine address dynamic.
AppName: unique identify of executor cluster, executor is minimal unite of task register, every task recognize machine addresses under the executor on which it was binded.
Beat: heartbeat cycle of task register, default is 15s, and the time executor usedto register is twice the time, the time used to auto task discover is twice the beat time, the invalid time of register is twice the Beat time.
registry table: see XXL_JOB_QRTZ_TRIGGER_REGISTRY table, it will maintain a register record periodically while task register, such as the bind relationship between machine address and AppName, so that schedule center can recognize machine list by AppName dynamicly.
To ensure system lightweight and reduce learning costs, it did not use Zookeeper as register center, Use DB as register center to do task registration.
### 5.8 task execute result
Since v1.6.2, the task execute result is recognized through ReturnT of IJobHandler, it executes success when return value meets the condition "ReturnT.code == ReturnT.SUCCESS_CODE" , or it executes fail, and it can callback error message info to schedule center through ReturnT.msg, so it can control task execute results in the task logic.
### 5.9 slice broadcat & dynamic slice
When “分片广播” is selected as route policy in executor cluster, one task schedule will broadcast all executor node in cluster to trigger task execute in every executor, pass slice parameter at the same time, so we can develop slice task by slice parameters.
"分片广播" break the task by the dimensions of executor, support dynamic extend executor cluster so that it can add slice number dynamically to do business process, In case of large amount of data process can significantly improve task processing capacity and speed.
The develop process of "分片广播" is the same as general task, The difference is that you can get slice parameters,code as shown below(go and see ShardingJobHandler in execuotr example ):
int shardIndex = XxlJobContext.getXxlJobContext().getShardIndex();
int shardTotal = XxlJobContext.getXxlJobContext().getShardTotal();
This slice parameter object has two properties:
index:the current slice number(start with 0),stands for the number of current executor in the executor cluster.
total:total slice number,stands for total slices in the executor cluster.
This feature applies to scenes as shown below:
- 1、slice task scene:when 10 executor to handle 10w records, 1w records need to be handled per machine, time-consuming 10 times lower;
- 2、Broadcast task scene:broadcast all cluster nodes to execute shell script、broadcast all cluster nodes to update cache.
### 5.10 AccessToken
To improve system security it is need to check security between schedule center and executor, just allow communication between them when AccessToken of each other matched.
The AccessToken of scheduler center and executor can be configured by xxl.job.accessToken.
There are only two settings when communication between scheduler center and executor just:
- one:do not configure AccessToken on both, close security check.
- two:configure the same AccessToken on both;
### 5.11 Dispatching center API services
The scheduling center provides API services for executors and business parties to choose to use, and the currently available API services are available.
1. Job result callback service;
2. Executor registration service;
3. Executor registration remove services;
4. Triggers a single execution service, and support the task to be triggered according to the business event;
The scheduling center API service location: com.xxl.job.core.openapi.AdminBiz.java
The scheduling center API service requests reference code:com.xxl.job.adminbiz.AdminBizTest.java
## 6 Version update log
### 6.1 version V1.1.x,New features [2015-12-05]
**【since V1.1.x,XXL-JOB was used by company hiring me,alias Ferrari inner company,the latest version is recommended for new project】**
- 1、simple:support CRUD operation through Web page, simple and one minute to get started;
- 2、dynamic:support dynamic update task status,pause/recover task and effective in real time;
- 3、service HA:task info stored in mysql, Job service support cluster to make sure service HA;
- 4、task HA:when some Job services hangs up, tasks will be assigned to some other alive machines, if all nodes of the cluster hangs up, it will compensate for the execution of lost task when restart;
- 5、one task instance will only be executed on one executor;
- 6、task is executed serially;
- 7、support for custom parameters;
- 8、Support pause task execution remotely .
### 6.2 version V1.2.x,New features [2016-01-17]
- 1、support task group;
- 2、suport local task, remote task;
- 3、support two types underlying communication ,Servlet or JETTY;
- 4、support task log;
- 5、support serially execution,parallel execution;
Description:system architecture of V1.2 divided by function as shown below:
- schedule module(schedule center):Responsible for managing schedule information,send schedule request according to the schedule configuration;
- execute module(executor):Responsible for receiving schedule request and execute task logic;
- communication module:Responsible for the communication between the schedule module and execute module;
advantage:
- Decouple:execute module supply task api, schedule module maintains schedule information, The business is independent of each other;
- High scalability;
- stability;
### 6.3 version V1.3.0,New features [2016-05-19]
- 1、discard local task module, remote task was recommended, easy to decouple system, the JobHandler of task was called executor.
- 2、dicard underlying communication type servlet, JETTY was recommended, schedule and callback bidirectional communication, rebuild the communication logic;
- 3、UI interactive optimization:optimize left menu expansion and menu item selected status , task list opens the table with compression optimization;
- 4、【important】executor is subdivided into two develop mode:BEAN、GLUE:
Introduction to the executor mode:
- BEAN mode executor:every executor is a Spring Bean instance,it was recognized and scheduled by XXL-JOB through @JobHandler annotation;
-GLUE mode executor:every executor corresponds to a piece of code,edited and maintained online by Web, Dynamic compile and takes effect in real time, executor is responsible for loading GLUE code and executing;
### 6.4 version V1.3.1,New features [2016-05-23]
- 1、Update project directory structure:
- /xxl-job-admin -------------------- 【schedule center】:Responsible for managing schedule information,send schedule request according to schedule configuration;
- /xxl-job-core ----------------------- Public core dependence
- /xxl-job-executor-example ------ 【executor】:Responsible for receiving scheduling request and execute task logic;
- /db ---------------------------------- create table script
- /doc --------------------------------- user manual
- 2、Upgrade the user manual under the new directory structure;
- 3、Optimize some interactions and UI;
### 6.5 version V1.3.2,New features [2016-05-28]
- 1、Schedule logic for transactional handle;
- 2、executor asynchronous callback execution log;
- 3、【important】based on HA support of schedule center,extend executor’s Failover support,Support configure multiple execution addresses;
### 6.6 version V1.4.0 New features [2016-07-24]
- 1、Task dependency: it is implemented by trigger event, it will automatically trigger a child task schedule after Task execute success and callback, multiple child tasks are separated by commas;
- 2、executor source code has been reconstructed, optimize underlying db script;
- 3、optimize task thread group logic of executor, before it is group by executor’s JobHandler so when multiple task reuse Jobhanlder will cause block with each other. Now it is grouped by task of schedule center so tasks are isolated from task execution.
- 4、optimize communication scheme between executor and schedule center, a simple RPC protocol was implemented through Hex + HC, optimize the maintenance and analysis process of communication parameters.
- 5、schedule center, create/edit task, page attribute adjustment:
- 5.1、the property JobName was removed from task add/edit page and it is changed to automatically generate by system: this field before is used to identify a task in schedule center and did not use in other scenes, so remove it to simplify the task creation;
- 5.2、adjust "GLUE模式" property in task add/edit page to near JobHandler input box;
- 5.3、"报警阈值" property was removed from task add/edit page;
- 5.4、"子任务Key" property was removed from task add/edit page, the key of task can be acquired from task list page, child task will be triggered by child task key when main task execute success.
- 6、bug fix:
- 6.1、optimize jetty executor shutdown, solve one problem may cause jetty could not shutdown.
- 6.2、optimize callback of executor task queue when task execute finish. Solve a problem which may cause task could not callback.
- 6.3、Optimize Page List Parameters of Schedule Center, solve one problem which may be caused by post length limit of server.
- 6.4、optmize executor Jobhandler annotation, solve a problem that container could not load the JobHandler caused by the transaction proxy.
- 6.5、optimize remote schedule, disable retry policy, solve a problem may caused repeat call;
Tips: V1.3.x release has been published , enter the maintenance phase, branch address is [V1.3](https://github.com/xuxueli/xxl-job/tree/v1.3) .New features will be updated continuously in the master branch.
### 6.7 version V1.4.1 New features [2016-09-06]
- 1、project successfully pushed to maven central warehouse, Central warehouse address and dependency as shown below:
```
<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${最新稳定版}</version>
</dependency>
```
- 2、To adapt to the rules of central warehouse, groupId has been changed from com.xxl to com.xuxueli.
- 3、to resolve the problem that sub-modules can not be compiled separately, system version is not maintained in the project root pom, each sub-module is configured separately for version configuration;
- 4、optimize data byte length statistics rule of RPC communication it may reduce 50% of data traffic;
- 5、IJobHandler cancel task return value, before the execution status is judged by the return value, now it instead of task was executed successfully by default only when exception was caught the task execution was judged failed.
- 6、optimize system public pop-up box as a plugin;
- 7、optimize table structure and the table name now is upper case;
- 8、modify ContentType of JSON response from exception handler of schedule center to fix the bug that it is could not recognized by browser.
### 6.8 version V1.4.2 New features [2016-09-29]
- 1、push V1.4.2 to maven central warehouse, main version V1.4 enter maintenance phase;
- 2、fix problem task list offset when add task;
- 3、fix a style disorder problem that caused by bootstrap does not support the modal frame overlap , the problem occurs when the task is edited;
- 4、optimize schedule status when schedule timeout and Handler could not matched;
- 5、the task could not stop problem caused by catch exception has given solution;
### 6.9 version V1.5.0 New features [2016-11-13]
- 1、task register: executor registers the task automatically, schedule center will automatically discover the registered task and trigger execution.
- 2、add parameter AppName for executor: AppName is the unique identifier of each executor cluster, register periodically and automatically with AppName.
- 3、add column executor management in schedule center : manage online executors, automatically discover registered executors via the property AppName。Only managed executors are allowed to be used;
- 4、change Task group attribute to executor : each task needs to be bound to the specified exector, schedule address is obtained by binded executor;
- 5、discard property task machine: by the way of binding task with executor, automatically discovers registered remote executor address and triggers schedule request.
- 6、add DBGlueLoader in public dependency, it implement GLUE source code calssloader based on native jdbc, Reduce third party reliance (mybatis,spring-orm etc); simplify and optimize executor configuration (for GLUE task), Reduce the difficulty of getting started;
- 7、adjust table structure, reconstruct the project;
- 8、schedule center automatically registered and found, failover: schedule center periodically registered automatically, task callback can recognize all online schedule center addresses, task callback support failover so that it can avoid single point of risk.
### 6.10 version V1.5.1 New features [2016-11-13]
- 1、Reconstruct the underlying code and optimize logic, clean POM and Clean Code;
- 2、Servlet/JSP Spec selected 3.0/2.2;
- 3、Spring updated to 3.2.17.RELEASE version;
- 4、Jetty updated to version 8.2.0.v20160908;
- 5、has push V1.5.0 and V1.5.1 to maven central warehouse;
### 6.10 version V1.5.2 New features [2017-02-28]
- 1、optimize IP tools class which used to gets IP address,IP static cache;
- 2、both executor and schedule center support customize registered IP address;Solve problem when machine has multiple network card and get the wrong card;
- 3、solve the problem that it will generate multiple log files when executed across days;
- 4、the non-sensitive log level is adjusted to debug;
- 5、Upgrade the database connection pool to c3p0;
- 6、optimize log4j property of executor,remove invalid attribute;
- 7、reconstruct underlying code and optimize logic and Clean Code;
- 8、optimize Dependency Injection Logic of GLUE, support injected as alias;
### 6.11 version V1.6.0 New features [2017-03-13]
- 1、upgrade communication scheme,the HEX communication model is adjusted to the B-RPC model based on HTTP;
- 2、executor supports set execution address list manually,provide switch to use automatically registered address or manually set address;
- 3、executor route rules:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移;
- 4、unified thread model and thread destruction scheme (by the way of listener or stop() method,Destroy the thread when container is destroyed;Daemon is sometimes not ideal);
- 5、unified system configuration data,Unified managed by configuration files;
- 6、CleanCode,Clean up invalid historical parameters;
- 7、extend data structure and adjust related table structure;
- 8、new created task defaults to a non-running state;
- 9、optimize update logic of GLUE mode task instance , The original update is based on the timeout value and now is updated according to the version number,version number plus one while source changed;
### 6.12 version V1.6.1 New features [2017-03-25]
- 1、Rolling log;
- 2、reconstruct WebIDE interactive;
- 3、enhanced communication check,filter unnormal requests effectively;
- 4、enhanced permission check,Using dynamic login TOKEN(recommend instead of internal SSO);
- 5、optimize database configuration,solve garbled problem;
### 6.13 version V1.6.2 New features [2017-04-25]
- 1、execution report:support view run time data in real time, such as task number, total schedule number, executor number etc., include schedule report , such as scheduled distribution graph on date, scheduled success distribution graph etc;
- 2、JobHandler support set return value for tasks, it is easy to control task execute result in task logic;
- 3、the problem could not view exception info when resource path include space or chinese word casused resource file could not be loaded;
- 4、optimize route policy:fix problems that Loop and LFU routing policy counters are no limit and first route is focused on the first machine;
### 6.14 version V1.7.0 New features [2017-05-02]
- 1、script task:support develop and run script task by GLUE, include script type such as Shell、Python and Groovy;
- 2、add spring-boot type executor example project;
- 3、upgrade jetty to version 9.2;
- 4、task execute log remove log4j dependency, instead of self-realization,Thus eliminate the dependency on the log component;
- 5、executor remove GlueLoader dependency,instead of push mode,thus GLUE source code load no longer rely on JDBC;
- 6、get the project name when login and redirect, solve 404 problem when it is not deployed by the directory;
### 6.15 version V1.7.1 New features [2017-05-08]
- 1、unified write and read code of execute log as UTF-8,solve log garbled problem under windows environment;
- 2、communication timeout period is limited to 10s,To avoid schedule thread is occupied under abnormal situation;
- 3、adjust executor , server stat, destroy and register logic;
- 4、optimize Jetty Server shutdown logic, repair port occupation caused by executor could not be closed normally and frequent printe c3p0 log probleam;
- 5、start child thread in JobHandler,support child thread print execute log and view by Rolling;
- 6、task log cleanup;
- 7、pop-up component is replaced by layer;
- 8、upgrade quartz to version 2.3.0;
### 6.16 version V1.7.2 New features [2017-05-17]
- 1、block handle policy:the policy when schedule is too frequently and the executor it too late to handle, include multiple strategies:single machine serially execute(default)、discard subsequent schedule、override before schedule;
- 2、fail handle policy:handle policy when scheduled fail, include :failure alarm(default)、failed to retry;
- 3、The communication timeout is adjusted to 180s;
- 4、executor and database are completely decoupled,But the executor needs to configure schedule center cluster address。schedule center provides APIs for executor callbacks and heartbeat registration services,cancel jetty inner schedule center, heartbeat cycle is adjusted to 30s,heartbeat failure is triple heartbeat;
- 5、fix executor parameters lost bug when edit;
- 6、add task test Demo to make task logic test easier;
### 6.17 version V1.8.0 New features [2017-07-17]
- 1、optimize update logic of task Cron,instead of rescheduleJob,at the same time preventing set cron repeatedly;
- 2、optimize API callback service failed status code,facilitate troubleshooting;
- 3、XxlJobLogger support multi-parameter;
- 4、route policy add "忙碌转移" mode:Perform idle detection in sequence,The first idle test successfully machine is selected as the target executor and trigger schedule;
- 5、reconstruct route policy code;
- 6、fix executor repeat registration problem;
- 7、Task thread will be destroyed after 30 times idle turn, reduce the inefficient thread consumption of low frequency tasks;
- 8、Executor task execution result batch callback so that reduce callback frequency to improve actuator performance;
- 9、cancle XML configuration of springboot executor project,instead of class configuration;
- 10、supports filter execute log based on running status;
- 11、optimize scheduling Center Task Registration Detection Logic;
### 6.18 version V1.8.1 New features [2017-07-30]
- 1、slice broadcast task:When slice broadcast is selected as route policy in executor cluster, one task schedule will broadcast all executor node in cluster to trigger task execute in every executor, pass slice parameter at the same time, so we can develop slice task by slice parameters;
- 2、dynamic slice: break the task by the dimensions of executor, support dynamic extend executor cluster so that it can add slice number dynamically to do business process, In case of large amount of data process can significantly improve task processing capacity and speed;
- 3、executor JobHandler disables name conflicts;
- 4、executor cluster address list for natural sorting;
- 5、add test cases and optimize DAO layer code for Scheduling center;
- 6、schedule Center API service change to self-study RPC framework to u nify communication model;
- 7、add schedule center API service test Demo, convenient in dispatch center API extension and testing;
- 8、Task list page interaction optimization,The task list is automatically refreshed when the executor group is replaced,create new job defaults to locate current executor position;
- 9、access Token:To improve system security,it is used for safety check between schedule center and executor, communication allowed just when Both Access Token matched;
- 10、upgrade springboot version to 1.5.6.RELEASE of executor;
- 11、unify maven version dependency management;
### 6.19 version V1.8.2 New features[Coding]
- 1,support configuring the HTTPS for executor callback URL;
- 2,Standardize project directory for extend multi executors;
- 3,add JFinal type executor sample project;
### 6.43 version v3.3.2 Release Notes[2026-01-01]
- 1、【Optimization】Graceful Shutdown: When the scheduling center shuts down, it actively waits for scheduling completion when detecting non-empty time wheels; when the client shuts down, it stops receiving new tasks and actively waits for task execution completion when detecting running tasks;
- 2、【New Feature】Docker Compose Configuration: Added Docker Compose configuration to support one-click configuration and startup of scheduling center clusters;
<details>
<summary>Docker Compose startup steps:</summary>
```
// Download XXL-JOB
git clone --branch "$(curl -s https://api.github.com/repos/xuxueli/xxl-job/releases/latest | jq -r .tag_name)" https://github.com/xuxueli/xxl-job.git
// Build XXL-JOB
mvn clean package -Dmaven.test.skip=true
// Start XXL-JOB
MYSQL_PATH={自定义数据库持久化目录} docker compose up -d
// Stop XXL-JOB
docker compose down
```
</details>
- 3、【Optimization】 Scheduling Center Operation Experience: Table interaction adjusted to single-row selection mode; disabled pagination cycling; optimized pagination limit text;
- 4、【Optimization】 Scheduling Thread Transaction Commit Logic: Adjusted to avoid thread abnormal exit under edge conditions, enhancing robustness;
- 5、【Optimization】 Scheduling Log List Sorting Logic: Optimized for improved readability;
- 6、【Optimization】 Scheduling Center OpenAPI Communication Token: Adjusted to optional instead of required; merged PR-3892;
- 7、【Optimization】 Executor Detail Interface Permissions: Adjusted to support regular users viewing registered nodes; merged PR-3882;
- 8、【Optimization】 Task Parameter LogDateTime Generation Logic: Adjusted to ensure consistency for the same batch of scheduling in sharding broadcast scenarios;
- 9、【Upgrade】 Maven Dependencies: Upgraded multiple dependencies to newer versions, such as spring, netty, xxl-sso, xxl-tool, etc.;
- 10、【Optimization】 Unified Project Dependency Management Structure: Unified dependency versions to parent pom for improved maintainability;
## 7. Other
### 7.1 Contributing
Contributions are welcome! Open a pull request to fix a bug, or open an [Issue](https://github.com/xuxueli/xxl-job/issues/) to discuss a new feature or change.
### 7.2 used records(record just for spread,Product is open source and free of charge)
Record for spread product and product is free and open source.
Welcome to [check in](https://github.com/xuxueli/xxl-job/issues/1 )on github.
### 7.3 Copyright and License
This product is open source and free, and will continue to provide free community technical support. Individual or enterprise users are free to access and use.
- Licensed under the GNU General Public License (GPL) v3.
- Copyright (c) 2015-present, xuxueli.
---
### Donate
No matter how much the amount is enough to express your thought, thank you very much :) [To donate](https://www.xuxueli.com/page/donate.html )
================================================
FILE: doc/XXL-JOB官方文档.md
================================================
## 《分布式任务调度平台XXL-JOB》
[](https://github.com/xuxueli/xxl-job/actions)
[](https://central.sonatype.com/artifact/com.xuxueli/xxl-job-core)
[](https://github.com/xuxueli/xxl-job/releases)
[](https://github.com/xuxueli/xxl-job/)
[](https://hub.docker.com/r/xuxueli/xxl-job-admin/)
[](http://www.gnu.org/licenses/gpl-3.0.html)
[](https://www.xuxueli.com/page/donate.html)
[TOCM]
[TOC]
## 一、简介
### 1.1 概述
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
### 1.2 社区交流
- [社区交流](https://www.xuxueli.com/page/community.html)
### 1.3 特性
- 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
- 2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;
- 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA;
- 4、执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA;
- 5、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
- 6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;
- 7、触发策略:提供丰富的任务触发策略,包括:Cron触发、固定间隔触发、固定延时触发、API(事件)触发、人工触发、父子任务触发;
- 8、调度过期策略:调度中心错过调度时间的补偿处理策略,包括:忽略、立即补偿触发一次等;
- 9、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
- 10、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务;
- 11、任务失败重试:支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;其中分片任务支持分片粒度的失败重试;
- 12、任务失败告警;默认提供邮件方式失败告警,同时预留扩展接口,可方便的扩展短信、钉钉等告警方式;
- 13、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;
- 14、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务;
- 15、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。
- 16、故障转移:任务路由策略选择"故障转移"情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。
- 17、任务进度监控:支持实时监控任务进度;
- 18、Rolling实时日志:支持在线查看调度结果,并且支持以Rolling方式实时查看执行器输出的完整的执行日志;
- 19、GLUE:提供Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。支持30个版本的历史版本回溯。
- 20、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python、NodeJS、PHP、PowerShell等类型脚本;
- 21、命令行任务:原生提供通用命令行任务Handler(Bean任务,"CommandJobHandler");业务方只需要提供命令行即可;
- 22、任务依赖:支持配置子任务依赖,当父任务执行结束且执行成功后将会主动触发一次子任务的执行, 多个子任务用逗号分隔;
- 23、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行;
- 24、自定义任务参数:支持在线配置调度任务入参,即时生效;
- 25、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞;
- 26、数据加密:调度中心和执行器之间的通讯进行数据加密,提升调度信息安全性;
- 27、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件;
- 28、推送maven中央仓库: 将会把最新稳定版推送到maven中央仓库, 方便用户接入和使用;
- 29、运行报表:支持实时查看运行数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等;
- 30、全异步:任务调度流程全异步化设计实现,如异步调度、异步运行、异步回调等,有效对密集调度进行流量削峰,理论上支持任意时长任务的运行;
- 31、跨语言/OpenAPI:调度中心与执行器提供语言无关的 OpenApi(RESTful 格式),第三方任意语言可据此对接调度中心或者实现执行器,实现多语言支持。除此之外,还提供了 “多任务模式”和“httpJobHandler”等其他跨语言方案;
- 32、国际化:调度中心支持国际化设置,提供中文、英文两种可选语言,默认为中文;
- 33、容器化:提供官方docker镜像,并实时更新推送dockerhub,进一步实现产品开箱即用;
- 34、线程池隔离:调度线程池进行隔离拆分,慢任务自动降级进入"Slow"线程池,避免耗尽调度线程,提高系统稳定性;
- 35、用户管理:支持在线管理系统用户,存在管理员、普通用户两种角色;
- 36、权限控制:执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作;
- 37、AI任务:原生提供AI执行器,并内置多个AI任务Handler,与spring-ai、ollama、dify等集成打通,支持快速开发AI类任务。
- 38、审计日志:记录任务操作敏感信息,用于系统监控、审计和安全分析,可快速追溯异常行为以及定位排查问题。
- 39、优雅停机:调度中心停机,检测时间轮非空时主动等待调度完成;客户端停机,检测存在运行中任务时,停止接收新任务并主动等待任务执行完成;
### 1.4 发展
于2015年中,我在github上创建XXL-JOB项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计……
于2015-11月,XXL-JOB终于RELEASE了第一个大版本V1.0, 随后我将之发布到OSCHINA,XXL-JOB在OSCHINA上获得了@红薯的热门推荐,同期分别达到了OSCHINA的“热门动弹”排行第一和git.oschina的开源软件月热度排行第一,在此特别感谢红薯,感谢大家的关注和支持。
于2015-12月,我将XXL-JOB发表到我司内部知识库,并且得到内部同事认可。
于2016-01月,我司展开XXL-JOB的内部接入和定制工作,在此感谢袁某和尹某两位同事的贡献,同时也感谢内部其他给与关注与支持的同事。
于2017-05-13,在上海举办的 "[第62期开源中国源创会](https://www.oschina.net/event/2236961)" 的 "放码过来" 环节,我登台对XXL-JOB做了演讲,台下五百位在场观众反响热烈([图文回顾](https://www.oschina.net/question/2686220_2242120) )。
于2017-10-22,又拍云 Open Talk 联合 Spring Cloud 中国社区举办的 "[进击的微服务实战派上海站](https://opentalk.upyun.com/303.html)",我登台对XXL-JOB做了演讲,现场观众反响热烈并在会后与XXL-JOB用户热烈讨论交流。
于2017-12-11,XXL-JOB有幸参会《[InfoQ ArchSummit全球架构师峰会](http://bj2017.archsummit.com/)》,并被拍拍贷架构总监"杨波老师"在专题 "[微服务原理、基础架构和开源实践](http://bj2017.archsummit.com/training/2)" 中现场介绍。
于2017-12-18,XXL-JOB参与"[2017年度最受欢迎中国开源软件](http://www.oschina.net/project/top_cn_2017?sort=1)"评比,在当时已录入的约九千个国产开源项目中角逐,最终进入了前30强。
于2018-01-15,XXL-JOB参与"[2017码云最火开源项目](https://www.oschina.net/news/92438/2017-mayun-top-50)"评比,在当时已录入的约六千五百个码云项目中角逐,最终进去了前20强。
于2018-04-14,iTechPlus在上海举办的 "[2018互联网开发者大会](http://www.itdks.com/eventlist/detail/2065)",我登台对XXL-JOB做了演讲,现场观众反响热烈并在会后与XXL-JOB用户热烈讨论交流。
于2018-05-27,在上海举办的 "[第75期开源中国源创会](https://www.oschina.net/event/2278742)" 的 "架构" 主题专场,我登台进行“基础架构与中间件图谱”主题演讲,台下上千位在场观众反响热烈([图文回顾](https://www.oschina.net/question/3802184_2280606) )。
于2018-12-05,XXL-JOB参与"[2018年度最受欢迎中国开源软件](https://www.oschina.net/project/top_cn_2018?sort=1)"评比,在当时已录入的一万多个开源项目中角逐,最终排名第19名。
于2019-12-10,XXL-JOB参与"[2019年度最受欢迎中国开源软件](https://www.oschina.net/project/top_cn_2019)"评比,在当时已录入的一万多个开源项目中角逐,最终排名"开发框架和基础组件类"第9名。
于2020-11-16,XXL-JOB参与"[2020年度最受欢迎中国开源软件](https://www.oschina.net/project/top_cn_2020)"评比,在当时已录入的一万多个开源项目中角逐,最终排名"开发框架和基础组件类"第8名。
于2021-12-06,XXL-JOB参与"[2021年度OSC中国开源项目评选](https://www.oschina.net/project/top_cn_2021) "评比,在当时已录入的一万多个开源项目中角逐,最终当选"最受欢迎项目"。
> 我司大众点评目前已接入XXL-JOB,内部别名《Ferrari》(Ferrari基于XXL-JOB的V1.1版本定制而成,新接入应用推荐升级最新版本)。
> 据最新统计, 自2016-01-21接入至2017-12-01期间,该系统已调度约100万次,表现优异。新接入应用推荐使用最新版本,因为经过数十个版本的更新,系统的任务模型、UI交互模型以及底层调度通讯模型都有了较大的优化和提升,核心功能更加稳定高效。
至今,XXL-JOB已接入多家公司的线上产品线,接入场景如电商业务,O2O业务和大数据作业等,截止最新统计时间为止,XXL-JOB已接入的公司包括不限于:
- 1、大众点评【美团点评】
- 2、山东学而网络科技有限公司;
- 3、安徽慧通互联科技有限公司;
- 4、人人聚财金服;
- 5、上海棠棣信息科技股份有限公司
- 6、运满满【运满满】
- 7、米其林 (中国区)【米其林】
- 8、妈妈联盟
- 9、九樱天下(北京)信息技术有限公司
- 10、万普拉斯科技有限公司【一加手机】
- 11、上海亿保健康管理有限公司
- 12、海尔馨厨【海尔】
- 13、河南大红包电子商务有限公司
- 14、成都顺点科技有限公司
- 15、深圳市怡亚通
- 16、深圳麦亚信科技股份有限公司
- 17、上海博莹科技信息技术有限公司
- 18、中国平安科技有限公司【中国平安】
- 19、杭州知时信息科技有限公司
- 20、博莹科技(上海)有限公司
- 21、成都依能股份有限责任公司
- 22、湖南高阳通联信息技术有限公司
- 23、深圳市邦德文化发展有限公司
- 24、福建阿思可网络教育有限公司
- 25、优信二手车【优信】
- 26、上海悠游堂投资发展股份有限公司【悠游堂】
- 27、北京粉笔蓝天科技有限公司
- 28、中秀科技(无锡)有限公司
- 29、武汉空心科技有限公司
- 30、北京蚂蚁风暴科技有限公司
- 31、四川互宜达科技有限公司
- 32、钱包行云(北京)科技有限公司
- 33、重庆欣才集团
- 34、咪咕互动娱乐有限公司【中国移动】
- 35、北京诺亦腾科技有限公司
- 36、增长引擎(北京)信息技术有限公司
- 37、北京英贝思科技有限公司
- 38、刚泰集团
- 39、深圳泰久信息系统股份有限公司
- 40、随行付支付有限公司
- 41、广州瀚农网络科技有限公司
- 42、享点科技有限公司
- 43、杭州比智科技有限公司
- 44、圳临界线网络科技有限公司
- 45、广州知识圈网络科技有限公司
- 46、国誉商业上海有限公司
- 47、海尔消费金融有限公司,嗨付、够花【海尔】
- 48、广州巴图鲁信息科技有限公司
- 49、深圳市鹏海运电子数据交换有限公司
- 50、深圳市亚飞电子商务有限公司
- 51、上海趣医网络有限公司
- 52、聚金资本
- 53、北京父母邦网络科技有限公司
- 54、中山元赫软件科技有限公司
- 55、中商惠民(北京)电子商务有限公司
- 56、凯京集团
- 57、华夏票联(北京)科技有限公司
- 58、拍拍贷【拍拍贷】
- 59、北京尚德机构在线教育有限公司
- 60、任子行股份有限公司
- 61、北京时态电子商务有限公司
- 62、深圳卷皮网络科技有限公司
- 63、北京安博通科技股份有限公司
- 64、未来无线网
- 65、厦门瓷禧网络有限公司
- 66、北京递蓝科软件股份有限公司
- 67、郑州创海软件科技公司
- 68、北京国槐信息科技有限公司
- 69、浪潮软件集团
- 70、多立恒(北京)信息技术有限公司
- 71、广州极迅客信息科技有限公司
- 72、赫基(中国)集团股份有限公司
- 73、海投汇
- 74、上海润益创业孵化器管理股份有限公司
- 75、汉纳森(厦门)数据股份有限公司
- 76、安信信托
- 77、岚儒财富
- 78、捷道软件
- 79、湖北享七网络科技有限公司
- 80、湖南创发科技责任有限公司
- 81、深圳小安时代互联网金融服务有限公司
- 82、湖北享七网络科技有限公司
- 83、钱包行云(北京)科技有限公司
- 84、360金融【360】
- 85、易企秀
- 86、摩贝(上海)生物科技有限公司
- 87、广东芯智慧科技有限公司
- 88、联想集团【联想】
- 89、怪兽充电
- 90、行圆汽车
- 91、深圳店店通科技邮箱公司
- 92、京东【京东】
- 93、米庄理财
- 94、咖啡易融
- 95、梧桐诚选
- 96、恒大地产【恒大】
- 97、昆明龙慧
- 98、上海涩瑶软件
- 99、易信【网易】
- 100、铜板街
- 101、杭州云若网络科技有限公司
- 102、特百惠(中国)有限公司
- 103、常山众卡运力供应链管理有限公司
- 104、深圳立创电子商务有限公司
- 105、杭州智诺科技股份有限公司
- 106、北京云漾信息科技有限公司
- 107、深圳市多银科技有限公司
- 108、亲宝宝
- 109、上海博卡软件科技有限公司
- 110、智慧树在线教育平台
- 111、米族金融
- 112、北京辰森世纪
- 113、云南滇医通
- 114、广州市分领网络科技有限责任公司
- 115、浙江微能科技有限公司
- 116、上海馨飞电子商务有限公司
- 117、上海宝尊电子商务有限公司
- 118、直客通科技技术有限公司
- 119、科度科技有限公司
- 120、上海数慧系统技术有限公司
- 121、我的医药网
- 122、多粉平台
- 123、铁甲二手机
- 124、上海海新得数据技术有限公司
- 125、深圳市珍爱网信息技术有限公司【珍爱网】
- 126、小蜜蜂
- 127、吉荣数科技
- 128、上海恺域信息科技有限公司
- 129、广州荔支网络有限公司【荔枝FM】
- 130、杭州闪宝科技有限公司
- 131、北京互联新网科技发展有限公司
- 132、誉道科技
- 133、山西兆盛房地产开发有限公司
- 134、北京蓝睿通达科技有限公司
- 135、月亮小屋(中国)有限公司【蓝月亮】
- 136、青岛国瑞信息技术有限公司
- 137、博雅云计算(北京)有限公司
- 138、华泰证券香港子公司
- 139、杭州东方通信软件技术有限公司
- 140、武汉博晟安全技术股份有限公司
- 141、深圳市六度人和科技有限公司
- 142、杭州趣维科技有限公司(小影)
- 143、宁波单车侠之家科技有限公司【单车侠】
- 144、丁丁云康信息科技(北京)有限公司
- 145、云钱袋
- 146、南京中兴力维
- 147、上海矽昌通信技术有限公司
- 148、深圳萨科科技
- 149、中通服创立科技有限责任公司
- 150、深圳市对庄科技有限公司
- 151、上证所信息网络有限公司
- 152、杭州火烧云科技有限公司【婚礼纪】
- 153、天津青芒果科技有限公司【芒果头条】
- 154、长飞光纤光缆股份有限公司
- 155、世纪凯歌(北京)医疗科技有限公司
- 156、浙江霖梓控股有限公司
- 157、江西腾飞网络技术有限公司
- 158、安迅物流有限公司
- 159、肉联网
- 160、北京北广梯影广告传媒有限公司
- 161、上海数慧系统技术有限公司
- 162、大志天成
- 163、上海云鹊医
- 164、上海云鹊医
- 165、墨迹天气【墨迹天气】
- 166、上海逸橙信息科技有限公司
- 167、沅朋物联
- 168、杭州恒生云融网络科技有限公司
- 169、绿米联创
- 170、重庆易宠科技有限公司
- 171、安徽引航科技有限公司(乐职网)
- 172、上海数联医信企业发展有限公司
- 173、良彬建材
- 174、杭州求是同创网络科技有限公司
- 175、荷马国际
- 176、点雇网
- 177、深圳市华星光电技术有限公司
- 178、厦门神州鹰软件科技有限公司
- 179、深圳市招商信诺人寿保险有限公司
- 180、上海好屋网信息技术有限公司
- 181、海信集团【海信】
- 182、信凌可信息科技(上海)有限公司
- 183、长春天成科技发展有限公司
- 184、用友金融信息技术股份有限公司【用友】
- 185、北京咖啡易融有限公司
- 186、国投瑞银基金管理有限公司
- 187、晋松(上海)网络信息技术有限公司
- 188、深圳市随手科技有限公司【随手记】
- 189、深圳水务科技有限公司
- 190、易企秀【易企秀】
- 191、北京磁云科技
- 192、南京蜂泰互联网科技有限公司
- 193、章鱼直播
- 194、奖多多科技
- 195、天津市神州商龙科技股份有限公司
- 196、岩心科技
- 197、车码科技(北京)有限公司
- 198、贵阳市投资控股集团
- 199、康旗股份
- 200、龙腾出行
- 201、杭州华量软件
- 202、合肥顶岭医疗科技有限公司
- 203、重庆表达式科技有限公司
- 204、上海米道信息科技有限公司
- 205、北京益友会科技有限公司
- 206、北京融贯电子商务有限公司
- 207、中国外汇交易中心
- 208、中国外运股份有限公司
- 209、中国上海晓圈教育科技有限公司
- 210、普联软件股份有限公司
- 211、北京科蓝软件股份有限公司
- 212、江苏斯诺物联科技有限公司
- 213、北京搜狐-狐友【搜狐】
- 214、新大陆网商金融
- 215、山东神码中税信息科技有限公司
- 216、河南汇顺网络科技有限公司
- 217、北京华夏思源科技发展有限公司
- 218、上海东普信息科技有限公司
- 219、上海鸣勃网络科技有限公司
- 220、广东学苑教育发展有限公司
- 221、深圳强时科技有限公司
- 222、上海云砺信息科技有限公司
- 223、重庆愉客行网络有限公司
- 224、数云
- 225、国家电网运检部
- 226、杭州找趣
- 227、浩鲸云计算科技股份有限公司
- 228、科大讯飞【科大讯飞】
- 229、杭州行装网络科技有限公司
- 230、即有分期金融
- 231、深圳法司德信息科技有限公司
- 232、上海博复信息科技有限公司
- 233、杭州云嘉云计算有限公司
- 234、有家民宿(有家美宿)
- 235、北京赢销通软件技术有限公司
- 236、浙江聚有财金融服务外包有限公司
- 237、易族智汇(北京)科技有限公司
- 238、合肥顶岭医疗科技开发有限公司
- 239、车船宝(深圳)旭珩科技有限公司)
- 240、广州富力地产有限公司
- 241、氢课(上海)教育科技有限公司
- 242、武汉氪细胞网络技术有限公司
- 243、杭州有云科技有限公司
- 244、上海仙豆智能机器人有限公司
- 245、拉卡拉支付股份有限公司【拉卡拉】
- 246、虎彩印艺股份有限公司
- 247、北京数微科技有限公司
- 248、广东智瑞科技有限公司
- 249、找钢网
- 250、九机网
- 251、杭州跑跑网络科技有限公司
- 252、深圳未来云集
- 253、杭州每日给力科技有限公司
- 254、上海齐犇信息科技有限公司
- 255、滴滴出行【滴滴】
- 256、合肥云诊信息科技有限公司
- 257、云知声智能科技股份有限公司
- 258、南京坦道科技有限公司
- 259、爱乐优(二手平台)
- 260、猫眼电影(私有化部署)【猫眼电影】
- 261、美团大象(私有化部署)【美团大象】
- 262、作业帮教育科技(北京)有限公司【作业帮】
- 263、北京小年糕互联网技术有限公司
- 264、山东矩阵软件工程股份有限公司
- 265、陕西国驿软件科技有限公司
- 266、君开信息科技
- 267、村鸟网络科技有限责任公司
- 268、云南国际信托有限公司
- 269、金智教育
- 270、珠海市筑巢科技有限公司
- 271、上海百胜软件股份有限公司
- 272、深圳市科盾科技有限公司
- 273、哈啰出行【哈啰】
- 274、途虎养车【途虎】
- 275、卡思优派人力资源集团
- 276、南京观为智慧软件科技有限公司
- 277、杭州城市大脑科技有限公司
- 278、猿辅导【猿辅导】
- 279、洛阳健创网络科技有限公司
- 280、魔力耳朵
- 281、亿阳信通
- 282、上海招鲤科技有限公司
- 283、四川商旅无忧科技服务有限公司
- 284、UU跑腿
- 285、北京老虎证券【老虎证券】
- 286、悠活省吧(北京)网络科技有限公司
- 287、F5未来商店
- 288、深圳环阳通信息技术有限公司
- 289、遠傳電信
- 290、作业帮(北京)教育科技有限公司【作业帮】
- 291、成都科鸿智信科技有限公司
- 292、北京木屋时代科技有限公司
- 293、大学通(哈尔滨)科技有限责任公司
- 294、浙江华坤道威数据科技有限公司
- 295、吉祥航空【吉祥航空】
- 296、南京圆周网络科技有限公司
- 297、广州市洋葱omall电子商务
- 298、天津联物科技有限公司
- 299、跑哪儿科技(北京)有限公司
- 300、深圳市美西西餐饮有限公司(喜茶)
- 301、平安不动产有限公司【平安】
- 302、江苏中海昇物联科技有限公司
- 303、湖南牙医帮科技有限公司
- 304、重庆民航凯亚信息技术有限公司(易通航)
- 305、递易(上海)智能科技有限公司
- 306、亚朵
- 307、浙江新课堂教育股份有限公司
- 308、北京蜂创科技有限公司
- 309、德一智慧城市信息系统有限公司
- 310、北京翼点科技有限公司
- 311、湖南智数新维度信息科技有限公司
- 312、北京玖扬博文文化发展有限公司
- 313、上海宇珩信息科技有限公司
- 314、全景智联(武汉)科技有限公司
- 315、天津易客满国际物流有限公司
- 316、南京爱福路汽车科技有限公司
- 317、我房旅居集团
- 318、湛江亲邻科技有限公司
- 319、深圳市姜科网络有限公司
- 320、青岛日日顺物流有限公司
- 321、南京太川信息技术有限公司
- 322、美图之家科技优先公司【美图】
- 323、南京太川信息技术有限公司
- 324、众薪科技(北京)有限公司
- 325、武汉安安物联科技有限公司
- 326、北京智客朗道网络科技有限公司
- 327、深圳市超级猩猩健身管理管理有限公司
- 328、重庆达志科技有限公司
- 329、上海享评信息科技有限公司
- 330、薪得付信息科技
- 331、跟谁学
- 332、中道(苏州)旅游网络科技有限公司
- 333、广州小卫科技有限公司
- 334、上海非码网络科技有限公司
- 335、途家网网络技术(北京)有限公司【途家】
- 336、广州辉凡信息科技有限公司
- 337、天维尔信息科技股份有限公司
- 338、上海极豆科技有限公司
- 339、苏州触达信息技术有限公司
- 340、北京热云科技有限公司
- 341、中智企服(北京)科技有限公司
- 342、易联云计算(杭州)有限责任公司
- 343、青岛航空股份有限公司【青岛航空】
- 344、山西博睿通科技有限公司
- 345、网易杭州网络有限公司【网易】
- 346、北京果果乐学科技有限公司
- 347、百望股份有限公司
- 348、中保金服(深圳)科技有限公司
- 349、天津运友物流科技股份有限公司
- 350、广东创能科技股份有限公司
- 351、上海倚博信息科技有限公司
- 352、深圳百果园实业(集团)股份有限公司
- 353、广州细刻网络科技有限公司
- 354、武汉鸿业众创科技有限公司
- 355、金锡科技(广州)有限公司
- 356、易瑞国际电子商务有限公司
- 357、奇点云
- 358、中视信息科技有限公司
- 359、开源项目:datax-web
- 360、云知声智能科技股份有限公司
- 361、开源项目:bboss
- 362、成都深驾科技有限公司
- 363、FunPlus【趣加】
- 364、杭州创匠信科技有限公司
- 365、龙匠(北京)科技发展有限公司
- 366、广州一链通互联网科技有限公司
- 367、上海星艾网络科技有限公司
- 368、虎博网络技术(上海)有限公司
- 369、青岛优米信息技术有限公司
- 370、八维通科技有限公司
- 371、烟台合享智星数据科技有限公司
- 372、东吴证券股份有限公司
- 373、中通云仓股份有限公司【中通】
- 374、北京加菲猫科技有限公司
- 375、北京匠心演绎科技有限公司
- 376、宝贝走天下
- 377、厦门众库科技有限公司
- 378、海通证券数据中心
- 389、湖南快乐通宝小额贷款有限公司
- 380、浙江大华技术股份有限公司
- 381、杭州魔筷科技有限公司
- 382、青岛掌讯通区块链科技有限公司
- 383、新大陆金融科技
- 384、常州玺拓软件科技有限公司
- 385、北京正保网格教育科技有限公司
- 386、统一企业(中国)投资有限公司【统一】
- 387、微革网络科技有限公司
- 388、杭州融易算科技有限公司
- 399、青岛上啥班网络科技有限公司
- 390、京东酒世界
- 391、杭州爱博仕科技有限公司
- 392、五星金服控股有限公司
- 393、福建乐摩物联科技有限公司
- 394、百炼智能科技有限公司
- 395、山东能源数智云科技有限公司
- 396、招商局能源运输股份有限公司
- 397、三一集团【三一】
- 398、东巴文(深圳)健康管理有限公司
- 399、索易软件
- 400、深圳市宁远科技有限公司
- 401、熙牛医疗
- 402、南京智鹤电子科技有限公司
- 403、嘀嗒出行【嘀嗒出行】
- 404、广州虎牙信息科技有限公司【虎牙】
- 405、广州欧莱雅百库网络科技有限公司【欧莱雅】
- 406、微微科技有限公司
- 407、我爱我家房地产经纪有限公司【我爱我家】
- 408、九号发现
- 409、薪人薪事
- 410、武汉氪细胞网络技术有限公司
- 411、广州市斯凯奇商业有限公司
- 412、微淼商学院
- 413、杭州车盛科技有限公司
- 414、深兰科技(上海)有限公司
- 415、安徽中科美络信息技术有限公司
- 416、比亚迪汽车工业有限公司【比亚迪】
- 417、湖南小桔信息技术有限公司
- 418、安徽科大国创软件科技有限公司
- 419、克而瑞
- 420、陕西云基华海信息技术有限公司
- 421、安徽深宁科技有限公司
- 422、广东康爱多数字健康有限公司
- 423、嘉里电子商务
- 424、上海时代光华教育发展有限公司
- 425、CityDo
- 426、上海禹知信息科技有限公司
- 427、广东智瑞科技有限公司
- 428、西安爱铭网络科技有限公司
- 429、心医国际数字医疗系统(大连)有限公司
- 430、乐其电商
- 431、锐达科技
- 432、天津长城滨银汽车金融有限公司
- 433、代码网
- 434、东莞市东城乔伦软件开发工作室
- 435、浙江百应科技有限公司
- 436、上海力爱帝信息技术有限公司(Red E)
- 437、云徙科技有限公司
- 438、北京康智乐思网络科技有限公司【大姨吗APP】
- 439、安徽开元瞬视科技有限公司
- 440、立方
- 441、厦门纵行科技
- 442、乐山-菲尼克斯半导体有限公司
- 443、武汉光谷联合集团有限公司
- 444、上海金仕达软件科技有限公司
- 445、深圳易世通达科技有限公司
- 446、爱动超越人工智能科技(北京)有限责任公司
- 447、迪普信(北京)科技有限公司
- 448、掌站科技(北京)有限公司
- 449、深圳市华云中盛股份有限公司
- 450、上海原圈科技有限公司
- 451、广州赞赏信息科技有限公司
- 452、Amber Group
- 453、德威国际货运代理(上海)公司
- 454、浙江杰夫兄弟智慧科技有限公司
- 455、信也科技
- 456、开思时代科技(深圳)有限公司
- 457、大连槐德科技有限公司
- 458、同程生活
- 459、松果出行
- 460、企鹅杏仁集团
- 461、宁波科云信息科技有限公司
- 462、上海格蓝威驰信息科技有限公司
- 463、杭州趣淘鲸科技有限公司
- 464、湖州市数字惠民科技有限公司
- 465、乐普(北京)医疗器械股份有限公司
- 466、广州市晴川高新技术开发有限公司
- 467、山西缇客科技有限公司
- 468、徐州卡西穆电子商务有限公司
- 469、格创东智科技有限公司
- 470、世纪龙信息网络有限责任公司
- 471、邦道科技有限公司
- 472、河南中盟新云科技股份有限公司
- 473、横琴人寿保险有限公司
- 474、上海海隆华钟信息技术有限公司
- 475、上海久湛
- 476、上海仙豆智能机器人有限公司
- 477、广州汇尚网络科技有限公司
- 478、深圳市阿卡索资讯股份有限公司
- 479、青岛佳家康健康管理有限责任公司
- 480、蓝城兄弟
- 481、成都天府通金融服务股份有限公司
- 482、深圳云镖网络科技有限公司
- 483、上海影创科技
- 484、成都艾拉物联
- 485、北京客邻尚品网络技术有限公司
- 486、IT实战联盟
- 487、杭州尤拉夫科技有限公司
- 488、中大检测(湖南)股份有限公司
- 489、江苏电老虎工业互联网股份有限公司
- 490、上海助通信息科技有限公司
- 491、北京符节科技有限公司
- 492、杭州英祐科技有限公司
- 493、江苏电老虎工业互联网股份有限公司
- 494、深圳市点猫科技有限公司
- 495、杭州天音
- 496、深圳市二十一科技互联网有限公司
- 497、海南海口翎度科技
- 498、北京小趣智品科技有限公司
- 499、广州石竹计算机软件有限公司
- 500、深圳市惟客数据科技有限公司
- 501、中国医疗器械有限公司
- 502、上海云谦科技有限公司
- 503、上海磐农信息科技有限公司
- 504、广州领航食品有限公司
- 505、青岛掌讯通区块链科技有限公司
- 506、北京新网数码信息技术有限公司
- 507、超体信息科技(深圳)有限公司
- 508、长沙店帮手信息科技有限公司
- 509、上海助弓装饰工程有限公司
- 510、杭州寻联网络科技有限公司
- 511、成都大淘客科技有限公司
- 512、松果出行
- 513、深圳市唤梦科技有限公司
- 514、上汽集团商用车技术中心
- 515、北京中航讯科技股份有限公司
- 516、北龙中网(北京)科技有限责任公司
- 517、前海超级前台(深圳)信息技术有限公司
- 518、上海中商网络股份有限公司
- 519、上海助通信息科技有限公司
- 520、宁波聚臻智能科技有限公司
- 521、上海零动数码科技股份有限公司
- 522、浙江学海教育科技有限公司
- 523、聚学云(山东)信息技术有限公司
- 524、多氟多新材料股份有限公司
- 525、智慧眼科技股份有限公司
- 526、广东智通人才连锁股份有限公司
- 527、世纪开元智印互联科技集团股份有限公司
- 528、北京理想汽车【理想汽车】
- 529、巽逸科技(重庆)有限公司
- 530、义乌购电子商务有限公司
- 531、深圳市珂莱蒂尔服饰有限公司
- 532、江西国泰利民信息科技有限公司
- 533、广西广电大数据科技有限公司
- 534、杭州艾麦科技有限公司
- 535、广州小滴科技有限公司
- 536、佳缘科技股份有限公司
- 537、上海深擎信息科技有限公司
- 538、武商网
- 539、福建民本信息科技有限公司
- 540、杭州惠合信息科技有限公司
- 541、厦门爱立得科技有限公司
- 542、成都拟合未来科技有限公司
- 543、宁波聚臻智能科技有限公司
- 544、广东百慧科技有限公司
- 545、笨马网络
- 546、深圳市信安数字科技有限公司
- 547、深圳市思乐数据技术有限公司
- 548、四川绿源集科技有限公司
- 549、湖南云医链生物科技有限公司
- 550、杭州源诚科技有限公司
- 551、北京开课吧科技有限公司
- 552、北京多来点信息技术有限公司
- 553、JEECG BOOT低代码开发平台
- 554、苏州同元软控信息技术有限公司
- 555、江苏大泰信息技术有限公司
- 556、北京大禹汇智
- 557、北京盛哲科技有限公司
- 558、广州钛动科技有限公司
- 559、北京大禹汇智科技有限公司
- 560、湖南鼎翰文化股份有限公司
- 561、苏州安软信息科技有限公司
- 562、芒果tv
- 563、上海艺赛旗软件股份有限公司
- 564、中盈优创资讯科技有限公司
- 565、乐乎公寓
- 566、启明信息
- 567、苏州安软
- 568、南京富金的软件科技有限公司
- 569、深圳市新科聚合网络技术有限公司
- 570、你好现在(北京)科技股份有限公司
- 571、360考试宝典
- 572、北京一零科技有限公司
- 573、厦门星纵信息
- 574、Dalligent Solusi Indonesia
- 575、深圳华普物联科技有限公司
- 576、深圳行健自动化股份有限公司
- 577、深圳市富融信息科技服务有限公司
- 578、蓝鸟云
- 579、上海澎博财经资讯有限公司
- 580、北京小鸦科技有限公司
- 581、杭州盈泉云科技有限公司
- 582、惟客数据
- 583、GOSO香蜜闺秀
- 584、普乐师(上海)数字科技有限公司
- 585、西安市雁塔区咖北堂网络科技部
- 586、宁波聚臻智能科技有限公司
- 587、普乐师数字科技有限公司
- 588、江苏蟹联网科技有限公司
- 589、杭州未智科技有限公司
- 590、安吉智行物流有限公司
- 591、华生大家居集团有限公司
- 592、美心食品(广州)有限公司
- 593、货拉拉【货拉拉APP】
- 594、杭州思韬瑞科技有限公司
- 595、杭州玖融科技有限公司
- 596、北京优海网络科技有限公司
- 597、浙江大维高新技术股份有限公司
- 598、粤港澳大湾区数字经济研究院
- 599、普康(杭州)健康科技有限公司
- 600、华西证券股份有限公司【华西证券】
- 601、杭州海康机器人股份有限公司【海康】
- 602、河南宸邦信息技术有限公司
- 603、成都次元节点网络科技有限公司
- 604、富士康科技集团【富士康】
- 605、青岛东软载波科技股份有限公司
- 606、小菊快跑科技有限公司
- 607、视源股份
- 608、宁波聚臻智能科技有限公司
- 609、阔天科技有限公司
- 610、网宿科技有限公司
- 611、南京梵鼎信息技术有限公司
- 612、房天下【房天下】
- 613、特瓦特能源科技有限公司
- 614、拓迪智能科技有限公司
- 615、东软集团【东软】
- 616、开普云
- 617、领课网络
- 618、南京特维软件有限公司
- 619、福建易联众保睿通信息科技有限公司
- 620、浙江核心同花顺金融科技有限公司【同花顺】
- 621、浙江博观瑞思科技有限公司
- 622、北京新美互通科技有限公司
- 623、北京有生博大软件股份有限公司
- 624、时代中国
- 625、鱼泡网
- 626、一粒方糖(安徽)科技有限公司
- 627、北京外研在线数字科技有限公司
- 628、德电(中国)通信技术有限公司
- 629、杭州寻联网络科技有限公司
- 630、橙联(中国)有限公司
- 631、北京承启通科技有限公司
- 632、银联数据服务有限公司【银联】
- 633、上海晶确科技有限公司
- 634、亚信科技有限公司
- 635、福建新航物联网科技有限公司
- 636、上扬软件
- 637、深蓝汽车科技有限公司
- 638、南昌节点汇智科技有限公司
- 639、锐明技术
- 640、再造再生健康科技有限公司
- 641、华宝证券
- 642、卓正医疗
- 643、深圳湛信科技
- 644、陕西鑫众为软件有限公司
- 645、深圳市润农科技有限公司
- 646、庚商教育智能科技有限公司
- 647、杭州祎声科技
- 648、四川久远银海软件股份有限公司
- 649、GeeFox极狐低代码
- 650、浙江和仁科技股份有限公司
- 651、宁波聚臻智能科技有限公司
- 652、福建福昕软件开发股份有限公司【福昕】
- 653、广州中长康达信息技术有限公司
- 654、武汉趣改信息科技有限公司
- 655、北京华夏思源科技发展有限公司
- 656、宁波关关通科技有限公司
- 657、青岛吕氏餐饮有限公司
- 658、杭州乐刻网络科技有限公司
- 659、上海红瓦信息科技有限公司
- 660、陕西旅小宝信息科技有限公司
- 661、中科卓恒(大连)科技有限公司
- 662、北京华益精点生物技术有限公司
- 663、马士基(中国)航运有限公司【马士基】
- 664、陕西美咚网络科技有限公司
- 665、山东新北洋信息技术股份有限公司
- 666、福建中瑞文化发展集团有限公司
- 667、黑龙江省建工集团有限责任公司【黑龙江省建工】
- 668、志信能达安全科技(广州)有限公司
- 669、重庆开源共创科技有限公司
- 670、华泰人寿保险股份有限公司【华泰人寿】
- 671、成都盘古纵横集团
- 672、北京果果乐学科技有限公司
- 673、北京凌云空间科技有限公司
- 674、临工重机股份有限公司
- 675、上海热风时尚管理集团【热风】
- 676、HashKey Exchange
- 677、傲基(深圳)跨境商务股份有限公司
- 678、青岛文达通科技股份有限公司
- 679、杭州普罗云科技有限公司
- 680、浙江云鹭科技有限公司
- 681、中山市芯宏柿网络科技有限公司
- 682、深圳市家家顺物联科技
- 683、重庆斑西科技有限公司
- 684、福建省泰古信息技术有限公司
- 685、贵阳永青仪电科技有限公司
- 686、广州博依特智能信息科技有限公司
- 687、河南宠呦呦信息技术有限公司
- 688、陕西星邑空间技术有限公司
- 689、广东西欧克实业有限公司
- 690、唱吧麦颂KTV
- 691、联通云
- 692、北京爱话本科技有限公司
- 693、北京起创科技有限公司
- 694、平安证券【平安证券】
- 695、合肥中科类脑智能技术有限公司
- 696、南京同仁堂健康产业有限公司【同仁堂】
- 697、铜仁市碧江区智惠加油站
- 698、惟客数据
- 699、凤凰新闻【凤凰新闻】
- 700、深圳王力智能
- 701、返利网数字科技股份有限公司
- 702、上海阜能信息科技有限公司
- 703、深圳市极能超电数字科技有限公司
- 704、海目星激光科技集团股份有限公司
- 705、安克创新科技股份有限公司【安克】
- 706、大庆点神科技有限公司
- 707、浙江零跑科技股份有限公司【零跑】
- 708、成都成电金盘健康数据技术有限公司
- 709、成都极米科技股份有限公司【极米】
- 710、顺德职业技术大学
- 711、中邮证券有限责任公司【中邮证券】
- 712、志豪链云科技有限公司
- 713、湖南万鲸科技有限公司
- 714、广州万表
- 715、再惠(上海)网络科技有限公司
- 716、上海爱诚裕信息科技有限公司
- 717、杭州迈瑞数字科技有限公司
- 718、广州串联网络科技有限公司
- ……
> 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。
欢迎大家的关注和使用,XXL-JOB也将拥抱变化,持续发展。
### 1.5 下载
#### 文档地址
- [中文文档](https://www.xuxueli.com/xxl-job/)
- [English Documentation](https://www.xuxueli.com/xxl-job/en/)
#### 源码仓库地址
源码仓库地址 | Release Download
--- | ---
[https://github.com/xuxueli/xxl-job](https://github.com/xuxueli/xxl-job) | [Download](https://github.com/xuxueli/xxl-job/releases)
[http://gitee.com/xuxueli0323/xxl-job](http://gitee.com/xuxueli0323/xxl-job) | [Download](http://gitee.com/xuxueli0323/xxl-job/releases)
[https://gitcode.com/xuxueli/xxl-job](https://gitcode.com/xuxueli/xxl-job) | [Download](https://gitcode.com/xuxueli/xxl-job/tags)
#### 中央仓库地址
```
<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${最新稳定版本}</version>
</dependency>
```
### 1.6 环境
- Maven:3+
- Jdk:17+ (说明:版本3.x及以上要求Jdk17+;版本2.x及以下支持Jdk1.8)
- Mysql:8.0+
## 二、快速入门
### 2.1 初始化“调度数据库”
请下载项目源码并解压,获取 "调度数据库初始化SQL脚本" 并执行即可。
"调度数据库初始化SQL脚本" 位置为:
/xxl-job/doc/db/tables_xxl_job.sql
调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例;
如果mysql做主从,调度中心集群节点务必强制走主库;
### 2.2 编译源码
解压源码,按照maven格式将源码导入IDE, 使用maven进行编译即可,源码结构如下:
xxl-job-admin:调度中心
xxl-job-core:公共依赖
xxl-job-executor-samples:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器)
:xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器,推荐这种方式;
:xxl-job-executor-sample-frameless:无框架版本;
### 2.3 配置部署“调度中心”
调度中心项目:xxl-job-admin
作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。
#### 步骤一:调度中心配置:
调度中心配置文件地址:
```
/xxl-job/xxl-job-admin/src/main/resources/application.properties
```
调度中心配置内容说明:
```
### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
### 报警邮箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
### 调度中心通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 调度中心通讯超时时间[选填],单位秒;默认3s;
xxl.job.timeout=3
### 调度中心国际化配置 [必填]: 默认为 "zh_CN"/中文简体, 可选范围为 "zh_CN"/中文简体, "zh_TC"/中文繁体 and "en"/英文;
xxl.job.i18n=zh_CN
## 调度线程池最大线程配置【必填】
xxl.job.triggerpool.fast.max=300
xxl.job.triggerpool.slow.max=200
### 调度中心日志表数据保存天数 [必填]:过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能;
xxl.job.logretentiondays=30
```
#### 步骤二:部署项目:
如果已经正确进行上述配置,可将项目编译打包部署。
调度中心访问地址:http://localhost:8080/xxl-job-admin (该地址执行器将会使用到,作为回调地址)
默认登录账号 "admin/123456", 登录后运行界面如下图所示。

至此“调度中心”项目已经部署成功。
#### 步骤三:调度中心集群(可选):
调度中心支持集群部署,提升调度系统容灾和可用性。
调度中心集群部署时,几点要求和建议:
- DB配置保持一致;
- 集群机器时钟保持一致(单机集群忽视);
- 建议:推荐通过nginx为调度中心集群做负载均衡,分配域名。调度中心访问、执行器回调配置、调用API服务等操作均通过该域名进行。
#### 其他:Docker 镜像方式搭建调度中心:
- 下载镜像
```
/**
* Docker地址:https://hub.docker.com/r/xuxueli/xxl-job-admin/
* 建议指定版本号拉取镜像;
*/
docker pull xuxueli/xxl-job-admin:{指定版本}
```
- 创建容器并运行
```
/**
* 如需自定义 “项目配置文件” 中配置项,比如 mysql 配置,可通过 "-e PARAMS" 指定,参数格式: -e PARAMS="--key=value --key2=value2";
* (配置项参考文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties)
* 如需自定义 “JVM内存参数”,可通过 "-e JAVA_OPTS" 指定,参数格式: -e JAVA_OPTS="-Xmx512m"
* 如需自定义 “日志文件目录”,可通过 "-e LOG_HOME" 指定,参数格式: -e LOG_HOME=/data/applogs
*/
docker run -d \
-e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai" \
-p 8080:8080 \
-v /tmp:/data/applogs \
--name xxl-job-admin \
xuxueli/xxl-job-admin:{指定版本}
```
### 2.4 配置部署“执行器项目”
“执行器”项目:xxl-job-executor-sample-springboot (提供多种版本执行器供选择,现以 springboot 版本为例,可直接使用,也可以参考其并将现有项目改造成执行器)
作用:负责接收“调度中心”的调度并执行;可直接部署执行器,也可以将执行器集成到现有业务项目中。
#### 步骤一:maven依赖
确认pom文件中引入了 "xxl-job-core" 的maven依赖;
#### 步骤二:执行器配置
执行器配置,配置文件地址:
```
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties
```
执行器配置,配置内容说明:
```
### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 调度中心通讯TOKEN [选填]:非空时启用;
xxl.job.admin.accessToken=default_token
### 调度中心通讯超时时间[选填],单位秒;默认3s;
xxl.job.admin.timeout=3
### 执行器启用开关 [选填]:默认开启,关闭时不进行执行器初始化;
xxl.job.executor.enabled=true
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-executor-sample
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯使用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=30
### 任务扫描排除路径 [选填] :任务扫描时忽略指定包路径下的Bean;支持配置包路径前缀,多个逗号分隔;
xxl.job.executor.excludedpackage=org.springframework,spring
```
#### 步骤三:执行器组件配置
执行器组件,配置文件地址:
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java
执行器组件,配置内容说明:
```
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
```
#### 步骤四:部署执行器项目:
如果已经正确进行上述配置,可将执行器项目编译打包部署,系统提供多种执行器Sample示例项目,选择其中一个即可,各自的部署方式如下。
xxl-job-executor-sample-springboot:项目编译打包成springboot类型的可执行JAR包,命令启动即可;
xxl-job-executor-sample-frameless:项目编译打包成JAR包,命令启动即可;
至此“执行器”项目已经部署结束。
#### 步骤五:执行器集群(可选):
执行器支持集群部署,提升调度系统可用性,同时提升任务处理能力。
执行器集群部署时,几点要求和建议:
- 执行器回调地址(xxl.job.admin.addresses)需要保持一致;执行器根据该配置进行执行器自动注册等操作。
- 同一个执行器集群内AppName(xxl.job.executor.appname)需要保持一致;调度中心根据该配置动态发现不同集群的在线执行器列表。
### 2.5 开发第一个任务“Hello World”
本示例以新建一个 “GLUE模式(Java)” 运行模式的任务为例。更多有关任务的详细配置,请查看“章节三:任务详解”。
( “GLUE模式(Java)”的执行代码托管到调度中心在线维护,相比“Bean模式任务”需要在执行器项目开发部署上线,更加简便轻量)
> 前提:请确认“调度中心”和“执行器”项目已经成功部署并启动;
#### 步骤一:新建任务:
登录调度中心,点击下图所示“新建任务”按钮,新建示例任务。然后,参考下面截图中任务的参数配置,点击保存。


#### 步骤二:“GLUE模式(Java)” 任务开发:
请点击任务右侧 “GLUE IDE” 按钮,进入 “GLUE编辑器开发界面” ,见下图。“GLUE模式(Java)” 运行模式的任务默认已经初始化了示例任务代码,即打印Hello World。
( “GLUE模式(Java)” 运行模式的任务实际上是一段继承自IJobHandler的Java类代码,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器中的其他服务,详细介绍请查看第三章节)


#### 步骤三:触发执行:
请点击任务右侧 “执行” 按钮,可手动触发一次任务执行(通常情况下,通过配置Cron表达式进行任务调度触发)。
#### 步骤四:查看日志:
请点击任务右侧 “日志” 按钮,可前往任务日志界面查看任务日志。
在任务日志界面中,可查看该任务的历史调度记录以及每一次调度的任务调度信息、执行参数和执行信息。运行中的任务点击右侧的“执行日志”按钮,可进入日志控制台查看实时执行日志。

在日志控制台,可以Rolling方式实时查看任务在执行器一侧运行输出的日志信息,实时监控任务进度;

## 三、任务详解
### 配置属性详细说明:
基础配置:
- 执行器:任务的绑定的执行器,任务触发调度时将会自动发现注册成功的执行器, 实现任务自动发现功能; 另一方面也可以方便的进行任务分组。每个任务必须绑定一个执行器, 可在 "执行器管理" 进行设置;
- 任务描述:任务的描述信息,便于任务管理;
- 负责人:任务的负责人;
- 报警邮件:任务调度失败时邮件通知的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔;
触发配置:
- 调度类型:
无:该类型不会主动触发调度;
CRON:该类型将会通过CRON,触发任务调度;
固定速度:该类型将会以固定速度,触发任务调度;按照固定的间隔时间,周期性触发;
固定延迟:该类型将会以固定延迟,触发任务调度;按照固定的延迟时间,从上次调度结束后开始计算延迟时间,到达延迟时间后触发下次调度;
- CRON:触发任务执行的Cron表达式;
- 固定速度:固定速度的时间间隔,单位为秒;
- 固定延迟:固定延迟的时间间隔,单位为秒;
任务配置:
- 运行模式:
BEAN模式:任务以JobHandler方式维护在执行器端;需要结合 "JobHandler" 属性匹配执行器中任务;
GLUE模式(Java):任务以源码方式维护在调度中心;该模式的任务实际上是一段继承自IJobHandler的Java类代码并以 "groovy" 源码方式维护,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器中的其他服务;
GLUE模式(Shell):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "shell" 脚本;
GLUE模式(Python):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "python" 脚本;
GLUE模式(PHP):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "php" 脚本;
GLUE模式(NodeJS):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "nodejs" 脚本;
GLUE模式(PowerShell):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "PowerShell" 脚本;
- JobHandler:运行模式为 "BEAN模式" 时生效,对应执行器中新开发的JobHandler类“@XxlJob”注解自定义的value值;
- 执行参数:任务执行所需的参数;
高级配置:
- 路由策略:当执行器集群部署时,提供丰富的路由策略,包括;
FIRST(第一个):固定选择第一个机器;
LAST(最后一个):固定选择最后一个机器;
ROUND(轮询):;
RANDOM(随机):随机选择在线的机器;
CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举;
LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;
FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;
- 子任务:每个任务都拥有一个唯一的任务ID(任务ID可以从任务列表获取),当本任务执行结束并且执行成功时,将会触发子任务ID所对应的任务的一次主动调度。
- 调度过期策略:
- 忽略:调度过期后,忽略过期的任务,从当前时间开始重新计算下次触发时间;
- 立即执行一次:调度过期后,立即执行一次,并从当前时间开始重新计算下次触发时间;
- 阻塞处理策略:调度过于密集执行器来不及处理时的处理策略;
单机串行(默认):调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行;
丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败;
覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务;
- 任务超时时间:支持自定义任务超时时间,任务运行超时将会主动中断任务;
- 失败重试次数;支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;
### 3.1 BEAN模式(类形式)
Bean模式任务,支持基于类的开发方式,每个任务对应一个Java类。
- 优点:不限制项目环境,兼容性好。即使是无框架项目,如main方法直接启动的项目也可以提供支持,可以参考示例项目 "xxl-job-executor-sample-frameless";
- 缺点:
- 每个任务需要占用一个Java类,造成类的浪费;
- 不支持自动扫描任务并注入到执行器容器,需要手动注入。
#### 步骤一:执行器项目中,开发Job类:
1、开发一个继承自"com.xxl.job.core.handler.IJobHandler"的JobHandler类,实现其中任务方法。
2、手动通过如下方式注入到执行器容器。
```
XxlJobExecutor.registJobHandler("demoJobHandler", new DemoJobHandler());
```
#### 步骤二:调度中心,新建调度任务
后续步骤和 "3.2 BEAN模式(方法形式)"一致,可以前往参考。
### 3.2 BEAN模式(方法形式)
Bean模式任务,支持基于方法的开发方式,每个任务对应一个方法。
- 优点:
- 每个任务只需要开发一个方法,并添加"@XxlJob"注解即可,更加方便、快速。
- 支持自动扫描任务并注入到执行器容器。
- 缺点:略。
>基于方法开发的任务,底层会生成JobHandler代理,和基于类的方式一样,任务也会以JobHandler的形式存在于执行器任务容器中。
#### 步骤一:执行器项目中,开发Job方法:
1、任务开发:在Spring Bean实例中,开发Job方法;
2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;
4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果;
```
// 可参考Sample示例执行器中的 "com.xxl.job.executor.jobhandler.SampleXxlJob" ,如下:
@XxlJob("demoJobHandler")
public void demoJobHandler() throws Exception {
XxlJobHelper.log("XXL-JOB, Hello World.");
}
```
#### 步骤二:调度中心,新建调度任务
参考上文“配置属性详细说明”对新建的任务进行参数配置,运行模式选中 "BEAN模式",JobHandler属性填写任务注解“@XxlJob”中定义的值;

#### 原生内置Bean模式任务(通用执行器)
为方便用户参考与快速使用,提供 “通用执行器” 并内置多个Bean模式任务Handler,可以直接配置使用,如下:
**通用执行器说明:**
- AppName:xxl-job-executor-sample
- 执行器代码:
- xxl-job-executor-sample-springboot:springboot版本
- xxl-job-executor-sample-frameless:无框架版本
**执行器内置任务列表:**
- a、demoJobHandler:简单示例任务,任务内部模拟耗时任务逻辑,用户可在线体验Rolling Log等功能;
- b、shardingJobHandler:分片示例任务,任务内部模拟处理分片参数,可参考熟悉分片任务;
- c、httpJobHandler:通用HTTP任务Handler;业务方只需要提供HTTP链接等信息即可,不限制语言、平台。任务入参示例如下:
```
// 1、简单示例:
{
"url": "http://www.baidu.com",
"method": "GET",
"data": "hello world"
}
// 2、完整参数示例:
{
"url": "http://www.baidu.com", // 请求URL
"method": "POST", // 请求方法,支持:GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE
"contentType": "application/json", // 请求内容类型,支持:application/json、application/x-www-form-urlencoded、application/xml、text/html、text/xml、text/plain
"headers": { // 请求Header,key-value结构
"header01": "value01"
},
"cookies": { // 请求Cookie,key-value结构
"cookie01": "value01"
},
"timeout": 3000, // 请求超时时间,默认 3000;单位:毫秒;
"data": "request body data", // 请求Body数据,仅针对 POST 请求有效
"form": { // 请求Form数据,仅针对 GET 请求有效
"key01": "value01"
},
"auth": "auth data" // 请求认证信息, 通过Basic Auth方式认证
}
```
- d、commandJobHandler:通用命令行任务Handler;业务方只需要提供命令行即可,命令及参数之间通过空格隔开;如任务参数 "ls la" 或 "pwd" 将会执行命令并输出数据;
#### 原生内置Bean模式任务(AI执行器)
为方便用户参考与快速使用,提供 “AI执行器” 并内置多个Bean模式 AI任务Handler,与spring-ai、ollama、dify等集成打通,支持快速开发AI类任务,如下:
**AI执行器说明:**
- AppName:xxl-job-executor-sample-ai
- 执行器代码:xxl-job-executor-sample-springboot-ai
**执行器内置任务列表:**
- a、ollamaJobHandler: OllamaChat任务,支持自定义prompt、input等输入信息。示例任务入参如下:
```
{
"input": "{输入信息,必填信息}",
"prompt": "{模型prompt,可选信息}",
"model": "{模型实现,如qwen3:0.6b,可选信息}"
}
```
- b、difyWorkflowJobHandler:DifyWorkflow 任务,支持自定义inputs、user、baseUrl、apiKey 等输入信息,示例参数如下;
```
{
"inputs":{ // inputs 为dify工作流任务参数;参数不固定,结合各自 workflow 自行定义。
"input":"{用户输入信息}" // 该参数为示例变量,需要 workflow 的“开始”节点 自定义参数 “input”,可自行调整或删除。
},
"user": "xxl-job", // 用户标识,选填
"baseUrl": "http://localhost/v1", // Dify应用的 访问API 地址,需要从 Dify 系统获取;
"apiKey": "xxx" // Dify应用的 API-Key,需要从 Dify 系统获取;
}
```
- 依赖1:参考 [Ollama本地化部署大模型](https://www.xuxueli.com/blog/?blog=./notebook/13-AI/%E4%BD%BF%E7%94%A8Ollama%E6%9C%AC%E5%9C%B0%E5%8C%96%E9%83%A8%E7%BD%B2DeepSeek.md) ,执行器示例部署“qwen2.5:1.5b”模型,也可自定选择其他模型版本。
- 依赖2:参考 [使用DeepSeek与Dify搭建AI助手](https://www.xuxueli.com/blog/?blog=./notebook/13-AI/%E4%BD%BF%E7%94%A8DeepSeek%E4%B8%8EDify%E6%90%AD%E5%BB%BAAI%E5%8A%A9%E6%89%8B.md),执行器示例新建Dify DifyWork应用,并在开始节点添加“input”参数,可结合实际情况调整。
- 依赖3:启动示例 “AI执行器” 相关配置文件说明如下:
```
// ollama 配置
spring.ai.ollama.base-url=http://localhost:11434
spring.ai.ollama.chat.enabled=true
// Model模型配置;注意,此处配置模型版本、必须本地先通过ollama进行安装运行。
spring.ai.ollama.chat.options.model=qwen2.5:1.5b
spring.ai.ollama.chat.options.temperature=0.8
// dify 配置;选择相关 workflow 应用,切换 “访问API” 页面获取 url 地址信息.
dify.base-url=http://localhost/v1
// dify api-key;选择相关 workflow 应用并进入 “访问API” 页面,右上角 “API 密钥” 入口获取 api-key。
dify.api-key={自行获取并修改}
```
### 3.3 GLUE模式(Java)
任务以源码方式维护在调度中心,支持通过Web IDE在线更新,实时编译和生效,因此不需要指定JobHandler。开发流程如下:
#### 步骤一:调度中心,新建调度任务:
参考上文“配置属性详细说明”对新建的任务进行参数配置,运行模式选中 "GLUE模式(Java)";

#### 步骤二:开发任务代码:
选中指定任务,点击该任务右侧“GLUE”按钮,将会前往GLUE任务的Web IDE界面,在该界面支持对任务代码进行开发(也可以在IDE中开发完成后,复制粘贴到编辑器中)。
版本回溯功能(支持30个版本的版本回溯):在GLUE任务的Web IDE界面,选择右上角下拉框“版本回溯”,会列出该GLUE的更新历史,选择相应版本即可显示该版本代码,保存后GLUE代码即回退到对应的历史版本;

### 3.4 GLUE模式(Shell)
#### 步骤一:调度中心,新建调度任务
参考上文“配置属性详细说明”对新建的任务进行参数配置,运行模式选中 "GLUE模式(Shell)";
#### 步骤二:开发任务代码:
选中指定任务,点击该任务右侧“GLUE”按钮,将会前往GLUE任务的Web IDE界面,在该界面支持对任务代码进行开发(也可以在IDE中开发完成后,复制粘贴到编辑器中)。
该模式的任务实际上是一段 "shell" 脚本;

### 3.4 GLUE模式(Python)
#### 步骤一:调度中心,新建调度任务
参考上文“配置属性详细说明”对新建的任务进行参数配置,运行模式选中 "GLUE模式(Python)";
#### 步骤二:开发任务代码:
选中指定任务,点击该任务右侧“GLUE”按钮,将会前往GLUE任务的Web IDE界面,在该界面支持对任务代码进行开发(也可以在IDE中开发完成后,复制粘贴到编辑器中)。
该模式的任务实际上是一段 "python" 脚本;

### 3.5 GLUE模式(NodeJS)
#### 步骤一:调度中心,新建调度任务
参考上文“配置属性详细说明”对新建的任务进行参数配置,运行模式选中 "GLUE模式(NodeJS)";
#### 步骤二:开发任务代码:
选中指定任务,点击该任务右侧“GLUE”按钮,将会前往GLUE任务的Web IDE界面,在该界面支持对任务代码进行开发(也可以在IDE中开发完成后,复制粘贴到编辑器中)。
该模式的任务实际上是一段 "nodeJS" 脚本;
### 3.6 GLUE模式(PHP)
同上
### 3.7 GLUE模式(PowerShell)
同上
## 四、操作指南
### 4.1 配置执行器
点击进入"执行器管理"界面, 如下图:

1、"调度中心OnLine:"右侧显示在线的"调度中心"列表, 任务执行结束后, 将会以failover的模式进行回调调度中心通知执行结果, 避免回调的单点风险;
2、"执行器列表" 中显示在线的执行器列表, 可通过"OnLine 机器"查看对应执行器的集群机器。
点击按钮 "+新增执行器" 弹框如下图, 可新增执行器配置:

执行器属性说明
AppName: 是每个执行器集群的唯一标示AppName, 执行器会周期性以AppName为对象进行自动注册。可通过该配置自动发现注册成功的执行器, 供任务调度时使用;
名称: 执行器的名称, 因为AppName限制字母数字等组成,可读性不强, 名称为了提高执行器的可读性;
排序: 执行器的排序, 系统中需要执行器的地方,如任务新增, 将会按照该排序读取可用的执行器列表;
注册方式:调度中心获取执行器地址的方式;
自动注册:执行器自动进行执行器注册,调度中心通过底层注册表可以动态发现执行器机器地址;
手动录入:人工手动录入执行器的地址信息,多地址逗号分隔,供调度中心使用;
机器地址:"注册方式"为"手动录入"时有效,支持人工维护执行器的地址信息;注册地址格式可参考“http://127.0.0.1:9999/”,为执行器内嵌服务地址;
### 4.2 新建任务
进入任务管理界面,点击“新增任务”按钮,在弹出的“新增任务”界面配置任务属性后保存即可。详情页参考章节 "三、任务详解"。
### 4.3 编辑任务
进入任务管理界面,选中指定任务。点击该任务右侧“编辑”按钮,在弹出的“编辑任务”界面更新任务属性后保存即可,可以修改设置的任务属性信息:
### 4.4 编辑GLUE代码
该操作仅针对GLUE任务。
选中指定任务,点击该任务右侧“GLUE”按钮,将会前往GLUE任务的Web IDE界面,在该界面支持对任务代码进行开发。可参考章节 "3.3 GLUE模式(Java)"。
### 4.5 启动/停止任务
可对任务进行“启动”和“停止”操作。
需要注意的是,此处的启动/停止仅针对任务的后续调度触发行为,不会影响到已经触发的调度任务,如需终止已经触发的调度任务,可查看“4.9 终止运行中的任务”

### 4.6 手动触发一次调度
点击“执行”按钮,可手动触发一次任务调度,不影响原有调度规则。

### 4.7 查看调度日志
点击“日志”按钮,可以查看任务历史调度日志。在历史调度日志界面可查看每次任务调度的调度结果、执行结果等,点击“执行日志”按钮可查看执行器完整日志。


调度时间:"调度中心"触发本次调度并向"执行器"发送任务执行信号的时间;
调度结果:"调度中心"触发本次调度的结果,200表示成功,500或其他表示失败;
调度备注:"调度中心"触发本次调度的日志信息;
执行器地址:本次任务执行的机器地址
运行模式:触发调度时任务的运行模式,运行模式可参考章节 "三、任务详解";
任务参数:本地任务执行的入参
执行时间:"执行器"中本次任务执行结束后回调的时间;
执行结果:"执行器"中本次任务执行的结果,200表示成功,500或其他表示失败;
执行备注:"执行器"中本次任务执行的日志信息;
操作:
"执行日志"按钮:点击可查看本地任务执行的详细日志信息;详见“4.8 查看执行日志”;
"终止任务"按钮:点击可终止本地调度对应执行器上本任务的执行线程,包括未执行的阻塞任务一并被终止;
### 4.8 查看执行日志
点击执行日志右侧的 “执行日志” 按钮,可跳转至执行日志界面,可以查看业务代码中打印的完整日志,如下图;

### 4.9 终止运行中的任务
仅针对执行中的任务。
在任务日志界面,点击右侧的“终止任务”按钮,将会向本次任务对应的执行器发送任务终止请求,将会终止掉本次任务,同时会清空掉整个任务执行队列。

任务终止时通过 "interrupt" 执行线程的方式实现, 将会触发 "InterruptedException" 异常。因此如果JobHandler内部catch到了该异常并消化掉的话, 任务终止功能将不可用。
因此, 如果遇到上述任务终止不可用的情况, 需要在JobHandler中应该针对 "InterruptedException" 异常进行特殊处理 (向上抛出) , 正确逻辑如下:
```
try{
// do something
} catch (Exception e) {
if (e instanceof InterruptedException) {
throw e;
}
logger.warn("{}", e);
}
```
而且,在JobHandler中开启子线程时,子线程也不可catch处理"InterruptedException",应该主动向上抛出。
任务终止时会执行对应JobHandler的"destroy()"方法,可以借助该方法处理一些资源回收的逻辑。
### 4.10 删除执行日志
在任务日志界面,选中执行器和任务之后,点击右侧的"删除"按钮将会出现"日志清理"弹框,弹框中支持选择不同类型的日志清理策略,选中后点击"确定"按钮即可进行日志清理操作;


### 4.11 删除任务
点击删除按钮,可以删除对应任务。

### 4.12 用户管理
进入 "用户管理" 界面,可查看和管理用户信息;
目前用户分为两种角色:
- 管理员:拥有全量权限,支持在线管理用户信息,为用户分配权限,权限分配粒度为执行器;
- 普通用户:仅拥有被分配权限的执行器,及相关任务的操作权限;


## 五、总体设计
### 5.1 源码目录介绍
- /doc :文档资料
- /db :“调度数据库”建表脚本
- /xxl-job-admin :调度中心,项目源码
- /xxl-job-core :公共Jar依赖
- /xxl-job-executor-samples :执行器,Sample示例项目(大家可以在该项目上进行开发,也可以将现有项目改造生成执行器项目)
### 5.2 “调度数据库”配置
XXL-JOB调度模块基于自研调度组件并支持集群部署,调度数据库表说明如下:
- xxl_job_lock:任务调度锁表;
- xxl_job_group:执行器信息表,维护任务执行器信息;
- xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
- xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
- xxl_job_log_report:调度日志报表:用户存储XXL-JOB任务调度日志的报表,调度中心报表功能页面会用到;
- xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
- xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
- xxl_job_user:系统用户表;
### 5.3 架构设计
#### 5.3.1 设计思想
将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。
将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中的业务逻辑。
因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;
#### 5.3.2 系统组成
- **调度模块(调度中心)**:
负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
- **执行模块(执行器)**:
负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;
接收“调度中心”的执行请求、终止请求和日志请求等。
#### 5.3.3 架构图

### 5.4 调度模块剖析
#### 5.4.1 quartz的不足
Quartz作为开源作业调度中的佼佼者,是作业调度的首选。但是集群环境中Quartz采用API的方式对任务进行管理,从而可以避免上述问题,但是同样存在以下问题:
- 问题一:调用API的方式操作任务,不人性化;
- 问题二:需要持久化业务QuartzJobBean到底层数据表中,系统侵入性相当严重。
- 问题三:调度逻辑和QuartzJobBean耦合在同一个项目中,这将导致一个问题,在调度任务数量逐渐增多,同时调度任务逻辑逐渐加重的情况下,此时调度系统的性能将大大受限于业务;
- 问题四:quartz底层以“抢占式”获取DB锁并由抢占成功节点负责运行任务,会导致节点负载悬殊非常大;而XXL-JOB通过执行器实现“协同分配式”运行任务,充分发挥集群优势,负载各节点均衡。
XXL-JOB弥补了quartz的上述不足之处。
#### 5.4.2 自研调度模块
XXL-JOB最终选择自研调度组件(早期调度组件基于Quartz);一方面是为了精简系统降低冗余依赖,另一方面是为了提供系统的可控度与稳定性;
XXL-JOB中“调度模块”和“任务模块”完全解耦,调度模块进行任务调度时,将会解析不同的任务参数发起远程调用,调用各自的远程执行器服务。这种调用模型类似RPC调用,调度中心提供调用代理的功能,而执行器提供远程服务的功能。
#### 5.4.3 调度中心HA(集群)
基于数据库的集群方案,数据库选用Mysql;集群分布式并发环境中进行定时任务调度时,会在各个节点上报任务,存到数据库中,执行时会从数据库中取出触发器来执行,如果触发器的名称和执行时间相同,则只有一个节点去执行此任务。
#### 5.4.4 调度线程池
调度采用线程池方式实现,避免单线程因阻塞而引起任务调度延迟。
#### 5.4.5 并行调度
XXL-JOB调度模块默认采用并行机制,在多线程调度的情况下,调度模块被阻塞的几率很低,大大提高了调度系统的承载量。
XXL-JOB的不同任务之间并行调度、并行执行。
XXL-JOB的单个任务,针对多个执行器是并行运行的,针对单个执行器是串行执行的。同时支持任务终止。
#### 5.4.6 过期处理策略
任务调度错过触发时间时的处理策略:
- 可能原因:服务重启;调度线程被阻塞,线程被耗尽;上次调度持续阻塞,下次调度被错过;
- 处理策略:
- 过期超5s:本次忽略,当前时间开始计算下次触发时间
- 过期5s内:立即触发一次,当前时间开始计算下次触发时间
#### 5.4.7 日志回调服务
调度模块的“调度中心”作为Web服务部署时,一方面承担调度中心功能,另一方面也为执行器提供API服务。
调度中心提供的"日志回调服务API服务"代码位置如下:
```
xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback
```
“执行器”在接收到任务执行请求后,执行任务,在执行结束之后会将执行结果回调通知“调度中心”:
#### 5.4.8 任务HA(Failover)
执行器如若集群部署,调度中心将会感知到在线的所有执行器,如“127.0.0.1:9997, 127.0.0.1:9998, 127.0.0.1:9999”。
当任务"路由策略"选择"故障转移(FAILOVER)"时,当调度中心每次发起调度请求时,会按照顺序对执行器发出心跳检测请求,第一个检测为存活状态的执行器将会被选定并发送调度请求。
调度成功后,可在日志监控界面查看“调度备注”,如下;

“调度备注”可以看出本地调度运行轨迹,执行器的"注册方式"、"地址列表"和任务的"路由策略"。"故障转移(FAILOVER)"路由策略下,调度中心首先对第一个地址进行心跳检测,心跳失败因此自动跳过,第二个依然心跳检测失败……
直至心跳检测第三个地址“127.0.0.1:9999”成功,选定为“目标执行器”;然后对“目标执行器”发送调度请求,调度流程结束,等待执行器回调执行结果。
#### 5.4.9 调度日志
调度中心每次进行任务调度,都会记录一条任务日志,任务日志主要包括以下三部分内容:
- 任务信息:包括“执行器地址”、“JobHandler”和“执行参数”等属性,点击任务ID按钮可查看,根据这些参数,可以精确的定位任务执行的具体机器和任务代码;
- 调度信息:包括“调度时间”、“调度结果”和“调度日志”等,根据这些参数,可以了解“调度中心”发起调度请求时的具体情况。
- 执行信息:包括“执行时间”、“执行结果”和“执行日志”等,根据这些参数,可以了解在“执行器”端任务执行的具体情况;
调度日志,针对单次调度,属性说明如下:
- 执行器地址:任务执行的机器地址;
- JobHandler:Bean模式表示任务执行的JobHandler名称;
- 任务参数:任务执行的入参;
- 调度时间:调度中心,发起调度的时间;
- 调度结果:调度中心,发起调度的结果,SUCCESS或FAIL;
- 调度备注:调度中心,发起调度的备注信息,如地址心跳检测日志等;
- 执行时间:执行器,任务执行结束后回调的时间;
- 执行结果:执行器,任务执行的结果,SUCCESS或FAIL;
- 执行备注:执行器,任务执行的备注信息,如异常日志等;
- 执行日志:任务执行过程中,业务代码中打印的完整执行日志,见“4.8 查看执行日志”;
#### 5.4.10 任务依赖
原理:XXL-JOB中每个任务都对应有一个任务ID,同时,每个任务支持设置属性“子任务ID”,因此,通过“任务ID”可以匹配任务依赖关系。
当父任务执行结束并且执行成功时,将会根据“子任务ID”匹配子任务依赖,如果匹配到子任务,将会主动触发一次子任务的执行。
在任务日志界面,点击任务的“执行备注”的“查看”按钮,可以看到匹配子任务以及触发子任务执行的日志信息,如无信息则表示未触发子任务执行,可参考下图。


#### 5.4.11 全异步化 & 轻量级
- 全异步化设计:XXL-JOB系统中业务逻辑在远程执行器执行,触发流程全异步化设计。相比直接在调度中心内部执行业务逻辑,极大的降低了调度线程占用时间;
- 异步调度:调度中心每次任务触发时仅发送一次调度请求,该调度请求首先推送“异步调度队列”,然后异步推送给远程执行器
- 异步执行:执行器会将请求存入“异步执行队列”并且立即响应调度中心,异步运行。
- 轻量级设计:XXL-JOB调度中心中每个JOB逻辑非常 “轻”,在全异步化的基础上,单个JOB一次运行平均耗时基本在 "10ms" 之内(基本为一次请求的网络开销);因此,可以保证使用有限的线程支撑大量的JOB并发运行;
得益于上述两点优化,理论上默认配置下的调度中心,单机能够支撑 5000 任务并发运行稳定运行;
实际场景中,由于调度中心与执行器网络ping延迟不同、DB读写耗时不同、任务调度密集程度不同,会导致任务量上限上下波动。
如若需要支撑更多的任务量,可以通过 "调大调度线程数" 、"降低调度中心与执行器ping延迟" 和 "提升机器配置" 几种方式优化。
#### 5.4.12 均衡调度
调度中心在集群部署时会自动进行任务平均分配,触发组件每次获取与线程池数量(调度中心支持自定义调度线程池大小)相关数量的任务,避免大量任务集中在单个调度中心集群节点;
### 5.5 任务 "运行模式" 剖析
#### 5.5.1 "Bean模式" 任务
开发步骤:可参考 "章节三" ;
原理:每个Bean模式任务都是一个Spring的Bean类实例,它被维护在“执行器”项目的Spring容器中。任务类需要加“@JobHandler(value="名称")”注解,因为“执行器”会根据该注解识别Spring容器中的任务。任务类需要继承统一接口“IJobHandler”,任务逻辑在execute方法中开发,因为“执行器”在接收到调度中心的调度请求时,将会调用“IJobHandler”的execute方法,执行任务逻辑。
#### 5.5.2 "GLUE模式(Java)" 任务
开发步骤:可参考 "章节三" ;
原理:每个 "GLUE模式(Java)" 任务的代码,实际上是“一个继承自“IJobHandler”的实现类的类代码”,“执行器”接收到“调度中心”的调度请求时,会通过Groovy类加载器加载此代码,实例化成Java对象,同时注入此代码中声明的Spring服务(请确保Glue代码中的服务和类引用在“执行器”项目中存在),然后调用该对象的execute方法,执行任务逻辑。
#### 5.5.3 GLUE模式(Shell) + GLUE模式(Python) + GLUE模式(PHP) + GLUE模式(NodeJS) + GLUE模式(Powershell)
开发步骤:可参考 "章节三" ;
原理:脚本任务的源码托管在调度中心,脚本逻辑在执行器运行。当触发脚本任务时,执行器会加载脚本源码在执行器机器上生成一份脚本文件,然后通过Java代码调用该脚本;并且实时将脚本输出日志写到任务日志文件中,从而在调度中心可以实时监控脚本运行情况;
目前支持的脚本类型如下:
- shell脚本:任务运行模式选择为 "GLUE模式(Shell)"时支持 "Shell" 脚本任务;
- python脚本:任务运行模式选择为 "GLUE模式(Python)"时支持 "Python" 脚本任务;
- php脚本:任务运行模式选择为 "GLUE模式(PHP)"时支持 "PHP" 脚本任务;
- nodejs脚本:任务运行模式选择为 "GLUE模式(NodeJS)"时支持 "NodeJS" 脚本任务;
- powershell:任务运行模式选择为 "GLUE模式(PowerShell)"时支持 "PowerShell" 脚本任务;
脚本任务通过 Exit Code 判断任务执行结果,状态码可参考章节 "5.15 任务执行结果说明";
#### 5.5.4 执行器
执行器实际上是一个内嵌的Server,默认端口9999(配置项:xxl.job.executor.port)。
在项目启动时,执行器会通过“@XxlJob”识别Spring容器中“Bean模式任务”,以注解的value属性为key管理起来。
“执行器”接收到“调度中心”的调度请求时,如果任务类型为“Bean模式”,将会匹配Spring容器中的“Bean模式任务”,然后调用其execute方法,执行任务逻辑。如果任务类型为“GLUE模式”,将会加载GLue代码,实例化Java对象,注入依赖的Spring服务(注意:Glue代码中注入的Spring服务,必须存在与该“执行器”项目的Spring容器中),然后调用execute方法,执行任务逻辑。
#### 5.5.5 任务日志
XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过 "XxlJobHelper.log" 打印执行日志,“调度中心”查看执行日志时将会加载对应的日志文件。
(历史版本通过重写LOG4J的Appender实现,存在依赖限制,该方式在新版本已经被抛弃)
日志文件存放的位置可在“执行器”配置文件进行自定义,默认目录格式为:/data/applogs/xxl-job/jobhandler/“格式化日期”/“数据库调度日志记录的主键ID.log”。
在JobHandler中开启子线程时,子线程将会把日志打印在父线程即JobHandler的执行日志中,方便日志追踪。
### 5.6 通讯模块剖析
#### 5.6.1 一次完整的任务调度通讯流程
- 1、“调度中心”向“执行器”发送http调度请求: “执行器”中接收请求的服务,实际上是一台内嵌Server,默认端口9999;
- 2、“执行器”执行任务逻辑;
- 3、“执行器”http回调“调度中心”调度结果: “调度中心”中接收回调的服务,是针对执行器开放一套API服务;
#### 5.6.2 通讯数据加密
调度中心向执行器发送的调度请求时使用RequestModel和ResponseModel两个对象封装调度请求参数和响应数据, 在进行通讯之前底层会将上述两个对象对象序列化,并进行数据协议以及时间戳检验,从而达到数据加密的功能;
### 5.7 任务注册, 任务自动发现
自v1.5版本之后, 任务取消了"任务执行机器"属性, 改为通过任务注册和自动发现的方式, 动态获取远程执行器地址并执行。
AppName: 每个执行器机器集群的唯一标示, 任务注册以 "执行器" 为最小粒度进行注册; 每个任务通过其绑定的执行器可感知对应的执行器机器列表;
注册表: 见"xxl_job_registry"表, "执行器" 在进行任务注册时将会周期性维护一条注册记录,即机器地址和AppName的绑定关系; "调度中心" 从而可以动态感知每个AppName在线的机器列表;
执行器注册: 任务注册Beat周期默认30s; 执行器以一倍Beat进行执行器注册, 调度中心以一倍Beat进行动态任务发现; 注册信息的失效时间为三倍Beat;
执行器注册摘除:执行器销毁时,将会主动上报调度中心并摘除对应的执行器机器信息,提高心跳注册的实时性;
为保证系统"轻量级"并且降低学习部署成本,没有采用Zookeeper作为注册中心,采用DB方式进行任务注册发现;
### 5.8 任务执行结果
自v1.6.2之后,任务执行结果通过 "IJobHandler" 的返回值 "ReturnT" 进行判断;
当返回值符合 "ReturnT#code == 200" 时表示任务执行成功,否则表示任务执行失败,而且可以通过 "ReturnT#msg" 回调错误信息给调度中心;
从而,在任务逻辑中可以方便的控制任务执行结果;
### 5.9 分片广播 & 动态分片
执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;
"分片广播" 以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。
"分片广播" 和普通任务开发流程一致,不同之处在于可以获取分片参数,获取分片参数进行分片业务处理。
- Java语言任务获取分片参数方式:BEAN、GLUE模式(Java)
```
// 可参考Sample示例执行器中的示例任务"ShardingJobHandler"了解试用
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
```
- 脚本语言任务获取分片参数方式:GLUE模式(Shell)、GLUE模式(Python)、GLUE模式(Nodejs)
```
// 脚本任务入参固定为三个,依次为:任务传参、分片序号、分片总数。以Shell模式任务为例,获取分片参数代码如下
echo "分片序号 index = $2"
echo "分片总数 total = $3"
```
分片参数属性说明:
index:当前分片序号(从0开始),执行器集群列表中当前执行器的序号;
total:总分片数,执行器集群的总机器数量;
该特性适用场景如:
- 1、分片任务场景:10个执行器的集群来处理10w条数据,每台机器只需要处理1w条数据,耗时降低10倍;
- 2、广播任务场景:广播执行器机器运行shell脚本、广播集群节点进行缓存更新等
### 5.10 访问令牌(AccessToken)
为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯;
调度中心和执行器,可通过配置项 "xxl.job.accessToken" 进行AccessToken的设置。
调度中心和执行器,如果需要正常通讯,只有两种设置;
- 设置一:调度中心和执行器,均不设置AccessToken;关闭安全性校验;
- 设置二:调度中心和执行器,设置了相同的AccessToken;
### 5.11 故障转移 & 失败重试
一次完整任务流程包括"调度(调度中心) + 执行(执行器)"两个阶段。
- "故障转移"发生在调度阶段,在执行器集群部署时,如果某一台执行器发生故障,该策略支持自动进行Failover切换到一台正常的执行器机器并且完成调度请求流程。
- "失败重试"发生在"调度 + 执行"两个阶段,支持通过自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;
### 5.12 执行器灰度上线
调度中心与业务解耦,只需部署一次后常年不需要维护。但是,执行器中托管运行着业务作业,作业上线和变更需要重启执行器,尤其是Bean模式任务。
执行器重启可能会中断运行中的任务。但是,XXL-JOB得益于自建执行器与自建注册中心,可以通过灰度上线的方式,避免因重启导致的任务中断的问题。
步骤如下:
- 1、执行器改为手动注册,下线一半机器列表(A组),线上运行另一半机器列表(B组);
- 2、等待A组机器任务运行结束并编译上线;执行器注册地址替换为A组;
- 3、等待B组机器任务运行结束并编译上线;执行器注册地址替换为A组+B组;
操作结束;
### 5.13 任务执行结果说明
系统根据以下标准判断任务执行结果,可参考之。
-- | Bean/
gitextract_80xsumby/
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE
│ ├── PULL_REQUEST_TEMPLATE
│ └── workflows/
│ └── maven.yml
├── .gitignore
├── LICENSE
├── NOTICE
├── README.md
├── doc/
│ ├── XXL-JOB-English-Documentation.md
│ ├── XXL-JOB官方文档.md
│ ├── XXL-JOB架构图.key
│ └── db/
│ └── tables_xxl_job.sql
├── docker/
│ └── docker-compose.yml
├── pom.xml
├── xxl-job-admin/
│ ├── Dockerfile
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── xxl/
│ │ │ └── job/
│ │ │ └── admin/
│ │ │ ├── XxlJobAdminApplication.java
│ │ │ ├── constant/
│ │ │ │ ├── Consts.java
│ │ │ │ └── TriggerStatus.java
│ │ │ ├── controller/
│ │ │ │ ├── base/
│ │ │ │ │ ├── IndexController.java
│ │ │ │ │ └── LoginController.java
│ │ │ │ └── biz/
│ │ │ │ ├── JobCodeController.java
│ │ │ │ ├── JobGroupController.java
│ │ │ │ ├── JobInfoController.java
│ │ │ │ ├── JobLogController.java
│ │ │ │ └── JobUserController.java
│ │ │ ├── mapper/
│ │ │ │ ├── XxlJobGroupMapper.java
│ │ │ │ ├── XxlJobInfoMapper.java
│ │ │ │ ├── XxlJobLockMapper.java
│ │ │ │ ├── XxlJobLogGlueMapper.java
│ │ │ │ ├── XxlJobLogMapper.java
│ │ │ │ ├── XxlJobLogReportMapper.java
│ │ │ │ ├── XxlJobRegistryMapper.java
│ │ │ │ └── XxlJobUserMapper.java
│ │ │ ├── model/
│ │ │ │ ├── XxlJobGroup.java
│ │ │ │ ├── XxlJobInfo.java
│ │ │ │ ├── XxlJobLog.java
│ │ │ │ ├── XxlJobLogGlue.java
│ │ │ │ ├── XxlJobLogReport.java
│ │ │ │ ├── XxlJobRegistry.java
│ │ │ │ ├── XxlJobUser.java
│ │ │ │ └── dto/
│ │ │ │ └── XxlBootResourceDTO.java
│ │ │ ├── scheduler/
│ │ │ │ ├── alarm/
│ │ │ │ │ ├── JobAlarm.java
│ │ │ │ │ ├── JobAlarmer.java
│ │ │ │ │ └── impl/
│ │ │ │ │ └── EmailJobAlarm.java
│ │ │ │ ├── complete/
│ │ │ │ │ └── JobCompleter.java
│ │ │ │ ├── config/
│ │ │ │ │ └── XxlJobAdminBootstrap.java
│ │ │ │ ├── cron/
│ │ │ │ │ └── CronExpression.java
│ │ │ │ ├── exception/
│ │ │ │ │ └── XxlJobException.java
│ │ │ │ ├── misfire/
│ │ │ │ │ ├── MisfireHandler.java
│ │ │ │ │ ├── MisfireStrategyEnum.java
│ │ │ │ │ └── strategy/
│ │ │ │ │ ├── MisfireDoNothing.java
│ │ │ │ │ └── MisfireFireOnceNow.java
│ │ │ │ ├── openapi/
│ │ │ │ │ └── OpenApiController.java
│ │ │ │ ├── route/
│ │ │ │ │ ├── ExecutorRouteStrategyEnum.java
│ │ │ │ │ ├── ExecutorRouter.java
│ │ │ │ │ └── strategy/
│ │ │ │ │ ├── ExecutorRouteBusyover.java
│ │ │ │ │ ├── ExecutorRouteConsistentHash.java
│ │ │ │ │ ├── ExecutorRouteFailover.java
│ │ │ │ │ ├── ExecutorRouteFirst.java
│ │ │ │ │ ├── ExecutorRouteLFU.java
│ │ │ │ │ ├── ExecutorRouteLRU.java
│ │ │ │ │ ├── ExecutorRouteLast.java
│ │ │ │ │ ├── ExecutorRouteRandom.java
│ │ │ │ │ └── ExecutorRouteRound.java
│ │ │ │ ├── thread/
│ │ │ │ │ ├── JobCompleteHelper.java
│ │ │ │ │ ├── JobFailAlarmMonitorHelper.java
│ │ │ │ │ ├── JobLogReportHelper.java
│ │ │ │ │ ├── JobRegistryHelper.java
│ │ │ │ │ ├── JobScheduleHelper.java
│ │ │ │ │ └── JobTriggerPoolHelper.java
│ │ │ │ ├── trigger/
│ │ │ │ │ ├── JobTrigger.java
│ │ │ │ │ └── TriggerTypeEnum.java
│ │ │ │ └── type/
│ │ │ │ ├── ScheduleType.java
│ │ │ │ ├── ScheduleTypeEnum.java
│ │ │ │ └── strategy/
│ │ │ │ ├── CronScheduleType.java
│ │ │ │ ├── FixRateScheduleType.java
│ │ │ │ └── NoneScheduleType.java
│ │ │ ├── service/
│ │ │ │ ├── XxlJobService.java
│ │ │ │ └── impl/
│ │ │ │ ├── AdminBizImpl.java
│ │ │ │ └── XxlJobServiceImpl.java
│ │ │ ├── util/
│ │ │ │ ├── I18nUtil.java
│ │ │ │ ├── JobGroupPermissionUtil.java
│ │ │ │ └── old/
│ │ │ │ ├── CommonDataInterceptor.java
│ │ │ │ ├── CookieUtil.java
│ │ │ │ ├── FtlUtil.java
│ │ │ │ ├── JacksonUtil.java
│ │ │ │ ├── LocalCacheUtil.java
│ │ │ │ ├── RemoteHttpJobBean.java
│ │ │ │ ├── XxlJobDynamicScheduler.java
│ │ │ │ └── XxlJobThreadPool.java
│ │ │ └── web/
│ │ │ ├── error/
│ │ │ │ ├── WebErrorPageRegistrar.java
│ │ │ │ └── WebHandlerExceptionResolver.java
│ │ │ └── xxlsso/
│ │ │ ├── SimpleLoginStore.java
│ │ │ └── XxlSsoConfig.java
│ │ └── resources/
│ │ ├── application.properties
│ │ ├── i18n/
│ │ │ ├── message_en.properties
│ │ │ ├── message_zh_CN.properties
│ │ │ └── message_zh_TC.properties
│ │ ├── logback.xml
│ │ ├── mapper/
│ │ │ ├── XxlJobGroupMapper.xml
│ │ │ ├── XxlJobInfoMapper.xml
│ │ │ ├── XxlJobLockMapper.xml
│ │ │ ├── XxlJobLogGlueMapper.xml
│ │ │ ├── XxlJobLogMapper.xml
│ │ │ ├── XxlJobLogReportMapper.xml
│ │ │ ├── XxlJobRegistryMapper.xml
│ │ │ └── XxlJobUserMapper.xml
│ │ ├── static/
│ │ │ ├── adminlte/
│ │ │ │ ├── bower_components/
│ │ │ │ │ ├── bootstrap-daterangepicker/
│ │ │ │ │ │ ├── daterangepicker.css
│ │ │ │ │ │ └── daterangepicker.js
│ │ │ │ │ ├── ckeditor/
│ │ │ │ │ │ ├── ckeditor.js
│ │ │ │ │ │ ├── config.js
│ │ │ │ │ │ ├── contents.css
│ │ │ │ │ │ ├── lang/
│ │ │ │ │ │ │ └── zh-cn.js
│ │ │ │ │ │ ├── plugins/
│ │ │ │ │ │ │ ├── image/
│ │ │ │ │ │ │ │ └── dialogs/
│ │ │ │ │ │ │ │ └── image.js
│ │ │ │ │ │ │ ├── link/
│ │ │ │ │ │ │ │ └── dialogs/
│ │ │ │ │ │ │ │ ├── anchor.js
│ │ │ │ │ │ │ │ └── link.js
│ │ │ │ │ │ │ ├── scayt/
│ │ │ │ │ │ │ │ ├── dialogs/
│ │ │ │ │ │ │ │ │ ├── dialog.css
│ │ │ │ │ │ │ │ │ ├── options.js
│ │ │ │ │ │ │ │ │ └── toolbar.css
│ │ │ │ │ │ │ │ └── skins/
│ │ │ │ │ │ │ │ └── moono-lisa/
│ │ │ │ │ │ │ │ └── scayt.css
│ │ │ │ │ │ │ ├── specialchar/
│ │ │ │ │ │ │ │ └── dialogs/
│ │ │ │ │ │ │ │ ├── lang/
│ │ │ │ │ │ │ │ │ └── zh-cn.js
│ │ │ │ │ │ │ │ └── specialchar.js
│ │ │ │ │ │ │ ├── table/
│ │ │ │ │ │ │ │ └── dialogs/
│ │ │ │ │ │ │ │ └── table.js
│ │ │ │ │ │ │ ├── tableselection/
│ │ │ │ │ │ │ │ └── styles/
│ │ │ │ │ │ │ │ └── tableselection.css
│ │ │ │ │ │ │ └── wsc/
│ │ │ │ │ │ │ └── skins/
│ │ │ │ │ │ │ └── moono-lisa/
│ │ │ │ │ │ │ └── wsc.css
│ │ │ │ │ │ ├── skins/
│ │ │ │ │ │ │ └── moono-lisa/
│ │ │ │ │ │ │ ├── dialog.css
│ │ │ │ │ │ │ ├── dialog_ie.css
│ │ │ │ │ │ │ ├── dialog_ie8.css
│ │ │ │ │ │ │ ├── dialog_iequirks.css
│ │ │ │ │ │ │ ├── editor.css
│ │ │ │ │ │ │ ├── editor_gecko.css
│ │ │ │ │ │ │ ├── editor_ie.css
│ │ │ │ │ │ │ ├── editor_ie8.css
│ │ │ │ │ │ │ ├── editor_iequirks.css
│ │ │ │ │ │ │ └── readme.md
│ │ │ │ │ │ └── styles.js
│ │ │ │ │ ├── fastclick/
│ │ │ │ │ │ └── fastclick.js
│ │ │ │ │ └── font-awesome/
│ │ │ │ │ └── fonts/
│ │ │ │ │ └── FontAwesome.otf
│ │ │ │ └── plugins/
│ │ │ │ └── iCheck/
│ │ │ │ └── square/
│ │ │ │ └── blue.css
│ │ │ ├── biz/
│ │ │ │ └── common/
│ │ │ │ ├── admin.setting.js
│ │ │ │ ├── admin.tab.css
│ │ │ │ ├── admin.tab.js
│ │ │ │ ├── admin.table.js
│ │ │ │ └── admin.util.js
│ │ │ └── plugins/
│ │ │ ├── codemirror/
│ │ │ │ ├── addon/
│ │ │ │ │ └── hint/
│ │ │ │ │ ├── anyword-hint.js
│ │ │ │ │ ├── show-hint.css
│ │ │ │ │ └── show-hint.js
│ │ │ │ ├── lib/
│ │ │ │ │ ├── codemirror.css
│ │ │ │ │ └── codemirror.js
│ │ │ │ └── mode/
│ │ │ │ ├── clike/
│ │ │ │ │ └── clike.js
│ │ │ │ ├── javascript/
│ │ │ │ │ └── javascript.js
│ │ │ │ ├── php/
│ │ │ │ │ └── php.js
│ │ │ │ ├── powershell/
│ │ │ │ │ └── powershell.js
│ │ │ │ ├── python/
│ │ │ │ │ └── python.js
│ │ │ │ └── shell/
│ │ │ │ └── shell.js
│ │ │ ├── cronGen/
│ │ │ │ ├── cronGen.js
│ │ │ │ └── cronGen_en.js
│ │ │ ├── fullscreen/
│ │ │ │ └── jquery.fullscreen.js
│ │ │ ├── jquery-treegrid/
│ │ │ │ └── jquery.treegrid.css
│ │ │ ├── layer/
│ │ │ │ ├── layer.js
│ │ │ │ └── theme/
│ │ │ │ └── default/
│ │ │ │ └── layer.css
│ │ │ ├── nprogress/
│ │ │ │ ├── nprogress.css
│ │ │ │ └── nprogress.js
│ │ │ └── zTree/
│ │ │ ├── css/
│ │ │ │ └── metroStyle/
│ │ │ │ └── metroStyle.css
│ │ │ └── js/
│ │ │ ├── jquery.ztree.core.js
│ │ │ └── jquery.ztree.excheck.js
│ │ └── templates/
│ │ ├── base/
│ │ │ ├── dashboard.ftl
│ │ │ ├── help.ftl
│ │ │ ├── index.ftl
│ │ │ └── login.ftl
│ │ ├── biz/
│ │ │ ├── group.list.ftl
│ │ │ ├── job.code.ftl
│ │ │ ├── job.list.ftl
│ │ │ ├── log.detail.ftl
│ │ │ ├── log.list.ftl
│ │ │ └── user.list.ftl
│ │ └── common/
│ │ ├── common.errorpage.ftl
│ │ └── common.macro.ftl
│ └── test/
│ └── java/
│ └── com/
│ └── xxl/
│ └── job/
│ ├── admin/
│ │ ├── controller/
│ │ │ ├── AbstractSpringMvcTest.java
│ │ │ └── JobInfoControllerTest.java
│ │ ├── core/
│ │ │ └── util/
│ │ │ ├── CronExpressionTest.java
│ │ │ └── JacksonUtilTest.java
│ │ ├── mapper/
│ │ │ ├── XxlJobGroupMapperTest.java
│ │ │ ├── XxlJobInfoMapperTest.java
│ │ │ ├── XxlJobLogGlueMapperTest.java
│ │ │ ├── XxlJobLogMapperTest.java
│ │ │ ├── XxlJobLogReportMapperTest.java
│ │ │ └── XxlJobRegistryMapperTest.java
│ │ ├── schedule/
│ │ │ └── JobScheduleTest.java
│ │ └── util/
│ │ └── I18nUtilTest.java
│ └── openapi/
│ ├── AdminBizTest.java
│ └── ExecutorBizTest.java
├── xxl-job-core/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── xxl/
│ └── job/
│ └── core/
│ ├── constant/
│ │ ├── Const.java
│ │ ├── ExecutorBlockStrategyEnum.java
│ │ └── RegistType.java
│ ├── context/
│ │ ├── XxlJobContext.java
│ │ └── XxlJobHelper.java
│ ├── executor/
│ │ ├── XxlJobExecutor.java
│ │ └── impl/
│ │ ├── XxlJobSimpleExecutor.java
│ │ └── XxlJobSpringExecutor.java
│ ├── glue/
│ │ ├── GlueFactory.java
│ │ ├── GlueTypeEnum.java
│ │ └── impl/
│ │ └── SpringGlueFactory.java
│ ├── handler/
│ │ ├── IJobHandler.java
│ │ ├── annotation/
│ │ │ ├── JobHandler.java
│ │ │ └── XxlJob.java
│ │ └── impl/
│ │ ├── GlueJobHandler.java
│ │ ├── MethodJobHandler.java
│ │ └── ScriptJobHandler.java
│ ├── log/
│ │ └── XxlJobFileAppender.java
│ ├── openapi/
│ │ ├── AdminBiz.java
│ │ ├── ExecutorBiz.java
│ │ ├── impl/
│ │ │ └── ExecutorBizImpl.java
│ │ └── model/
│ │ ├── CallbackRequest.java
│ │ ├── IdleBeatRequest.java
│ │ ├── KillRequest.java
│ │ ├── LogRequest.java
│ │ ├── LogResult.java
│ │ ├── RegistryRequest.java
│ │ └── TriggerRequest.java
│ ├── server/
│ │ └── EmbedServer.java
│ ├── thread/
│ │ ├── ExecutorRegistryThread.java
│ │ ├── JobLogFileCleanThread.java
│ │ ├── JobThread.java
│ │ └── TriggerCallbackThread.java
│ └── util/
│ ├── ScriptUtil.java
│ └── deprecated/
│ ├── AdminBizClient.java
│ ├── DateUtil.java
│ ├── ExecutorBizClient.java
│ ├── FileUtil.java
│ ├── GsonTool.java
│ ├── IpUtil.java
│ ├── JdkSerializeTool.java
│ ├── NetUtil.java
│ ├── ReturnT.java
│ ├── ShardingUtil.java
│ ├── ThrowableUtil.java
│ └── XxlJobRemotingUtil.java
└── xxl-job-executor-samples/
├── pom.xml
├── xxl-job-executor-sample-frameless/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── xxl/
│ │ │ └── job/
│ │ │ └── executor/
│ │ │ └── sample/
│ │ │ └── frameless/
│ │ │ ├── XxlJobFramelessApplication.java
│ │ │ ├── config/
│ │ │ │ └── FrameLessXxlJobConfig.java
│ │ │ └── jobhandler/
│ │ │ └── SampleXxlJob.java
│ │ └── resources/
│ │ ├── log4j.xml
│ │ └── xxl-job-executor.properties
│ └── test/
│ └── java/
│ └── com/
│ └── xxl/
│ └── job/
│ └── executor/
│ └── sample/
│ └── frameless/
│ └── test/
│ └── FramelessApplicationTest.java
├── xxl-job-executor-sample-springboot/
│ ├── Dockerfile
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── xxl/
│ │ │ └── job/
│ │ │ └── executor/
│ │ │ ├── XxlJobExecutorApplication.java
│ │ │ ├── config/
│ │ │ │ └── XxlJobConfig.java
│ │ │ ├── controller/
│ │ │ │ └── IndexController.java
│ │ │ └── jobhandler/
│ │ │ └── SampleXxlJob.java
│ │ └── resources/
│ │ ├── application.properties
│ │ └── logback.xml
│ └── test/
│ └── java/
│ └── com/
│ └── xxl/
│ └── job/
│ └── executor/
│ └── test/
│ └── XxlJobExecutorExampleBootApplicationTests.java
└── xxl-job-executor-sample-springboot-ai/
├── Dockerfile
├── pom.xml
└── src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── xxl/
│ │ └── job/
│ │ └── executor/
│ │ ├── XxlJobAIExecutorApplication.java
│ │ ├── config/
│ │ │ └── XxlJobConfig.java
│ │ ├── controller/
│ │ │ └── IndexController.java
│ │ └── jobhandler/
│ │ └── AIXxlJob.java
│ └── resources/
│ ├── application.properties
│ └── logback.xml
└── test/
└── java/
└── com/
└── xxl/
└── job/
└── executor/
└── test/
├── BaseTests.java
├── dify/
│ └── DifyTest.java
└── ollama/
└── OllamaTest.java
SYMBOL INDEX (1979 symbols across 153 files)
FILE: doc/db/tables_xxl_job.sql
type `xxl_job_group` (line 12) | CREATE TABLE `xxl_job_group`
type `xxl_job_registry` (line 24) | CREATE TABLE `xxl_job_registry`
type `xxl_job_info` (line 38) | CREATE TABLE `xxl_job_info`
type `xxl_job_logglue` (line 68) | CREATE TABLE `xxl_job_logglue`
type `xxl_job_log` (line 83) | CREATE TABLE `xxl_job_log`
type `xxl_job_log_report` (line 108) | CREATE TABLE `xxl_job_log_report`
type `xxl_job_lock` (line 123) | CREATE TABLE `xxl_job_lock`
type `xxl_job_user` (line 132) | CREATE TABLE `xxl_job_user`
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java
class XxlJobAdminApplication (line 9) | @SpringBootApplication
method main (line 12) | public static void main(String[] args) {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/constant/Consts.java
class Consts (line 3) | public class Consts {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/constant/TriggerStatus.java
type TriggerStatus (line 3) | public enum TriggerStatus {
method TriggerStatus (line 11) | TriggerStatus(int value, String desc) {
method getValue (line 16) | public int getValue() {
method setValue (line 20) | public void setValue(int value) {
method getDesc (line 24) | public String getDesc() {
method setDesc (line 28) | public void setDesc(String desc) {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/controller/base/IndexController.java
class IndexController (line 34) | @Controller
method index (line 43) | @RequestMapping("/")
method findResourceList (line 57) | private List<XxlBootResourceDTO> findResourceList(HttpServletRequest r...
method dashboard (line 83) | @RequestMapping("/dashboard")
method chartInfo (line 93) | @RequestMapping("/chartInfo")
method help (line 103) | @RequestMapping("/help")
method errorPage (line 109) | @RequestMapping(value = "/errorpage")
method initBinder (line 120) | @InitBinder
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/controller/base/LoginController.java
class LoginController (line 27) | @Controller
method login (line 34) | @RequestMapping("/login")
method doLogin (line 48) | @RequestMapping(value="/doLogin", method=RequestMethod.POST)
method logout (line 78) | @RequestMapping(value="/logout", method=RequestMethod.POST)
method updatePwd (line 89) | @RequestMapping("/updatePwd")
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobCodeController.java
class JobCodeController (line 31) | @Controller
method index (line 41) | @RequestMapping
method save (line 64) | @RequestMapping("/save")
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobGroupController.java
class JobGroupController (line 31) | @Controller
method index (line 42) | @RequestMapping
method pageList (line 48) | @RequestMapping("/pageList")
method insert (line 68) | @RequestMapping("/insert")
method update (line 115) | @RequestMapping("/update")
method findRegistryByAppName (line 161) | private List<String> findRegistryByAppName(String appnameParam){
method delete (line 181) | @RequestMapping("/delete")
method loadById (line 217) | @RequestMapping("/loadById")
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobInfoController.java
class JobInfoController (line 40) | @Controller
method index (line 50) | @RequestMapping
method pageList (line 81) | @RequestMapping("/pageList")
method add (line 99) | @RequestMapping("/insert")
method update (line 109) | @RequestMapping("/update")
method delete (line 119) | @RequestMapping("/delete")
method pause (line 133) | @RequestMapping("/stop")
method start (line 147) | @RequestMapping("/start")
method triggerJob (line 161) | @RequestMapping("/trigger")
method nextTriggerTime (line 171) | @RequestMapping("/nextTriggerTime")
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobLogController.java
class JobLogController (line 45) | @Controller
method index (line 59) | @RequestMapping
method pageList (line 122) | @RequestMapping("/pageList")
method filter (line 166) | private String filter(String originData){
method logKill (line 192) | @RequestMapping("/logKill")
method clearLog (line 229) | @RequestMapping("/clearLog")
method logDetailPage (line 279) | @RequestMapping("/logDetailPage")
method logDetailCat (line 302) | @RequestMapping("/logDetailCat")
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobUserController.java
class JobUserController (line 32) | @Controller
method index (line 41) | @RequestMapping
method pageList (line 52) | @RequestMapping("/pageList")
method insert (line 79) | @RequestMapping("/insert")
method update (line 115) | @RequestMapping("/update")
method delete (line 144) | @RequestMapping("/delete")
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobGroupMapper.java
type XxlJobGroupMapper (line 12) | @Mapper
method findAll (line 15) | public List<XxlJobGroup> findAll();
method findByAddressType (line 17) | public List<XxlJobGroup> findByAddressType(@Param("addressType") int a...
method save (line 19) | public int save(XxlJobGroup xxlJobGroup);
method update (line 21) | public int update(XxlJobGroup xxlJobGroup);
method remove (line 23) | public int remove(@Param("id") int id);
method load (line 25) | public XxlJobGroup load(@Param("id") int id);
method pageList (line 27) | public List<XxlJobGroup> pageList(@Param("offset") int offset,
method pageListCount (line 32) | public int pageListCount(@Param("offset") int offset,
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobInfoMapper.java
type XxlJobInfoMapper (line 14) | @Mapper
method pageList (line 17) | public List<XxlJobInfo> pageList(@Param("offset") int offset,
method pageListCount (line 24) | public int pageListCount(@Param("offset") int offset,
method save (line 32) | public int save(XxlJobInfo info);
method loadById (line 34) | public XxlJobInfo loadById(@Param("id") int id);
method update (line 36) | public int update(XxlJobInfo xxlJobInfo);
method delete (line 38) | public int delete(@Param("id") long id);
method getJobsByGroup (line 40) | public List<XxlJobInfo> getJobsByGroup(@Param("jobGroup") int jobGroup);
method findAllCount (line 42) | public int findAllCount();
method scheduleJobQuery (line 51) | public List<XxlJobInfo> scheduleJobQuery(@Param("maxNextTime") long ma...
method scheduleUpdate (line 62) | public int scheduleUpdate(XxlJobInfo xxlJobInfo);
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobLockMapper.java
type XxlJobLockMapper (line 10) | @Mapper
method scheduleLock (line 16) | String scheduleLock();
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobLogGlueMapper.java
type XxlJobLogGlueMapper (line 13) | @Mapper
method save (line 16) | public int save(XxlJobLogGlue xxlJobLogGlue);
method findByJobId (line 18) | public List<XxlJobLogGlue> findByJobId(@Param("jobId") int jobId);
method removeOld (line 20) | public int removeOld(@Param("jobId") int jobId, @Param("limit") int li...
method deleteByJobId (line 22) | public int deleteByJobId(@Param("jobId") int jobId);
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobLogMapper.java
type XxlJobLogMapper (line 15) | @Mapper
method pageList (line 19) | public List<XxlJobLog> pageList(@Param("offset") int offset,
method pageListCount (line 26) | public int pageListCount(@Param("offset") int offset,
method load (line 34) | public XxlJobLog load(@Param("id") long id);
method save (line 36) | public long save(XxlJobLog xxlJobLog);
method updateTriggerInfo (line 38) | public int updateTriggerInfo(XxlJobLog xxlJobLog);
method updateHandleInfo (line 40) | public int updateHandleInfo(XxlJobLog xxlJobLog);
method delete (line 42) | public int delete(@Param("jobId") int jobId);
method findLogReport (line 44) | public Map<String, Object> findLogReport(@Param("from") Date from,
method findClearLogIds (line 47) | public List<Long> findClearLogIds(@Param("jobGroup") int jobGroup,
method clearLog (line 52) | public int clearLog(@Param("logIds") List<Long> logIds);
method findFailJobLogIds (line 54) | public List<Long> findFailJobLogIds(@Param("pagesize") int pagesize);
method updateAlarmStatus (line 56) | public int updateAlarmStatus(@Param("logId") long logId,
method findLostJobIds (line 60) | public List<Long> findLostJobIds(@Param("losedTime") Date losedTime);
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobLogReportMapper.java
type XxlJobLogReportMapper (line 14) | @Mapper
method saveOrUpdate (line 21) | public int saveOrUpdate(XxlJobLogReport xxlJobLogReport);
method queryLogReport (line 23) | public List<XxlJobLogReport> queryLogReport(@Param("triggerDayFrom") D...
method queryLogReportTotal (line 26) | public XxlJobLogReport queryLogReportTotal();
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobRegistryMapper.java
type XxlJobRegistryMapper (line 13) | @Mapper
method findDead (line 16) | public List<Integer> findDead(@Param("timeout") int timeout,
method removeDead (line 19) | public int removeDead(@Param("ids") List<Integer> ids);
method findAll (line 21) | public List<XxlJobRegistry> findAll(@Param("timeout") int timeout,
method registrySaveOrUpdate (line 24) | public int registrySaveOrUpdate(@Param("registryGroup") String registr...
method registryDelete (line 39) | public int registryDelete(@Param("registryGroup") String registryGroup,
method removeByRegistryGroupAndKey (line 43) | public int removeByRegistryGroupAndKey(@Param("registryGroup") String ...
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobUserMapper.java
type XxlJobUserMapper (line 12) | @Mapper
method pageList (line 15) | public List<XxlJobUser> pageList(@Param("offset") int offset,
method pageListCount (line 19) | public int pageListCount(@Param("offset") int offset,
method loadByUserName (line 24) | public XxlJobUser loadByUserName(@Param("username") String username);
method loadById (line 26) | public XxlJobUser loadById(@Param("id") int id);
method save (line 28) | public int save(XxlJobUser xxlJobUser);
method update (line 30) | public int update(XxlJobUser xxlJobUser);
method delete (line 32) | public int delete(@Param("id") int id);
method updateToken (line 34) | public int updateToken(@Param("id") int id, @Param("token") String tok...
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/model/XxlJobGroup.java
class XxlJobGroup (line 13) | public class XxlJobGroup {
method getRegistryList (line 24) | public List<String> getRegistryList() {
method getId (line 31) | public int getId() {
method setId (line 35) | public void setId(int id) {
method getAppname (line 39) | public String getAppname() {
method setAppname (line 43) | public void setAppname(String appname) {
method getTitle (line 47) | public String getTitle() {
method setTitle (line 51) | public void setTitle(String title) {
method getAddressType (line 55) | public int getAddressType() {
method setAddressType (line 59) | public void setAddressType(int addressType) {
method getAddressList (line 63) | public String getAddressList() {
method getUpdateTime (line 67) | public Date getUpdateTime() {
method setUpdateTime (line 71) | public void setUpdateTime(Date updateTime) {
method setAddressList (line 75) | public void setAddressList(String addressList) {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/model/XxlJobInfo.java
class XxlJobInfo (line 10) | public class XxlJobInfo {
method getId (line 46) | public int getId() {
method setId (line 50) | public void setId(int id) {
method getJobGroup (line 54) | public int getJobGroup() {
method setJobGroup (line 58) | public void setJobGroup(int jobGroup) {
method getJobDesc (line 62) | public String getJobDesc() {
method setJobDesc (line 66) | public void setJobDesc(String jobDesc) {
method getAddTime (line 70) | public Date getAddTime() {
method setAddTime (line 74) | public void setAddTime(Date addTime) {
method getUpdateTime (line 78) | public Date getUpdateTime() {
method setUpdateTime (line 82) | public void setUpdateTime(Date updateTime) {
method getAuthor (line 86) | public String getAuthor() {
method setAuthor (line 90) | public void setAuthor(String author) {
method getAlarmEmail (line 94) | public String getAlarmEmail() {
method setAlarmEmail (line 98) | public void setAlarmEmail(String alarmEmail) {
method getScheduleType (line 102) | public String getScheduleType() {
method setScheduleType (line 106) | public void setScheduleType(String scheduleType) {
method getScheduleConf (line 110) | public String getScheduleConf() {
method setScheduleConf (line 114) | public void setScheduleConf(String scheduleConf) {
method getMisfireStrategy (line 118) | public String getMisfireStrategy() {
method setMisfireStrategy (line 122) | public void setMisfireStrategy(String misfireStrategy) {
method getExecutorRouteStrategy (line 126) | public String getExecutorRouteStrategy() {
method setExecutorRouteStrategy (line 130) | public void setExecutorRouteStrategy(String executorRouteStrategy) {
method getExecutorHandler (line 134) | public String getExecutorHandler() {
method setExecutorHandler (line 138) | public void setExecutorHandler(String executorHandler) {
method getExecutorParam (line 142) | public String getExecutorParam() {
method setExecutorParam (line 146) | public void setExecutorParam(String executorParam) {
method getExecutorBlockStrategy (line 150) | public String getExecutorBlockStrategy() {
method setExecutorBlockStrategy (line 154) | public void setExecutorBlockStrategy(String executorBlockStrategy) {
method getExecutorTimeout (line 158) | public int getExecutorTimeout() {
method setExecutorTimeout (line 162) | public void setExecutorTimeout(int executorTimeout) {
method getExecutorFailRetryCount (line 166) | public int getExecutorFailRetryCount() {
method setExecutorFailRetryCount (line 170) | public void setExecutorFailRetryCount(int executorFailRetryCount) {
method getGlueType (line 174) | public String getGlueType() {
method setGlueType (line 178) | public void setGlueType(String glueType) {
method getGlueSource (line 182) | public String getGlueSource() {
method setGlueSource (line 186) | public void setGlueSource(String glueSource) {
method getGlueRemark (line 190) | public String getGlueRemark() {
method setGlueRemark (line 194) | public void setGlueRemark(String glueRemark) {
method getGlueUpdatetime (line 198) | public Date getGlueUpdatetime() {
method setGlueUpdatetime (line 202) | public void setGlueUpdatetime(Date glueUpdatetime) {
method getChildJobId (line 206) | public String getChildJobId() {
method setChildJobId (line 210) | public void setChildJobId(String childJobId) {
method getTriggerStatus (line 214) | public int getTriggerStatus() {
method setTriggerStatus (line 218) | public void setTriggerStatus(int triggerStatus) {
method getTriggerLastTime (line 222) | public long getTriggerLastTime() {
method setTriggerLastTime (line 226) | public void setTriggerLastTime(long triggerLastTime) {
method getTriggerNextTime (line 230) | public long getTriggerNextTime() {
method setTriggerNextTime (line 234) | public void setTriggerNextTime(long triggerNextTime) {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/model/XxlJobLog.java
class XxlJobLog (line 9) | public class XxlJobLog {
method getId (line 37) | public long getId() {
method setId (line 41) | public void setId(long id) {
method getJobGroup (line 45) | public int getJobGroup() {
method setJobGroup (line 49) | public void setJobGroup(int jobGroup) {
method getJobId (line 53) | public int getJobId() {
method setJobId (line 57) | public void setJobId(int jobId) {
method getExecutorAddress (line 61) | public String getExecutorAddress() {
method setExecutorAddress (line 65) | public void setExecutorAddress(String executorAddress) {
method getExecutorHandler (line 69) | public String getExecutorHandler() {
method setExecutorHandler (line 73) | public void setExecutorHandler(String executorHandler) {
method getExecutorParam (line 77) | public String getExecutorParam() {
method setExecutorParam (line 81) | public void setExecutorParam(String executorParam) {
method getExecutorShardingParam (line 85) | public String getExecutorShardingParam() {
method setExecutorShardingParam (line 89) | public void setExecutorShardingParam(String executorShardingParam) {
method getExecutorFailRetryCount (line 93) | public int getExecutorFailRetryCount() {
method setExecutorFailRetryCount (line 97) | public void setExecutorFailRetryCount(int executorFailRetryCount) {
method getTriggerTime (line 101) | public Date getTriggerTime() {
method setTriggerTime (line 105) | public void setTriggerTime(Date triggerTime) {
method getTriggerCode (line 109) | public int getTriggerCode() {
method setTriggerCode (line 113) | public void setTriggerCode(int triggerCode) {
method getTriggerMsg (line 117) | public String getTriggerMsg() {
method setTriggerMsg (line 121) | public void setTriggerMsg(String triggerMsg) {
method getHandleTime (line 125) | public Date getHandleTime() {
method setHandleTime (line 129) | public void setHandleTime(Date handleTime) {
method getHandleCode (line 133) | public int getHandleCode() {
method setHandleCode (line 137) | public void setHandleCode(int handleCode) {
method getHandleMsg (line 141) | public String getHandleMsg() {
method setHandleMsg (line 145) | public void setHandleMsg(String handleMsg) {
method getAlarmStatus (line 149) | public int getAlarmStatus() {
method setAlarmStatus (line 153) | public void setAlarmStatus(int alarmStatus) {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/model/XxlJobLogGlue.java
class XxlJobLogGlue (line 9) | public class XxlJobLogGlue {
method getId (line 19) | public int getId() {
method setId (line 23) | public void setId(int id) {
method getJobId (line 27) | public int getJobId() {
method setJobId (line 31) | public void setJobId(int jobId) {
method getGlueType (line 35) | public String getGlueType() {
method setGlueType (line 39) | public void setGlueType(String glueType) {
method getGlueSource (line 43) | public String getGlueSource() {
method setGlueSource (line 47) | public void setGlueSource(String glueSource) {
method getGlueRemark (line 51) | public String getGlueRemark() {
method setGlueRemark (line 55) | public void setGlueRemark(String glueRemark) {
method getAddTime (line 59) | public Date getAddTime() {
method setAddTime (line 63) | public void setAddTime(Date addTime) {
method getUpdateTime (line 67) | public Date getUpdateTime() {
method setUpdateTime (line 71) | public void setUpdateTime(Date updateTime) {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/model/XxlJobLogReport.java
class XxlJobLogReport (line 5) | public class XxlJobLogReport {
method getId (line 15) | public int getId() {
method setId (line 19) | public void setId(int id) {
method getTriggerDay (line 23) | public Date getTriggerDay() {
method setTriggerDay (line 27) | public void setTriggerDay(Date triggerDay) {
method getRunningCount (line 31) | public int getRunningCount() {
method setRunningCount (line 35) | public void setRunningCount(int runningCount) {
method getSucCount (line 39) | public int getSucCount() {
method setSucCount (line 43) | public void setSucCount(int sucCount) {
method getFailCount (line 47) | public int getFailCount() {
method setFailCount (line 51) | public void setFailCount(int failCount) {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/model/XxlJobRegistry.java
class XxlJobRegistry (line 8) | public class XxlJobRegistry {
method getId (line 16) | public int getId() {
method setId (line 20) | public void setId(int id) {
method getRegistryGroup (line 24) | public String getRegistryGroup() {
method setRegistryGroup (line 28) | public void setRegistryGroup(String registryGroup) {
method getRegistryKey (line 32) | public String getRegistryKey() {
method setRegistryKey (line 36) | public void setRegistryKey(String registryKey) {
method getRegistryValue (line 40) | public String getRegistryValue() {
method setRegistryValue (line 44) | public void setRegistryValue(String registryValue) {
method getUpdateTime (line 48) | public Date getUpdateTime() {
method setUpdateTime (line 52) | public void setUpdateTime(Date updateTime) {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/model/XxlJobUser.java
class XxlJobUser (line 6) | public class XxlJobUser {
method getId (line 15) | public int getId() {
method setId (line 19) | public void setId(int id) {
method getUsername (line 23) | public String getUsername() {
method setUsername (line 27) | public void setUsername(String username) {
method getPassword (line 31) | public String getPassword() {
method setPassword (line 35) | public void setPassword(String password) {
method getToken (line 39) | public String getToken() {
method setToken (line 43) | public void setToken(String token) {
method getRole (line 47) | public int getRole() {
method setRole (line 51) | public void setRole(int role) {
method getPermission (line 55) | public String getPermission() {
method setPermission (line 59) | public void setPermission(String permission) {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/model/dto/XxlBootResourceDTO.java
class XxlBootResourceDTO (line 12) | public class XxlBootResourceDTO implements Serializable {
method XxlBootResourceDTO (line 75) | public XxlBootResourceDTO() {
method XxlBootResourceDTO (line 77) | public XxlBootResourceDTO(int id, int parentId, String name, int type,...
method getId (line 90) | public int getId() {
method setId (line 94) | public void setId(int id) {
method getParentId (line 98) | public int getParentId() {
method setParentId (line 102) | public void setParentId(int parentId) {
method getName (line 106) | public String getName() {
method setName (line 110) | public void setName(String name) {
method getType (line 114) | public int getType() {
method setType (line 118) | public void setType(int type) {
method getPermission (line 122) | public String getPermission() {
method setPermission (line 126) | public void setPermission(String permission) {
method getUrl (line 130) | public String getUrl() {
method setUrl (line 134) | public void setUrl(String url) {
method getIcon (line 138) | public String getIcon() {
method setIcon (line 142) | public void setIcon(String icon) {
method getOrder (line 146) | public int getOrder() {
method setOrder (line 150) | public void setOrder(int order) {
method getStatus (line 154) | public int getStatus() {
method setStatus (line 158) | public void setStatus(int status) {
method getAddTime (line 162) | public Date getAddTime() {
method setAddTime (line 166) | public void setAddTime(Date addTime) {
method getUpdateTime (line 170) | public Date getUpdateTime() {
method setUpdateTime (line 174) | public void setUpdateTime(Date updateTime) {
method getChildren (line 178) | public List<XxlBootResourceDTO> getChildren() {
method setChildren (line 182) | public void setChildren(List<XxlBootResourceDTO> children) {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/alarm/JobAlarm.java
type JobAlarm (line 9) | public interface JobAlarm {
method doAlarm (line 18) | public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog);
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/alarm/JobAlarmer.java
class JobAlarmer (line 24) | @Component
method setApplicationContext (line 31) | @Override
method afterPropertiesSet (line 36) | @Override
method alarm (line 47) | public boolean alarm(XxlJobInfo info, XxlJobLog jobLog) {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/alarm/impl/EmailJobAlarm.java
class EmailJobAlarm (line 26) | @Component
method doAlarm (line 35) | @Override
method loadEmailJobAlarmTemplate (line 92) | private static final String loadEmailJobAlarmTemplate(){
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/complete/JobCompleter.java
class JobCompleter (line 25) | @Component
method complete (line 39) | public int complete(XxlJobLog xxlJobLog) {
method processChildJob (line 60) | private void processChildJob(XxlJobLog xxlJobLog){
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/config/XxlJobAdminBootstrap.java
class XxlJobAdminBootstrap (line 32) | @Component
method getInstance (line 39) | public static XxlJobAdminBootstrap getInstance() {
method afterPropertiesSet (line 46) | @Override
method destroy (line 55) | @Override
method getJobTriggerPoolHelper (line 69) | public JobTriggerPoolHelper getJobTriggerPoolHelper() {
method getJobRegistryHelper (line 72) | public JobRegistryHelper getJobRegistryHelper() {
method getJobCompleteHelper (line 75) | public JobCompleteHelper getJobCompleteHelper() {
method doStart (line 82) | private void doStart() throws Exception {
method doStop (line 113) | private void doStop(){
method getExecutorBiz (line 139) | public static ExecutorBiz getExecutorBiz(String address) throws Except...
method getI18n (line 214) | public String getI18n() {
method getAccessToken (line 221) | public String getAccessToken() {
method getTimeout (line 225) | public int getTimeout() {
method getEmailFrom (line 229) | public String getEmailFrom() {
method getTriggerPoolFastMax (line 233) | public int getTriggerPoolFastMax() {
method getTriggerPoolSlowMax (line 240) | public int getTriggerPoolSlowMax() {
method getLogretentiondays (line 247) | public int getLogretentiondays() {
method getXxlJobLogMapper (line 254) | public XxlJobLogMapper getXxlJobLogMapper() {
method getXxlJobInfoMapper (line 258) | public XxlJobInfoMapper getXxlJobInfoMapper() {
method getXxlJobRegistryMapper (line 262) | public XxlJobRegistryMapper getXxlJobRegistryMapper() {
method getXxlJobGroupMapper (line 266) | public XxlJobGroupMapper getXxlJobGroupMapper() {
method getXxlJobLogReportMapper (line 270) | public XxlJobLogReportMapper getXxlJobLogReportMapper() {
method getXxlJobLockMapper (line 274) | public XxlJobLockMapper getXxlJobLockMapper() {
method getMailSender (line 278) | public JavaMailSender getMailSender() {
method getTransactionManager (line 286) | public PlatformTransactionManager getTransactionManager() {
method getJobAlarmer (line 290) | public JobAlarmer getJobAlarmer() {
method getJobTrigger (line 294) | public JobTrigger getJobTrigger() {
method getJobCompleter (line 298) | public JobCompleter getJobCompleter() {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/cron/CronExpression.java
class CronExpression (line 192) | public final class CronExpression implements Serializable, Cloneable {
method CronExpression (line 263) | public CronExpression(String cronExpression) throws ParseException {
method CronExpression (line 280) | public CronExpression(CronExpression expression) {
method isSatisfiedBy (line 306) | public boolean isSatisfiedBy(Date date) {
method getNextValidTimeAfter (line 327) | public Date getNextValidTimeAfter(Date date) {
method getNextInvalidTimeAfter (line 339) | public Date getNextInvalidTimeAfter(Date date) {
method getTimeZone (line 374) | public TimeZone getTimeZone() {
method setTimeZone (line 386) | public void setTimeZone(TimeZone timeZone) {
method toString (line 395) | @Override
method isValidExpression (line 408) | public static boolean isValidExpression(String cronExpression) {
method validateExpression (line 419) | public static void validateExpression(String cronExpression) throws Pa...
method buildExpression (line 431) | protected void buildExpression(String expression) throws ParseException {
method storeExpressionVals (line 520) | protected int storeExpressionVals(int pos, String s, int type)
method checkIncrementRange (line 706) | private void checkIncrementRange(int incr, int type, int idxPos) throw...
method checkNext (line 720) | protected int checkNext(int pos, String s, int val, int type)
method getCronExpression (line 854) | public String getCronExpression() {
method getExpressionSummary (line 858) | public String getExpressionSummary() {
method getExpressionSetSummary (line 895) | protected String getExpressionSetSummary(java.util.Set<Integer> set) {
method getExpressionSetSummary (line 921) | protected String getExpressionSetSummary(java.util.ArrayList<Integer> ...
method skipWhiteSpace (line 947) | protected int skipWhiteSpace(int i, String s) {
method findNextWhiteSpace (line 954) | protected int findNextWhiteSpace(int i, String s) {
method addToSet (line 961) | protected void addToSet(int val, int end, int incr, int type)
method getSet (line 1094) | TreeSet<Integer> getSet(int type) {
method getValue (line 1115) | protected ValueSet getValue(int v, String s, int i) {
method getNumericValue (line 1133) | protected int getNumericValue(String s, int i) {
method getMonthNumber (line 1139) | protected int getMonthNumber(String s) {
method getDayOfWeekNumber (line 1149) | protected int getDayOfWeekNumber(String s) {
method getTimeAfter (line 1165) | public Date getTimeAfter(Date afterTime) {
method setCalendarHour (line 1518) | protected void setCalendarHour(Calendar cal, int hour) {
method getTimeBefore (line 1529) | public Date getTimeBefore(Date endTime) {
method getFinalFireTime (line 1538) | public Date getFinalFireTime() {
method isLeapYear (line 1543) | protected boolean isLeapYear(int year) {
method getLastDayOfMonth (line 1547) | protected int getLastDayOfMonth(int monthNum, int year) {
method findSmallestDay (line 1581) | private Optional<Integer> findSmallestDay(int day, int mon, int year, ...
method readObject (line 1602) | private void readObject(java.io.ObjectInputStream stream)
method clone (line 1612) | @Override
class ValueSet (line 1619) | class ValueSet {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/exception/XxlJobException.java
class XxlJobException (line 6) | public class XxlJobException extends RuntimeException {
method XxlJobException (line 8) | public XxlJobException() {
method XxlJobException (line 10) | public XxlJobException(String message) {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/MisfireHandler.java
class MisfireHandler (line 8) | public abstract class MisfireHandler {
method handle (line 15) | public abstract void handle(final int jobId);
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/MisfireStrategyEnum.java
type MisfireStrategyEnum (line 10) | public enum MisfireStrategyEnum {
method MisfireStrategyEnum (line 25) | MisfireStrategyEnum(String title, MisfireHandler misfireHandler) {
method getTitle (line 30) | public String getTitle() {
method getMisfireHandler (line 34) | public MisfireHandler getMisfireHandler() {
method match (line 45) | public static MisfireStrategyEnum match(String name, MisfireStrategyEn...
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/strategy/MisfireDoNothing.java
class MisfireDoNothing (line 7) | public class MisfireDoNothing extends MisfireHandler {
method handle (line 10) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/strategy/MisfireFireOnceNow.java
class MisfireFireOnceNow (line 9) | public class MisfireFireOnceNow extends MisfireHandler {
method handle (line 12) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/openapi/OpenApiController.java
class OpenApiController (line 22) | @Controller
method api (line 31) | @RequestMapping("/api/{uri}")
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/ExecutorRouteStrategyEnum.java
type ExecutorRouteStrategyEnum (line 9) | public enum ExecutorRouteStrategyEnum {
method ExecutorRouteStrategyEnum (line 22) | ExecutorRouteStrategyEnum(String title, ExecutorRouter router) {
method getTitle (line 30) | public String getTitle() {
method getRouter (line 33) | public ExecutorRouter getRouter() {
method match (line 40) | public static ExecutorRouteStrategyEnum match(String name, ExecutorRou...
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/ExecutorRouter.java
class ExecutorRouter (line 13) | public abstract class ExecutorRouter {
method route (line 22) | public abstract Response<String> route(TriggerRequest triggerParam, Li...
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteBusyover.java
class ExecutorRouteBusyover (line 16) | public class ExecutorRouteBusyover extends ExecutorRouter {
method route (line 18) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteConsistentHash.java
class ExecutorRouteConsistentHash (line 21) | public class ExecutorRouteConsistentHash extends ExecutorRouter {
method hash (line 31) | private static long hash(String key) {
method hashJob (line 63) | public String hashJob(int jobId, List<String> addressList) {
method route (line 83) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteFailover.java
class ExecutorRouteFailover (line 15) | public class ExecutorRouteFailover extends ExecutorRouter {
method route (line 17) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteFirst.java
class ExecutorRouteFirst (line 12) | public class ExecutorRouteFirst extends ExecutorRouter {
method route (line 14) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteLFU.java
class ExecutorRouteLFU (line 18) | public class ExecutorRouteLFU extends ExecutorRouter {
method route (line 28) | public String route(int jobId, List<String> addressList) {
method route (line 72) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteLRU.java
class ExecutorRouteLRU (line 20) | public class ExecutorRouteLRU extends ExecutorRouter {
method route (line 30) | public String route(int jobId, List<String> addressList) {
method route (line 74) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteLast.java
class ExecutorRouteLast (line 12) | public class ExecutorRouteLast extends ExecutorRouter {
method route (line 14) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteRandom.java
class ExecutorRouteRandom (line 13) | public class ExecutorRouteRandom extends ExecutorRouter {
method route (line 17) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteRound.java
class ExecutorRouteRound (line 16) | public class ExecutorRouteRound extends ExecutorRouter {
method count (line 21) | private static int count(int jobId) {
method route (line 40) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobCompleteHelper.java
class JobCompleteHelper (line 22) | public class JobCompleteHelper {
method start (line 34) | public void start(){
method stop (line 122) | public void stop(){
method callback (line 140) | public Response<String> callback(List<CallbackRequest> callbackParamLi...
method doCallback (line 156) | private Response<String> doCallback(CallbackRequest handleCallbackPara...
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobFailAlarmMonitorHelper.java
class JobFailAlarmMonitorHelper (line 19) | public class JobFailAlarmMonitorHelper {
method start (line 31) | public void start(){
method stop (line 102) | public void stop(){
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobLogReportHelper.java
class JobLogReportHelper (line 19) | public class JobLogReportHelper {
method start (line 29) | public void start(){
method stop (line 149) | public void stop(){
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobRegistryHelper.java
class JobRegistryHelper (line 22) | public class JobRegistryHelper {
method start (line 34) | public void start(){
method stop (line 137) | public void stop(){
method registry (line 158) | public Response<String> registry(RegistryRequest registryParam) {
method registryRemove (line 193) | public Response<String> registryRemove(RegistryRequest registryParam) {
method freshGroupRegistryInfo (line 217) | private void freshGroupRegistryInfo(RegistryRequest registryParam){
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobScheduleHelper.java
class JobScheduleHelper (line 23) | public class JobScheduleHelper {
method start (line 45) | public void start(){
method refreshNextTriggerTime (line 256) | private void refreshNextTriggerTime(XxlJobInfo jobInfo, Date fromTime) {
method pushTimeRing (line 293) | private void pushTimeRing(int ringSecond, int jobId){
method stop (line 307) | public void stop(){
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobTriggerPoolHelper.java
class JobTriggerPoolHelper (line 16) | public class JobTriggerPoolHelper {
method start (line 29) | public void start(){
method stop (line 72) | public void stop() {
method trigger (line 100) | public void trigger(final int jobId,
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/trigger/JobTrigger.java
class JobTrigger (line 32) | @Component
method trigger (line 63) | public void trigger(int jobId,
method processTrigger (line 134) | private void processTrigger(XxlJobGroup group,
method doTrigger (line 258) | private Response<String> doTrigger(TriggerRequest triggerParam, String...
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/trigger/TriggerTypeEnum.java
type TriggerTypeEnum (line 10) | public enum TriggerTypeEnum {
method TriggerTypeEnum (line 19) | private TriggerTypeEnum(String title){
method getTitle (line 23) | public String getTitle() {
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/ScheduleType.java
class ScheduleType (line 12) | public abstract class ScheduleType {
method generateNextTriggerTime (line 20) | public abstract Date generateNextTriggerTime(XxlJobInfo jobInfo, Date ...
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/ScheduleTypeEnum.java
type ScheduleTypeEnum (line 11) | public enum ScheduleTypeEnum {
method ScheduleTypeEnum (line 33) | ScheduleTypeEnum(String title, ScheduleType scheduleType) {
method getTitle (line 38) | public String getTitle() {
method getScheduleType (line 42) | public ScheduleType getScheduleType() {
method match (line 53) | public static ScheduleTypeEnum match(String name, ScheduleTypeEnum def...
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/CronScheduleType.java
class CronScheduleType (line 9) | public class CronScheduleType extends ScheduleType {
method generateNextTriggerTime (line 11) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/FixRateScheduleType.java
class FixRateScheduleType (line 8) | public class FixRateScheduleType extends ScheduleType {
method generateNextTriggerTime (line 10) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/NoneScheduleType.java
class NoneScheduleType (line 8) | public class NoneScheduleType extends ScheduleType {
method generateNextTriggerTime (line 10) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java
type XxlJobService (line 16) | public interface XxlJobService {
method pageList (line 21) | public Response<PageModel<XxlJobInfo>> pageList(int offset, int pagesi...
method add (line 26) | public Response<String> add(XxlJobInfo jobInfo, LoginInfo loginInfo);
method update (line 31) | public Response<String> update(XxlJobInfo jobInfo, LoginInfo loginInfo);
method remove (line 36) | public Response<String> remove(int id, LoginInfo loginInfo);
method start (line 41) | public Response<String> start(int id, LoginInfo loginInfo);
method stop (line 46) | public Response<String> stop(int id, LoginInfo loginInfo);
method trigger (line 51) | public Response<String> trigger(LoginInfo loginInfo, int jobId, String...
method dashboardInfo (line 56) | public Map<String,Object> dashboardInfo();
method chartInfo (line 61) | public Response<Map<String,Object>> chartInfo(Date startDate, Date end...
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java
class AdminBizImpl (line 15) | @Service
method callback (line 18) | @Override
method registry (line 23) | @Override
method registryRemove (line 28) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
class XxlJobServiceImpl (line 38) | @Service
method pageList (line 53) | @Override
method add (line 68) | @Override
method update (line 178) | @Override
method remove (line 318) | @Override
method start (line 342) | @Override
method stop (line 390) | @Override
method trigger (line 418) | @Override
method dashboardInfo (line 445) | @Override
method chartInfo (line 479) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/util/I18nUtil.java
class I18nUtil (line 26) | @Component
method afterPropertiesSet (line 44) | @Override
method getI18n (line 58) | public String getI18n() {
method getSingle (line 66) | private static I18nUtil getSingle() {
method loadI18nProp (line 73) | public static Properties loadI18nProp(){
method getString (line 92) | public static String getString(String key) {
method getMultString (line 102) | public static String getMultString(String... keys) {
method initI18nEnum (line 125) | private void initI18nEnum(){
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/util/JobGroupPermissionUtil.java
class JobGroupPermissionUtil (line 19) | public class JobGroupPermissionUtil {
method hasJobGroupPermission (line 24) | public static boolean hasJobGroupPermission(LoginInfo loginInfo, int j...
method validJobGroupPermission (line 37) | public static LoginInfo validJobGroupPermission(HttpServletRequest req...
method filterJobGroupByPermission (line 48) | public static List<XxlJobGroup> filterJobGroupByPermission(HttpServlet...
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/web/error/WebErrorPageRegistrar.java
class WebErrorPageRegistrar (line 11) | @Component
method registerErrorPages (line 14) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/web/error/WebHandlerExceptionResolver.java
class WebHandlerExceptionResolver (line 23) | @Component
method resolveException (line 27) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/web/xxlsso/SimpleLoginStore.java
class SimpleLoginStore (line 24) | @Component
method set (line 32) | @Override
method update (line 43) | @Override
method remove (line 48) | @Override
method get (line 58) | @Override
FILE: xxl-job-admin/src/main/java/com/xxl/job/admin/web/xxlsso/XxlSsoConfig.java
class XxlSsoConfig (line 15) | @Configuration
method xxlSsoBootstrap (line 39) | @Bean(initMethod = "start", destroyMethod = "stop")
method addInterceptors (line 52) | @Override
FILE: xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/ckeditor.js
function a (line 7) | function a(){try{document.addEventListener?(document.removeEventListener...
function b (line 7) | function b(){for(var a;a=c.shift();)a()}
function h (line 7) | function h(){try{document.documentElement.doScroll("left")}catch(e){setT...
function a (line 9) | function a(a){var d=f(this);return d[a]||(d[a]=new b(a))}
function h (line 9) | function h(a,e,n,g){a={name:b,sender:this,editor:a,
function m (line 10) | function m(){n.removeListener(b,d)}
function a (line 19) | function a(a,e,b){this._minInterval=
function f (line 20) | function f(e,g,b){a.call(this,e,g,b);this._args=[];var h=this;this.input...
function g (line 48) | function g(a){b.top=h[a[0]];b.right=h[a[1]];b.bottom=h[a[2]];b.left=h[a[...
function g (line 52) | function g(a){if(a){var e=a.getClientRect();b.top+=e.top;b.left+=e.left;...
function b (line 72) | function b(c){c["data-cke-expando"]&&(c["data-cke-expando"]=!1);if(c.nod...
function c (line 72) | function c(b){if(b.type==CKEDITOR.NODE_ELEMENT||b.type==CKEDITOR.NODE_DO...
function f (line 74) | function f(a,g){var h=g?a.nextSibling:a.previousSibling;return h&&h.node...
function b (line 75) | function b(a){return!a.nodeValue||a.nodeValue==CKEDITOR.dom.selection.FI...
function a (line 93) | function a(a,b){return-1<(" "+a+" ").replace(l," ").indexOf(" "+b+" ")}
function f (line 93) | function f(a){var b=!0;a.$.id||(a.$.id="cke_tmp_"+CKEDITOR.tools.getNext...
function b (line 93) | function b(a,b){var c=CKEDITOR.tools.escapeCss(a.$.id);return"#"+
function c (line 94) | function c(a){for(var b=0,c=0,e=k[a].length;c<e;c++)b+=parseFloat(this.g...
function a (line 98) | function a(){try{this.$.focus()}catch(b){}}
function a (line 109) | function a(b){var g=this.$.attributes.getNamedItem(b);if("input"==this.g...
function a (line 111) | function a(b,g,e){if(g&&g.type==CKEDITOR.NODE_ELEMENT){for(var c=[];g.da...
function k (line 120) | function k(e,b){/body|html/.test(a.getName())?a.getWindow().$.scrollBy(e...
function p (line 120) | function p(a,e){var b={x:0,y:0};if(!a.is(w?"body":"html")){var c=a.$.get...
function v (line 121) | function v(a,b){return parseInt(a.getComputedStyle("margin-"+b)||0,10)||0}
function a (line 125) | function a(b,c){var e=b.childNodes;if(0<=c&&c<e.length)return e[c]}
function a (line 125) | function a(b){return b.type==CKEDITOR.NODE_ELEMENT&&b.hasClass("cke_enab...
function a (line 130) | function a(a,b){var e=this.range;if(this._.end)return null;
function f (line 133) | function f(b){for(var e,c=null;e=a.call(this,b);)c=e;return c}
function e (line 136) | function e(a){return a&&a.getName&&"span"==a.getName()&&a.data("cke-book...
function b (line 137) | function b(a){return!l(a)&&!k(a)}
function a (line 141) | function a(a){a.collapsed=a.startContainer&&a.endContainer&&a.startConta...
function f (line 141) | function f(a,b,c,d,g){function h(a,b,e,c){var d=e?a.getPrevious():a.getN...
function b (line 145) | function b(){var a=!1,b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom...
function c (line 145) | function c(a){var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.wal...
function d (line 146) | function d(a){return function(){var b;return this[a?"getPreviousNode":"g...
function a (line 149) | function a(b){var e=
function b (line 151) | function b(a,e){var c=e.getCustomData("cke-fillingChar");if(c){var d=a.c...
function c (line 157) | function c(a){return a&&a.type==CKEDITOR.NODE_ELEMENT&&a.hasAttribute("c...
function a (line 174) | function a(e){return function(a){return b(a)||
function a (line 179) | function a(b,c){for(;b;){if(b.type==CKEDITOR.NODE_ELEMENT){if("false"==b...
function a (line 186) | function a(b,c){var e=CKEDITOR.tools.array.map(b,function(a){return a}),...
function b (line 189) | function b(a,c,e){var g;c.collapsed?e.startContainer instanceof CKEDITOR...
function c (line 190) | function c(a,b,e){a=CKEDITOR.tools.extend({},a);b&&(a=CKEDITOR.tools.get...
function d (line 190) | function d(a){var b=a.startNode;a=a.endNode;var c;b.setText("");b.remov...
function a (line 195) | function a(a){1>arguments.length||(this.range=a,this.forceBrBreak=0,this...
function f (line 195) | function f(a){var b=[];a.forEach(function(a){if("true"==a.getAttribute("...
function b (line 195) | function b(a,c,d,g){a:{null==g&&(g=f(d));for(var h;h=g.shift();)if(h.get...
function c (line 196) | function c(a,b,c){if(!b)return!1;a=a.clone();a.collapse(!c);return a.che...
function d (line 204) | function d(a){return!(a.equals(c)||a.equals(g))}
function a (line 209) | function a(a,b,c,e,d){var g,h;a=[];for(g in b){h=b[g];h="boolean"==typeo...
function f (line 211) | function f(a,c,e,d){if(!a.match||a.match(c))if(d||g(a,c))if(a.properties...
function b (line 212) | function b(a,b,c){if(!a)return!1;if(!0===a)return!0;for(var e in b)c[e]|...
function c (line 212) | function c(a,b,c){if(!a.match||a.match(b)){if(a.noProperties)return!1;c....
function d (line 213) | function d(a,b){if(!a)return!1;var c=!1,e=!0===a,d;for(d in b)if(e||a(d)...
function l (line 213) | function l(a,b,c){if(a.disabled||a.customConfig&&!c||!b)return!1;a._.cac...
function k (line 213) | function k(a,b){if(!a)return!1;if(!0===a)return a;if("string"==typeof a)...
function g (line 214) | function g(a,b){if(a.nothingRequired)return!0;var c,e,d,g;if(d=a.require...
function h (line 214) | function h(a,b){if(!b)return!0;for(var c=0,e;c<b.length;++c)if(e=b[c],"s...
function m (line 215) | function m(a){if(!a)return{};a=a.split(/\s*,\s*/).sort();for(var b={};a....
function e (line 215) | function e(a){var b,c,e,d,g={},h=1;for(a=J(a);b=a.match(D);)(c=b[2])?(e=...
function n (line 215) | function n(a,b){var c=a.match(N[b]);return c?J(c[1]):null}
function q (line 216) | function q(a){var b=a.styleBackup=a.attributes.style,c=a.classBackup=a.a...
function y (line 216) | function y(a,b,e,d){var g=0,h;d.toHtml&&(b.name=b.name.replace(Q,"$1"));...
function u (line 219) | function u(a){var b=[],c;for(c in a)-1<c.indexOf("*")&&b.push(c.replace(...
function p (line 220) | function p(a){var b=a.attributes,c;delete b.style;delete b["class"];if(c...
function v (line 220) | function v(a){switch(a.name){case "a":if(!(a.children.length||a.attribut...
function w (line 220) | function w(a){if(!a)return!1;if(!0===a)return!0;var b=u(a);return functi...
function r (line 220) | function r(){return new CKEDITOR.htmlParser.element("br")}
function z (line 221) | function z(a){return a.type==CKEDITOR.NODE_ELEMENT&&("br"==a.name||F.$bl...
function t (line 221) | function t(a,b,c){var e=a.name;if(F.$empty[e]||!a.children.length)"hr"==...
function x (line 223) | function x(a,b,c){var e,d;for(e=0;e<c.length;++e)if(d=c[e],!(d.check&&!a...
function A (line 223) | function A(a,b){var c=b.getDefinition(),e=c.attributes,d=c.styles,g,h,f,...
function B (line 224) | function B(a,b){var c,e;"string"==typeof a?c=a:a instanceof CKEDITOR.sty...
function C (line 224) | function C(a){return function(b){return A(b,a)}}
function H (line 224) | function H(a){return function(b,c){c[a](b)}}
function b (line 241) | function b(e){a.styles["margin-top"]=c[e[0]];a.styles["margin-right"]=c[...
function f (line 243) | function f(){if(this.hasFocus){this.hasFocus=
function a (line 251) | function a(){var b;(b=c[0])&&this.load(b.scriptUrl,b.callback,CKEDITOR,0)}
function a (line 257) | function a(a,e,d){CKEDITOR.event.call(this);a=a&&CKEDITOR.tools.clone(a);
function f (line 261) | function f(){do var a="editor"+ ++u;while(CKEDITOR.instances[a]);return a}
function b (line 261) | function b(a,b){return b==CKEDITOR.ELEMENT_MODE_INLINE?a.is(CKEDITOR.dtd...
function c (line 261) | function c(){var a=this.commands,b;for(b in a)d(this,a[b])}
function d (line 261) | function d(a,b){b[b.startDisabled?"disable":a.readOnly&&!b.readOnly?"dis...
function l (line 261) | function l(a,b,c){if(b){var e,d,g=a.commands;for(d in g)e=g[d],(c||e.con...
function k (line 262) | function k(a){var b=a.config.customConfig;if(!b)return!1;var b=CKEDITOR....
function g (line 262) | function g(a,b){a.on("customConfigLoaded",function(){if(b){if(b.on)for(v...
function h (line 264) | function h(a){CKEDITOR.skin.loadPart("editor",function(){m(a)})}
function m (line 264) | function m(a){CKEDITOR.lang.load(a.config.language,
function e (line 265) | function e(a){a.getStylesSet(function(b){a.once("loaded",function(){a.fi...
function n (line 265) | function n(a){function b(a){if(!a)return"";
function q (line 269) | function q(){var a=this.element;if(a&&this.elementMode!=CKEDITOR.ELEMENT...
function y (line 269) | function y(a,b){function c(a){var b=a.startContainer,e=a.endContainer;re...
function a (line 271) | function a(b){c.updateElement();c._.required&&!e.getValue()&&!1===c.fire...
function b (line 271) | function b(a){return!!(a&&a.call&&
function a (line 290) | function a(a){return a.attributes["data-cke-survive"]?!1:"a"==a.name&&a....
function h (line 291) | function h(a){var b;if(0<v.length)for(var c=0;c<v.length;c++){var e=v[c]...
function m (line 291) | function m(){for(;w.length;)n(w.shift(),r)}
function e (line 291) | function e(a){if(a._.isBlockLike&&"pre"!=a.name&&"textarea"!=a.name){var...
function n (line 292) | function n(b,c,d){c=c||r||p;var h=r;void 0===b.previous&&(q(c,b)&&(r=c,u...
function q (line 292) | function q(a,b){if((a==p||"body"==a.name)&&g&&(!a.name||CKEDITOR.dtd[a.n...
function y (line 293) | function y(a,b){return a in CKEDITOR.dtd.$listItem||a in CKEDITOR.dtd.$t...
function a (line 300) | function a(){this.rules=[]}
function f (line 300) | function f(b,c,d,f){var k,g;for(k in c)(g=b[k])||(g=b[k]=new a),g.add(c[...
function a (line 305) | function a(a,
function f (line 309) | function f(a,b){return a!=CKEDITOR.ENTER_BR&&!1!==b?a==CKEDITOR.ENTER_DI...
function b (line 309) | function b(a){for(a=a.children[a.children.length-1];a&&d(a);)a=a.previou...
function c (line 309) | function c(a){for(a=a.previous;a&&d(a);)a=a.previous;return a}
function d (line 309) | function d(a){return a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(a....
function l (line 309) | function l(a){return a&&(a.type==CKEDITOR.NODE_ELEMENT&&a.name in
function k (line 310) | function k(a,b){var c=a.children[a.children.length-1];a.children.push(b)...
function g (line 310) | function g(a){a=a.attributes;"false"!=a.contenteditable&&(a["data-cke-ed...
function h (line 310) | function h(a){a=a.attributes;switch(a["data-cke-editable"]){case "true":...
function m (line 310) | function m(a){return a.replace(I,function(a,b,c){return"\x3c"+b+c.replac...
function e (line 311) | function e(a,b){return a.replace(b,function(a,b,c){0===a.indexOf("\x3cte...
function n (line 311) | function n(a){return a.replace(D,function(a,b){return decodeURIComponent...
function q (line 311) | function q(a){return a.replace(/\x3c!--(?!{cke_protected})[\s\S]+?--\x3e/g,
function y (line 312) | function y(a){return CKEDITOR.tools.array.reduce(a.split(""),function(a,...
function u (line 312) | function u(a){var b;b=a.charCodeAt(0);var c=b.toString(16);b={htmlCode:"...
function p (line 312) | function p(a){return a.replace(/\x3c!--\{cke_protected\}\{C\}([\s\S]+?)-...
function v (line 313) | function v(a,b){var c=b._.dataStore;return a.replace(/\x3c!--\{cke_prote...
function w (line 313) | function w(a,b){var c=[],e=b.config.protectedSource,d=b._.dataStore||(b....
function a (line 328) | function a(a){return function(b){return b.type==CKEDITOR.NODE_ELEMENT&&(...
function f (line 336) | function f(){CKEDITOR.currentInstance==a&&(CKEDITOR.currentInstance=null...
function a (line 340) | function a(a,d,l,k){a=CKEDITOR.editor._getEditorElement(a);
function f (line 342) | function f(){var a=this.container,b=this.element;a&&(a.clearCustomData()...
function b (line 342) | function b(a){var b=a.name,f=a.element,k=a.elementMode,g=a.fire("uiSpace...
function a (line 349) | function a(a){var b=a.editor,e=a.data.path,d=e.blockLimit,g=a.data.selec...
function f (line 351) | function f(a,b){if(a.isFake)return 0;var e=b.block||b.blockLimit,d=e&&e....
function b (line 351) | function b(a){var b=a.data.getTarget();b.is("input")&&(b=b.getAttribute(...
function c (line 351) | function c(a){return n(a)&&
function d (line 352) | function d(a,b){return function(c){var e=c.data.$.toElement||c.data.$.fr...
function l (line 352) | function l(a){function b(a){return function(b,d){d&&b.type==CKEDITOR.NOD...
function k (line 353) | function k(a,b,c){return!1!==a.config.autoParagraph&&a.activeEnterMode!=...
function g (line 353) | function g(a){return a.activeEnterMode!=CKEDITOR.ENTER_BR&&!1!==a.config...
function h (line 354) | function h(a){a&&a.isEmptyInlineRemoveable()&&a.remove()}
function m (line 354) | function m(a){var b=a.editor;b.getSelection().scrollIntoView();setTimeou...
function e (line 354) | function e(a,b,c){var e=a.getCommonAncestor(b);for(b=a=c?b:a;(a=a.getPar...
function a (line 363) | function a(){var b=c.getDocument().$,e=b.getSelection(),d;a:if(e.anchorN...
function b (line 364) | function b(){var a=c.getDocument().$,e=a.selection,d=c.getDocument().get...
function a (line 385) | function a(b){return b.type==CKEDITOR.NODE_ELEMENT}
function b (line 385) | function b(c,e){var d,g,f,h,m=[],k=e.range.startContainer;d=e.range.star...
function e (line 386) | function e(b,c){var d=[],g=b.getChildren(),f=g.count(),
function d (line 387) | function d(b){return a(b.startContainer)&&b.startContainer.getChild(b.st...
function f (line 387) | function f(b){return b&&a(b)&&(b.is(n.$removeEmpty)||b.is("a")&&!b.isBlo...
function m (line 387) | function m(b,c,e,d){var g=b.clone(),f,h;g.setEndAt(c,CKEDITOR.POSITION_B...
function l (line 388) | function l(b,c){function e(b,c){if(c.isBlock&&c.isElement&&!c.node.is("b...
function a (line 398) | function a(b){b=new CKEDITOR.dom.walker(b);b.guard=function(a,b){if(b)re...
function b (line 399) | function b(a,c,e){c=a.getDocument().createElement(c);a.append(c,e);retur...
function c (line 399) | function c(a){var b=a.count(),e;for(b;0<b--;)e=a.getItem(b),CKEDITOR.too...
function a (line 400) | function a(b){b=new CKEDITOR.dom.walker(b);b.guard=function(a,
function a (line 405) | function a(b,c){var e=b.getParent();if(e.is(CKEDITOR.dtd.$inline))b[c?"i...
function b (line 406) | function b(c,e,d){a(e);a(d,1);for(var g;g=d.getNext();)g.insertAfter(e),...
function c (line 406) | function c(a,b){var e=new CKEDITOR.dom.range(a);e.setStartAfter(b.startN...
function a (line 409) | function a(c){var d=[],g,f=new CKEDITOR.dom.walker(c),h=c.startPath().co...
function b (line 410) | function b(a,c){var e=CKEDITOR.POSITION_CONTAINS+
function a (line 415) | function a(a){return CKEDITOR.plugins.widget&&CKEDITOR.plugins.widget.is...
function f (line 415) | function f(b,c){if(0===b.length||a(b[0].getEnclosedNode()))return!1;var ...
function b (line 416) | function b(a){function b(a){a=a.find("td, th");var c=[],e;for(e=0;e<a.co...
function c (line 417) | function c(a){a=b(a);var c="",e=[],d,g;for(g=0;g<a.length;g++)d&&!d.equa...
function d (line 417) | function d(a){var b=this.root.editor,e=b.getSelection(1);this.reset();t=...
function l (line 418) | function l(){var b=this._.fakeSelection,c;if(b){c=this.getSelection(1);v...
function k (line 420) | function k(){A=!0;x||(g.call(this),x=CKEDITOR.tools.setTimeout(g,200,thi...
function g (line 420) | function g(){x=null;A&&(CKEDITOR.tools.setTimeout(l,0,this),A=
function h (line 421) | function h(a){return B(a)||a.type==CKEDITOR.NODE_ELEMENT&&!a.is(CKEDITOR...
function m (line 421) | function m(a){function b(c,e){return c&&c.type!=CKEDITOR.NODE_TEXT?a.clo...
function e (line 421) | function e(a){n(a,!1);var b=a.getDocument().createText(r);
function n (line 422) | function n(a,b){var c=a&&a.removeCustomData("cke-fillingChar");if(c){if(...
function q (line 423) | function q(a,b){return b?a.replace(z,function(a,b){return b?" ":""}):a.r...
function y (line 423) | function y(a,b){var c=b&&CKEDITOR.tools.htmlEncode(b)||"\x26nbsp;",c=CKE...
function u (line 424) | function u(a){var b={37:1,39:1,8:1,46:1};return function(c){var e=c.data...
function p (line 425) | function p(a){for(var b=0;b<a.length;b++){var c=a[b];c.getCommonAncestor...
function a (line 427) | function a(b){return function(a){var c=a.editor.createRange();c.moveToCl...
function b (line 427) | function b(a){return function(b){var c=b.editor,e=c.createRange(),
function b (line 428) | function b(){var a=c.getSelection();a&&a.removeAllRanges()}
function a (line 429) | function a(){t=new CKEDITOR.dom.selection(c.getSelection());t.lock()}
function b (line 429) | function b(){g.removeListener("mouseup",b);m.removeListener("mouseup",b)...
function e (line 429) | function e(a){a=a.getRanges()[0];return a?(a=a.startContainer.getAscenda...
function b (line 433) | function b(a){a=a.data.$;if(z){var c=h.$.createTextRange();try{c.moveToP...
function c (line 433) | function c(){m.removeListener("mousemove",b);g.removeListener("mouseup",...
function a (line 444) | function a(b){return(new CKEDITOR.dom.node(b)).getIndex()}
function a (line 463) | function a(a,b){for(var c,e;(a=a.getParent())&&
function f (line 464) | function f(a,b,c,e){return(a.getPosition(b)|e)==e&&(!c.childRule||c.chil...
function b (line 464) | function b(c){var e=c.document;if(c.collapsed)e=w(this,e),c.insertNode(e...
function c (line 469) | function c(a){function b(){for(var a=new CKEDITOR.dom.elementPath(e.getP...
function d (line 471) | function d(a){var b=[];a.forEach(function(a){if("true"==
function l (line 472) | function l(a){var b=a.getEnclosedNode()||a.getCommonAncestor(!1,!0);(a=(...
function k (line 472) | function k(a){var b=a.getCommonAncestor(!0,!0);if(a=(new CKEDITOR.dom.el...
function g (line 473) | function g(a){var b=a.createBookmark(!0),c=a.createIterator();c.enforceR...
function h (line 473) | function h(a){var b=a.createBookmark(1),c=a.createIterator();c.enforceRe...
function m (line 474) | function m(a,b){var c=!b;c&&(b=a.getDocument().createElement("div"),a.co...
function e (line 476) | function e(a){var b=[];n(a.getOuterHtml(),/(\S\s*)\n(?:\s|(<span[^>]+dat...
function n (line 476) | function n(a,b,c){var e="",d="";a=a.replace(/(^<span[^>]+data-cke-bookma...
function q (line 476) | function q(a,b){var c;
function y (line 478) | function y(a,b){var c=this._.definition,e=c.attributes,c=c.styles,d=t(th...
function u (line 479) | function u(a){for(var b=t(this),c=a.getElementsByTag(this.element),e,d=c...
function p (line 479) | function p(a,b,c){if(b=b&&b.attributes)for(var e=0;e<b.length;e++){var d...
function v (line 480) | function v(a,b){if(!a.hasAttributes()||b)if(CKEDITOR.dtd.$block[a.getNam...
function w (line 481) | function w(a,b,c){var e;e=a.element;"*"==e&&(e="span");e=new CKEDITOR.do...
function r (line 481) | function r(a,b){var c=b._.definition,e=c.attributes,c=CKEDITOR.style.get...
function z (line 482) | function z(a,b){for(var c in a)a[c]=a[c].replace(I,function(a,c){return ...
function t (line 482) | function t(a){if(a._.overrides)return a._.overrides;var b=a._.overrides=...
function x (line 482) | function x(a,
function A (line 483) | function A(a,b){function c(a,b){return"font-family"==b.toLowerCase()?a.r...
function B (line 483) | function B(a,b,c){var e=a.getRanges();b=b?this.removeFromRange:this.appl...
function a (line 502) | function a(a,c,d){var f=a.serializable,k=c[d?"endContainer":"startContai...
function a (line 505) | function a(){return CKEDITOR.getUrl(CKEDITOR.skinName.split(",")[1]||"sk...
function f (line 506) | function f(b){var c=CKEDITOR.skin["ua_"+b],d=CKEDITOR.env;if(c)for(var c...
function b (line 506) | function b(a,b){l[a]||(CKEDITOR.document.appendStyleSheet(f(a)),l[a]=1);...
function c (line 506) | function c(a){var b=a.getById(k);b||(b=a.getHead().append("style"),b.set...
function d (line 507) | function d(a,b,c){var d,g,f;if(CKEDITOR.env.webkit)for(b=b.split("}").sl...
function a (line 546) | function a(){c.$.open();
function a (line 552) | function a(){for(var a=
function f (line 553) | function f(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(...
function b (line 553) | function b(a,b){for(var c=a.$.getElementsByTagName("input"),e=0,d=c.leng...
function c (line 554) | function c(a,b){var c=this.getInputElement();c&&(a?c.removeAttribute("ar...
function d (line 554) | function d(){var a=
function l (line 555) | function l(a){var b=CKEDITOR.dom.element.createFromHtml(CKEDITOR.addTemp...
function k (line 557) | function k(a,b,c){this.element=b;this.focusIndex=c;this.tabIndex=0;this....
function g (line 557) | function g(a){function b(){a.layout()}var c=CKEDITOR.document.getWindow();
function h (line 558) | function h(a,b){this._={dialog:a};CKEDITOR.tools.extend(this,b)}
function m (line 558) | function m(a){function b(c){var k=a.getSize(),l=CKEDITOR.document.getWin...
function e (line 560) | function e(a){function b(c){var n="rtl"==g.lang.dir,r=m.width,t=m.height...
function n (line 564) | function n(a){a.data.preventDefault(1)}
function q (line 564) | function q(a){var b=CKEDITOR.document.getWindow(),c=a.config,e=CKEDITOR....
function y (line 568) | function y(a){B&&(a.focusManager.remove(B),a=CKEDITOR.document.getWindow...
function h (line 570) | function h(){var a=x._.focusList;a.sort(function(a,b){return a.tabIndex!...
function k (line 570) | function k(a){var b=x._.focusList;a=a||0;if(!(1>b.length)){var c=x._.cur...
function n (line 571) | function n(c){if(x==CKEDITOR.dialog._.currentTop){var e=c.data.getKeystr...
function r (line 573) | function r(a){u?a.data.preventDefault(1):p&&a.data.stopPropagation()}
function a (line 635) | function a(a,c){CKEDITOR.tools.extend(this,c,{editor:a,id:"cke-"+CKEDITO...
function f (line 636) | function f(a){var c=this;this.editor=a;this.notifications=[];this.elemen...
function c (line 637) | function c(a){var b=new CKEDITOR.dom.element("div");b.setStyles({positio...
function a (line 645) | function a(){c.setStyle("left",w(r+f.width-n-q))}
function k (line 651) | function k(){var b=a.mode;b&&(b=this.modes[b]?void 0!==g[b]?g[b]:CKEDITO...
function a (line 657) | function a(a){function b(){for(var e=
function f (line 660) | function f(a){return a._.toolbarGroups||(a._.toolbarGroups=[{name:"docum...
function a (line 672) | function a(a,b,c){b.type||(b.type="auto");if(c&&!1===a.fire("beforePaste...
function f (line 673) | function f(b){function c(){var a=b.editable();if(CKEDITOR.plugins.clipbo...
function b (line 687) | function b(a){if(CKEDITOR.env.webkit){if(!a.match(/^[^<]*$/g)&&
function c (line 688) | function c(a,b){function c(a){return CKEDITOR.tools.repeat("\x3c/p\x3e\x...
function d (line 690) | function d(a){function b(){var a={},c;for(c in CKEDITOR.dtd)"$"!=c.charA...
function l (line 691) | function l(a,b,c){b=CKEDITOR.htmlParser.fragment.fromHtml(b);var d=new C...
function k (line 691) | function k(a,b){a.enterMode==CKEDITOR.ENTER_BR?b=b.replace(/(<\/p><p>)+/...
function g (line 692) | function g(a){a.data.preventDefault();a.data.$.dataTransfer.dropEffect="...
function h (line 692) | function h(b){var c=CKEDITOR.plugins.clipboard;b.on("contentDom",functio...
function g (line 705) | function g(a,c,d){var e=a;e.type==CKEDITOR.NODE_TEXT&&(e=a.getParent());...
function a (line 716) | function a(c){c=
function a (line 736) | function a(a,c,d,l,k){k=CKEDITOR.tools.genKey(c.getUniqueId(),d.getUniqu...
function k (line 737) | function k(){e.hide()}
function b (line 740) | function b(){delete this._.returnFocus;this.hide()}
function a (line 749) | function a(a){a.sort(function(a,b){return a.group<b.group?
function b (line 764) | function b(){d=!1}
function a (line 767) | function a(a,
function a (line 774) | function a(a,d){var l,k;d.on("refresh",function(a){var c=[f],d;for(d in ...
function a (line 779) | function a(a){function c(f){for(var h=l.startContainer,r=l.endContainer;...
function f (line 784) | function f(a){return a.type==CKEDITOR.NODE_ELEMENT&&a.is("li")}
function b (line 784) | function b(a){return c(a)&&d(a)}
function c (line 784) | function c(b){d.specificDefinition.apply(this,arguments);this.requiredCo...
function a (line 786) | function a(a,b,c,d){for(var e=CKEDITOR.plugins.list.listToArray(b.root,c...
function f (line 788) | function f(a,b,c){var d=b.contents,e=b.root.getDocument(),g=[];if(1==d.l...
function b (line 789) | function b(a,b,c){function d(c){if(!(!(l=
function c (line 791) | function c(a,b){this.name=a;this.context=this.type=b;this.allowedContent...
function d (line 791) | function d(a,b,c,d){for(var e,
function l (line 792) | function l(a){function b(c){var e=a[c?"getPrevious":"getNext"](q);e&&e.t...
function k (line 792) | function k(a){return a.type==CKEDITOR.NODE_ELEMENT&&(a.getName()in CKEDI...
function g (line 792) | function g(a,b,
function h (line 795) | function h(a){return(a=a.getLast(q))&&a.type==CKEDITOR.NODE_ELEMENT&&a.g...
function d (line 802) | function d(a){return m[a.root.getName()]&&!e(a.root,[CKEDITOR.NODE_COMME...
function e (line 802) | function e(a,b){return CKEDITOR.tools.array.filter(a.getChildren().toArr...
function g (line 802) | function g(a){var b=!0;if(0===a.getChildCount())return!1;
function a (line 812) | function a(a,b,c){c=a.config.forceEnterMode||c;if("wysiwyg"==a.mode){b||...
function f (line 812) | function f(a){a=a.getSelection().getRanges(!0);for(var b=
function b (line 813) | function b(a){var b=a.startContainer.getAscendant(function(a){return a.t...
function y (line 814) | function y(a){var b;if(a===CKEDITOR.ENTER_BR||-1===CKEDITOR.tools.indexO...
function a (line 822) | function a(a,b){var c={},d=[],l={nbsp:" ",shy:"",gt:"\x3e",
function b (line 823) | function b(a){return h[a]}
function c (line 824) | function c(a){return"force"!=d.entities_processNumerical&&k[a]?k[a]:"\x2...
function a (line 828) | function a(a){this.editor=a;this.loaders=
function f (line 829) | function f(a,c,f){var g=a.config.fileTools_defaultFileName;this.editor=a...
function b (line 830) | function b(a){var b=a.match(c)[1];a=a.replace(c,"");a=atob(a);var f=[],g...
function a (line 834) | function a(){"error"!=c.status&&(c.message=c.lang.filetools.networkError...
function b (line 834) | function b(){"abort"!=c.status&&
function a (line 838) | function a(a,b){var c=[];if(b)for(var d in b)c.push(d+"\x3d"+encodeURICo...
function f (line 838) | function f(b){return!b.match(/command=QuickUpload/)||
function b (line 839) | function b(a){a+="";return a.charAt(0).toUpperCase()+a.substr(1)}
function c (line 839) | function c(){var c=this.getDialog(),d=c.getParentEditor();d._.filebrowse...
function d (line 840) | function d(a){var b=new CKEDITOR.dom.element(a.$.form);b&&((a=b.$.elemen...
function l (line 840) | function l(){var a=this.getDialog();a.getParentEditor()._.filebrowserSe=...
function k (line 841) | function k(b,c,d){var e=d.params||{};e.CKEditor=b.name;e.CKEditorFuncNum...
function g (line 841) | function g(a,m,y,u){if(u&&u.length)for(var p,v=u.length;v--;)if(p=u[v],"...
function h (line 844) | function h(a){var b={};try{b=JSON.parse(a.sender.xhr.response)||{}}catch...
function m (line 844) | function m(a,b,c){if(-1!==c.indexOf(";")){c=c.split(";");for(var d=0;d<c...
function e (line 844) | function e(a,b){var c=this._.filebrowserSe.getDialog(),d=this._.filebrow...
function a (line 846) | function a(a){var d=a.config,l=a.fire("uiSpace",{space:"top",html:""}).h...
function d (line 864) | function d(){if(this.getState()!=CKEDITOR.TRISTATE_ON){var c=this.modes[...
function a (line 881) | function a(a,c){c||(c=a.getSelection().getSelectedElement());if(c&&c.is(...
function f (line 881) | function f(a){var c=a.getStyle("float");if("inherit"==c||"none"==c)c=0;c...
function c (line 883) | function c(c){var l=b.getCommand("justify"+c);if(l){if("left"==
function a (line 884) | function a(a,b){var d=c.exec(a),f=
function a (line 889) | function a(a){return a.replace(/'/g,"\\$\x26")}
function f (line 889) | function f(a){for(var b,c=a.length,d=[],e=0;e<c;e++)b=a.charCodeAt(e),d....
function b (line 890) | function b(b,c){var d=b.plugins.link,e=d.compiledProtectionFunction.para...
function c (line 890) | function c(a){a=a.config.emailProtection||"";var b;a&&"encode"!=a&&(b={}...
function a (line 891) | function a(b){return c.replace(/%1/g,"rtl"==b?"right":"left").replace(/%...
function a (line 910) | function a(a,b,c){return n(b)&&n(c)&&c.equals(b.getNext(function(a){retu...
function f (line 910) | function f(a){this.upper=a[0];this.lower=a[1];this.set.apply(this,a.slic...
function b (line 910) | function b(a){var b=a.element;if(b&&n(b)&&(b=b.getAscendant(a.triggers,!...
function c (line 911) | function c(a,b,c){t(a,b);t(a,c);a=b.size.bottom;c=c.size.top;return a&&c...
function d (line 911) | function d(a,b,c){return b=b[c?"getPrevious":"getNext"](function(b){retu...
function l (line 911) | function l(a,b,c){return a>b&&a<c}
function k (line 911) | function k(a,b){if(a.data("cke-editable"))return null;for(b||(a=a.getPar...
function g (line 911) | function g(a){var b=
function h (line 918) | function h(a,b,c){var d=new CKEDITOR.dom.range(a.doc),e=a.editor,g;I.ie&...
function m (line 919) | function m(a,c){return{canUndo:!0,modes:{wysiwyg:1},exec:function(){func...
function e (line 921) | function e(a,b){if(!b||b.type!=CKEDITOR.NODE_ELEMENT||!b.$)return!1;var ...
function n (line 921) | function n(a){return a&&a.type==CKEDITOR.NODE_ELEMENT&&a.$}
function q (line 921) | function q(a){if(!n(a))return!1;var b;(b=y(a))||(n(a)?(b={left:1,right:1...
function y (line 921) | function y(a){return!!{absolute:1,fixed:1}[a.getComputedStyle("position")]}
function u (line 921) | function u(a,b){return n(b)?b.is(a.triggers):
function p (line 922) | function p(a,b){if(!b)return!1;for(var c=b.getParents(1),d=c.length;d--;...
function v (line 922) | function v(a,b,c){b=b[c?"getLast":"getFirst"](function(b){return a.isRel...
function w (line 922) | function w(a){var b=a.editable,c=a.mouse,d=a.view,g=a.triggerOffset;x(a)...
function r (line 923) | function r(a){var c=
function z (line 925) | function z(a,b,c,d){for(var e=b.getDocumentPosition(),g={},f={},h={},k={...
function t (line 927) | function t(a,b,c){if(!n(b))return b.size=null;if(!b.size)b.size={};else ...
function x (line 927) | function x(a,b){a.view.editable=z(a,a.editable,b,!0)}
function A (line 927) | function A(a,b){a.view||(a.view={});var c=a.view;if(!(!b&&c&&c.date>new ...
function B (line 928) | function B(a,b,c,d){for(var e=d,g=d,h=0,k=!1,l=!1,m=a.view.pane.height,n...
function a (line 936) | function a(b,c){var d=b.$.elementFromPoint(c.x,c.y);return d&&d.nodeType...
function b (line 936) | function b(e){var g=
function d (line 938) | function d(a,b){return!(b&&b.type==CKEDITOR.NODE_TEXT||S(b)||q(b)||e(a,b...
function a (line 939) | function a(a){if(!a||a.type!=CKEDITOR.NODE_ELEMENT||"form"!=a.getName())...
function f (line 940) | function f(a,b){if(a&&a.type==CKEDITOR.NODE_ELEMENT&&"form"==a.getName()...
function b (line 940) | function b(b,c){var d=a(b),h={},m=b.$;c||(h["class"]=m.className||"",m.c...
function c (line 940) | function c(b,c){var d=a(b),h=b.$;"class"in c&&(h.className=c["class"]);"...
function d (line 940) | function d(a){if(!a.editable().isInline()){var b=
function f (line 941) | function f(){var b=m.getViewPaneSize();a.resize(b.width,b.height,null,!0)}
function a (line 947) | function a(a,b,c){var d=CKEDITOR.cleanWord;d?c():(a=CKEDITOR.getUrl(a.co...
function b (line 948) | function b(a){var b=CKEDITOR.plugins.pastefromword&&CKEDITOR.plugins.pas...
function f (line 958) | function f(b){var d=h.width,f=h.height,k=d+(b.data.$.screenX-g.x)*("rtl"...
function b (line 959) | function b(){CKEDITOR.document.removeListener("mousemove",f);CKEDITOR.do...
function d (line 1001) | function d(a){return new SCAYT.CKSCAYT(a,
function b (line 1017) | function b(){var a=d&&this.equals(CKEDITOR.document.getActive());this.hi...
function a (line 1028) | function a(a){return{editorFocus:!1,canUndo:!1,modes:{wysiwyg:1},exec:fu...
function f (line 1034) | function f(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,ref...
function a (line 1038) | function a(a,b){function c(a){return b?b.contains(a)&&a.getAscendant("ta...
function f (line 1040) | function f(b,c){for(var d=p(b)?b:a(b),e=d[0],g=e.getAscendant("table"),e...
function b (line 1041) | function b(c){if(c instanceof CKEDITOR.dom.selection){var d=c.getRanges(...
function c (line 1042) | function c(a){for(var b=
function d (line 1043) | function d(a,b){for(var d=b?Infinity:0,e=0;e<a.length;e++){var g=c(a[e])...
function l (line 1043) | function l(b,c){for(var e=p(b)?b:a(b),g=e[0].getAscendant("table"),f=d(e...
function k (line 1044) | function k(b){function c(a){var b,d,e;b=a.getRanges();if(1!==b.length)re...
function g (line 1046) | function g(a,b){var c=a.getStartElement().getAscendant({td:1,th:1},!0);i...
function h (line 1046) | function h(b){if(b instanceof CKEDITOR.dom.selection){var c=
function m (line 1048) | function m(a,b){var c=a.getDocument(),d=CKEDITOR.document;CKEDITOR.env.i...
function e (line 1048) | function e(a,b,c){a=a[b];
function n (line 1049) | function n(b,c,d){var g=a(b),f;if((c?1!=g.length:2>g.length)||(f=b.getCo...
function q (line 1052) | function q(b,c){var d=a(b);if(1<d.length)return!1;if(c)return!0;var d=d[...
function y (line 1053) | function y(b,c){var d=a(b);if(1<d.length)return!1;if(c)return!0;var d=d[...
function d (line 1054) | function d(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,ref...
function e (line 1054) | function e(a,
function a (line 1067) | function a(a){return CKEDITOR.plugins.widget&&CKEDITOR.plugins.widget.is...
function f (line 1067) | function f(a,
function b (line 1069) | function b(a){if(a)return a=a.clone(),a.enlarge(CKEDITOR.ENLARGE_ELEMENT...
function c (line 1069) | function c(a){return(a=a.editable().findOne(".cke_table-faked-selection"...
function d (line 1069) | function d(a,b){var c=a.editable().find(".cke_table-faked-selection"),d=...
function l (line 1070) | function l(a,b){var c=[],d,e;for(e=0;e<b.length;e++)d=a.createRange(),d....
function k (line 1070) | function k(a){var b=a.editable().find(".cke_table-faked-selection");1>b....
function g (line 1071) | function g(b,c,e){var g=r(b.getSelection(!0));c=c.is("table")?null:c;var...
function h (line 1071) | function h(a){var b=(a=a.editor||a.sender.editor)&&a.getSelection(),
function m (line 1073) | function m(a){return a.getAscendant("tr",!0).$.rowIndex}
function e (line 1073) | function e(b){function f(a,b){return a&&b?a.equals(b)||a.contains(b)||b....
function n (line 1075) | function n(a){var b=a.data.getTarget().getAscendant("table",!0);b&&b.has...
function q (line 1076) | function q(a,b){function c(a){a.cancel()}var d=a.getSelection(),e=d.crea...
function y (line 1077) | function y(a){var b=a.editor||a.sender.editor,
function u (line 1078) | function u(a){this._reset();a&&this.setSelectedCells(a)}
function p (line 1078) | function p(a,b,c){a.on("beforeCommandExec",function(c){-1!==CKEDITOR.too...
function b (line 1081) | function b(a){a=m(a);return a>=e&&a<=g}
function c (line 1082) | function c(a){return Math.max.apply(null,CKEDITOR.tools.array.map(a,func...
function d (line 1082) | function d(a){var b=e.createRange();b.selectNodeContents(a);b.select()}
function b (line 1087) | function b(a){var c=a.getEnclosedNode();c&&"function"===typeof c.is&&c.i...
function c (line 1087) | function c(b,d){if(!d.length)return null;var g=a.createRange(),f=CKEDITO...
function d (line 1094) | function d(a){e.enabled&&!1!==a.data.command.canUndo&&e.save()}
function f (line 1094) | function f(){e.enabled=c.readOnly?!1:"wysiwyg"==c.mode;e.onChange()}
function a (line 1112) | function a(a,b){CKEDITOR.tools.extend(this,{editor:a,editable:a.editable...
function f (line 1112) | function f(a,b){CKEDITOR.tools.extend(this,b,{editor:a},!0)}
function b (line 1112) | function b(a,b){var c=a.editable();CKEDITOR.tools.extend(this,{editor:a,...
function c (line 1115) | function c(a){var b;if(b=a&&a.type==CKEDITOR.NODE_ELEMENT)b=!(k[a.getCom...
function a (line 1118) | function a(b,c,d){var f=b.getUniqueId();f in d?d[f].type|=c:d[f]={elemen...
function a (line 1119) | function a(d,f,g,h,k){for(var l=0,v;k(g);){g+=h;if(25==++l)break;if(v=th...
function a (line 1121) | function a(b,d){var f=b.element[d===CKEDITOR.LINEUTILS_BEFORE?"getPrevio...
function a (line 1129) | function a(a){return a.getName&&!a.hasAttribute("data-cke-temp")}
function a (line 1136) | function a(a){this.editor=a;this.registered={};this.instances={};this.se...
function f (line 1137) | function f(a,b,c,d,e){var g=a.editor;CKEDITOR.tools.extend(this,d,{edito...
function b (line 1138) | function b(a,b,c){CKEDITOR.dom.element.call(this,b.$);this.editor=a;this...
function c (line 1139) | function c(a,b){a.addCommand(b.name,{exec:function(a,c){function d(){a.w...
function d (line 1141) | function d(a,b){function c(a,d){var e=b.upcast.split(","),f,g;for(g=0;g<...
function l (line 1142) | function l(a,b){a.focused=null;if(b.isInited()){var c=b.editor.checkDirt...
function k (line 1142) | function k(a){a=a.data;if("wysiwyg"==this.editor.mode){var b=this.editor...
function g (line 1143) | function g(a){if("undefined"!=typeof a.attributes&&a.attributes["data-wi...
function h (line 1144) | function h(a){return a.find(function(a){return 3===a.type},!0).shift()}
function m (line 1144) | function m(a){return a.find(function(a){return 3===a.type},!0).pop()}
function e (line 1144) | function e(a,b,c){if(!c.allowedContent&&!c.disallowedContent)return null...
function n (line 1145) | function n(a){var b=[],c=a._.upcasts,d=a._.upcastCallbacks;return{toBeWr...
function q (line 1146) | function q(a,b){return{tabindex:-1,contenteditable:"false","data-cke-wid...
function y (line 1146) | function y(a,b,c){if(a.type==CKEDITOR.NODE_ELEMENT){var d=CKEDITOR.dtd[a...
function u (line 1147) | function u(a,b){return"boolean"==typeof a.inline?a.inline:!!CKEDITOR.dtd...
function p (line 1147) | function p(a){return a.hasAttribute("data-cke-temp")}
function v (line 1147) | function v(a,b,c,d){var e=a.editor;e.fire("lockSnapshot");c?(d=c.data("c...
function w (line 1148) | function w(a){a.contextMenu&&a.contextMenu.addListener(function(b){if(b=...
function r (line 1148) | function r(a,b){return CKEDITOR.tools.trim(b)}
function z (line 1148) | function z(a){var b=a.editor,c=CKEDITOR.plugins.lineutils;b.on("dragstar...
function t (line 1151) | function t(a){var b=a.editor;b.on("contentDom",function(){var c=b.editab...
function x (line 1153) | function x(a){a.editor.on("key",function(b){var c=a.focused,d=a.widgetHo...
function A (line 1154) | function A(a){function b(c){a.focused&&E(a.focused,"cut"==c.name)}var c=...
function B (line 1154) | function B(a){var b=a.editor;b.on("selectionCheck",function(){a.fire("ch...
function C (line 1155) | function C(a){var b=a.editor,c={};b.on("toDataFormat",function(b){var d=...
function H (line 1158) | function H(a){var b=a.editor,c,d;b.on("toHtml",function(b){var d=n(a),e;...
function F (line 1160) | function F(a){var b=a.selected,c=[],d=b.slice(0),e=null;return{select:fu...
function I (line 1161) | function I(a,b,c){var d=0;b=L(b);var e=a.data.classes||{},f;if(b){for(e=
function J (line 1162) | function J(a){a.cancel()}
function E (line 1162) | function E(a,b){var c=a.editor,d=c.document,e=CKEDITOR.env.edge&&16<=CKE...
function L (line 1164) | function L(a){return(a=(a=a.getDefinition().attributes)&&a["class"])?a.s...
function G (line 1164) | function G(){var a=CKEDITOR.document.getActive(),b=this.editor,c=b.edita...
function D (line 1165) | function D(){CKEDITOR.env.gecko&&this.editor.unlockSelection();CKEDITOR....
function N (line 1165) | function N(a){var b=null;a.on("data",function(){var a=this.data.classes,...
function Q (line 1165) | function Q(a){a.on("data",function(){if(a.wrapper){var b=this.getLabel?t...
function O (line 1166) | function O(a){if(a.draggable){var b=a.editor,c=a.wrapper.getLast(f.isDom...
function K (line 1168) | function K(a){function b(){var c;for(p.reset();c=h.pop();)c.removeListen...
function W (line 1170) | function W(a){var b,c,d=a.editables;a.editables={};if(a.editables)for(b ...
function R (line 1170) | function R(a){if(a.mask){var b=a.wrapper.findOne(".cke_widget_mask");b||...
function Z (line 1170) | function Z(a){if(a.parts){var b={},c,d;for(d in a.parts)c=a.wrapper.find...
function ha (line 1171) | function ha(a,b){X(a);Z(a);W(a);R(a);O(a);N(a);Q(a);if(CKEDITOR.env.ie&&...
function X (line 1172) | function X(a){(a.wrapper=a.element.getParent()).setAttribute("data-cke-w...
function U (line 1172) | function U(a){a.element.data("cke-widget-data",encodeURIComponent(JSON.s...
function ba (line 1172) | function ba(){function a(){}function b(a,c,d){return d&&this.checkElemen...
function a (line 1181) | function a(c){return c.is(b)&&c.data("cke-widget-id")}
function a (line 1197) | function a(a,c,d){this.editor=
function f (line 1198) | function f(a){this._weight=a||1;this._doneWeight=0;this._isCanceled=!1}
function b (line 1207) | function b(){c=a._.uploadWidgetNotificaionAggregator;if(!c||c.isFinished...
function a (line 1209) | function a(a){9>=a&&(a="0"+a);return String(a)}
function f (line 1209) | function f(c){var d=new Date,d=[d.getFullYear(),d.getMonth()+1,d.getDate...
function a (line 1216) | function a(a){function b(a){var c=!1;e.attachListener(e,"keydown",functi...
function f (line 1221) | function f(a){function b(){var f;a.editable().attachListener(a,"selectio...
function b (line 1222) | function b(){var a=[];if(8<=CKEDITOR.document.$.documentMode){a.push("ht...
function f (line 1223) | function f(e){e&&e.removeListener();a.editable(new c(a,h.$.contentWindow...
FILE: xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/image/dialogs/image.js
function u (line 5) | function u(){var a=arguments,b=this.getContentElement("advanced","txtdlg...
function g (line 5) | function g(a){if(!v){v=1;var b=this.getDialog(),c=b.imageElement;if(c){t...
function c (line 8) | function c(a,b){var c=a.match(l);return c?("%"==
FILE: xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/link/dialogs/anchor.js
function e (line 5) | function e(b,a){return b.createFakeElement(b.document.createElement("a",...
FILE: xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/link/dialogs/link.js
function u (line 5) | function u(){var c=this.getDialog(),p=c._.editor,n=p.config.linkPhoneReg...
function p (line 5) | function p(a,b){var c=a.createRange();c.setStartBefore(b);c.setEndAfter(...
FILE: xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/table/dialogs/table.js
function w (line 5) | function w(a){for(var f=0,p=0,n=0,q,e=a.$.rows.length;n<e;n++){q=a.$.row...
function t (line 5) | function t(a){return function(){var f=this.getValue(),f=!!(CKEDITOR.dial...
function r (line 5) | function r(a,f){var p=function(e){return new CKEDITOR.dom.element(e,a.do...
FILE: xxl-job-admin/src/main/resources/static/adminlte/bower_components/fastclick/fastclick.js
function FastClick (line 23) | function FastClick(layer, options) {
FILE: xxl-job-admin/src/main/resources/static/biz/common/admin.setting.js
function store (line 411) | function store(name, val) {
function loadStore (line 422) | function loadStore(name) {
FILE: xxl-job-admin/src/main/resources/static/biz/common/admin.tab.js
function openDefaultTab (line 115) | function openDefaultTab() {
function openTab (line 155) | function openTab(tabSrc, tabName) {
function closeTab (line 237) | function closeTab() {
function activeMenuAndPath (line 330) | function activeMenuAndPath(tabSrc) {
function activeTab (line 353) | function activeTab() {
function scrollToTab (line 381) | function scrollToTab(element) {
function calSumWidth (line 415) | function calSumWidth(elements) {
function scrollTabLeft (line 428) | function scrollTabLeft() {
function scrollTabRight (line 466) | function scrollTabRight() {
function refreshTab (line 504) | function refreshTab() {
function closeOtherTabs (line 551) | function closeOtherTabs(){
function tabCloseCurrent (line 562) | function tabCloseCurrent() {
function tabCloseAll (line 569) | function tabCloseAll(){
FILE: xxl-job-admin/src/main/resources/static/biz/common/admin.table.js
function initSearch (line 76) | function initSearch(table, options){
function initReset (line 96) | function initReset(options) {
function initAdminTable (line 134) | function initAdminTable(table, options) {
function initAdminTreeTable (line 214) | function initAdminTreeTable(table, options) {
function initDeleteFun (line 290) | function initDeleteFun(table, options) {
function initAddFun (line 346) | function initAddFun(options) {
function initUpdateFun (line 411) | function initUpdateFun(table, options) {
FILE: xxl-job-admin/src/main/resources/static/plugins/codemirror/addon/hint/show-hint.js
function Completion (line 49) | function Completion(cm, options) {
function parseOptions (line 137) | function parseOptions(cm, pos, options) {
function getText (line 149) | function getText(completion) {
function buildKeyMap (line 154) | function buildKeyMap(completion, handle) {
function getHintElement (line 189) | function getHintElement(hintsElement, el) {
function Widget (line 196) | function Widget(completion, data) {
function applicableHelpers (line 352) | function applicableHelpers(cm, helpers) {
function fetchHints (line 360) | function fetchHints(hint, cm, options, callback) {
function resolveAutoHints (line 370) | function resolveAutoHints(cm, pos) {
FILE: xxl-job-admin/src/main/resources/static/plugins/codemirror/lib/codemirror.js
function classTest (line 50) | function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)...
function removeChildren (line 61) | function removeChildren(e) {
function removeChildrenAndAdd (line 67) | function removeChildrenAndAdd(parent, e) {
function elt (line 71) | function elt(tag, content, className, style) {
function eltP (line 80) | function eltP(tag, content, className, style) {
function contains (line 103) | function contains(parent, child) {
function activeElt (line 114) | function activeElt() {
function addClass (line 129) | function addClass(node, cls) {
function joinClasses (line 133) | function joinClasses(a, b) {
function bind (line 146) | function bind(f) {
function copyObj (line 151) | function copyObj(obj, target, overwrite) {
function countColumn (line 161) | function countColumn(string, end, tabSize, startIndex, startValue) {
function indexOf (line 182) | function indexOf(array, elt) {
function findColumn (line 200) | function findColumn(string, goal, tabSize) {
function spaceStr (line 215) | function spaceStr(n) {
function lst (line 221) | function lst(arr) { return arr[arr.length-1] }
function map (line 223) | function map(array, f) {
function insertSorted (line 229) | function insertSorted(array, value, score) {
function nothing (line 235) | function nothing() {}
function createObj (line 237) | function createObj(base, props) {
function isWordCharBasic (line 250) | function isWordCharBasic(ch) {
function isWordChar (line 254) | function isWordChar(ch, helper) {
function isEmpty (line 260) | function isEmpty(obj) {
function isExtendingChar (line 271) | function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendi...
function skipExtendingChars (line 274) | function skipExtendingChars(str, pos, dir) {
function findFirst (line 282) | function findFirst(pred, from, to) {
function Display (line 299) | function Display(place, doc, input) {
function getLine (line 399) | function getLine(doc, n) {
function getBetween (line 415) | function getBetween(doc, start, end) {
function getLines (line 427) | function getLines(doc, from, to) {
function updateLineHeight (line 435) | function updateLineHeight(line, height) {
function lineNo (line 442) | function lineNo(line) {
function lineAtHeight (line 456) | function lineAtHeight(chunk, h) {
function isLine (line 476) | function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}
function lineNumberFor (line 478) | function lineNumberFor(options, i) {
function Pos (line 483) | function Pos(line, ch, sticky) {
function cmp (line 494) | function cmp(a, b) { return a.line - b.line || a.ch - b.ch }
function equalCursorPos (line 496) | function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b)...
function copyPos (line 498) | function copyPos(x) {return Pos(x.line, x.ch)}
function maxPos (line 499) | function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }
function minPos (line 500) | function minPos(a, b) { return cmp(a, b) < 0 ? a : b }
function clipLine (line 504) | function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.fi...
function clipPos (line 505) | function clipPos(doc, pos) {
function clipToLen (line 511) | function clipToLen(pos, linelen) {
function clipPosArray (line 517) | function clipPosArray(doc, array) {
function seeReadOnlySpans (line 526) | function seeReadOnlySpans() {
function seeCollapsedSpans (line 530) | function seeCollapsedSpans() {
function MarkedSpan (line 536) | function MarkedSpan(marker, from, to) {
function getMarkedSpanFor (line 542) | function getMarkedSpanFor(spans, marker) {
function removeMarkedSpan (line 550) | function removeMarkedSpan(spans, span) {
function addMarkedSpan (line 557) | function addMarkedSpan(line, span) {
function markedSpansBefore (line 566) | function markedSpansBefore(old, startCh, isInsert) {
function markedSpansAfter (line 578) | function markedSpansAfter(old, endCh, isInsert) {
function stretchSpansOverChange (line 598) | function stretchSpansOverChange(doc, change) {
function clearEmptySpans (line 660) | function clearEmptySpans(spans) {
function removeReadOnlyRanges (line 671) | function removeReadOnlyRanges(doc, from, to) {
function detachMarkedSpans (line 700) | function detachMarkedSpans(line) {
function attachMarkedSpans (line 707) | function attachMarkedSpans(line, spans) {
function extraLeft (line 716) | function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }
function extraRight (line 717) | function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }
function compareCollapsedMarkers (line 722) | function compareCollapsedMarkers(a, b) {
function collapsedSpanAtSide (line 735) | function collapsedSpanAtSide(line, start) {
function collapsedSpanAtStart (line 745) | function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, t...
function collapsedSpanAtEnd (line 746) | function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, fal...
function collapsedSpanAround (line 748) | function collapsedSpanAround(line, ch) {
function conflictingCollapsedRange (line 761) | function conflictingCollapsedRange(doc, lineNo$$1, from, to, marker) {
function visualLine (line 781) | function visualLine(line) {
function visualLineEnd (line 788) | function visualLineEnd(line) {
function visualLineContinued (line 797) | function visualLineContinued(line) {
function visualLineNo (line 808) | function visualLineNo(doc, lineN) {
function visualLineEndNo (line 816) | function visualLineEndNo(doc, lineN) {
function lineIsHidden (line 828) | function lineIsHidden(doc, line) {
function lineIsHiddenInner (line 839) | function lineIsHiddenInner(doc, line, span) {
function heightAtLine (line 856) | function heightAtLine(lineObj) {
function lineLength (line 878) | function lineLength(line) {
function findMaxLine (line 897) | function findMaxLine(cm) {
function iterateBidiSections (line 913) | function iterateBidiSections(order, from, to, f) {
function getBidiPartAt (line 927) | function getBidiPartAt(order, ch, sticky) {
function charType (line 973) | function charType(code) {
function BidiSpan (line 986) | function BidiSpan(level, from, to) {
function getOrder (line 1118) | function getOrder(line, direction) {
function getHandlers (line 1142) | function getHandlers(emitter, type) {
function off (line 1146) | function off(emitter, type, f) {
function signal (line 1161) | function signal(emitter, type /*, values...*/) {
function signalDOMEvent (line 1171) | function signalDOMEvent(cm, e, override) {
function signalCursorActivity (line 1178) | function signalCursorActivity(cm) {
function hasHandler (line 1186) | function hasHandler(emitter, type) {
function eventMixin (line 1192) | function eventMixin(ctor) {
function e_preventDefault (line 1200) | function e_preventDefault(e) {
function e_stopPropagation (line 1204) | function e_stopPropagation(e) {
function e_defaultPrevented (line 1208) | function e_defaultPrevented(e) {
function e_stop (line 1211) | function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
function e_target (line 1213) | function e_target(e) {return e.target || e.srcElement}
function e_button (line 1214) | function e_button(e) {
function zeroWidthElement (line 1235) | function zeroWidthElement(measure) {
function hasBadBidiRects (line 1250) | function hasBadBidiRects(measure) {
function hasBadZoomedRects (line 1299) | function hasBadZoomedRects(measure) {
function defineMode (line 1313) | function defineMode(name, mode) {
function defineMIME (line 1319) | function defineMIME(mime, spec) {
function resolveMode (line 1325) | function resolveMode(spec) {
function getMode (line 1344) | function getMode(options, spec) {
function extendMode (line 1368) | function extendMode(mode, properties) {
function copyState (line 1373) | function copyState(mode, state) {
function innerMode (line 1387) | function innerMode(mode, state) {
function startState (line 1398) | function startState(mode, a1, a2) {
function highlightLine (line 1542) | function highlightLine(cm, line, context, forceToEnd) {
function getLineStyles (line 1587) | function getLineStyles(cm, line, updateFrontier) {
function getContextBefore (line 1603) | function getContextBefore(cm, n, precise) {
function processLine (line 1623) | function processLine(cm, text, context, startAt) {
function callBlankLine (line 1634) | function callBlankLine(mode, state) {
function readToken (line 1641) | function readToken(mode, stream, state, inner) {
function takeToken (line 1658) | function takeToken(cm, pos, precise, asArray) {
function extractLineClasses (line 1672) | function extractLineClasses(type, output) {
function runMode (line 1687) | function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {
function findStartLine (line 1731) | function findStartLine(cm, n, precise) {
function retreatFrontier (line 1748) | function retreatFrontier(doc, n) {
function updateLine (line 1781) | function updateLine(line, text, markedSpans, estimateHeight) {
function cleanUpLine (line 1793) | function cleanUpLine(line) {
function interpretTokenStyle (line 1802) | function interpretTokenStyle(style, options) {
function buildLineContent (line 1814) | function buildLineContent(cm, lineView) {
function defaultSpecialCharPlaceholder (line 1872) | function defaultSpecialCharPlaceholder(ch) {
function buildToken (line 1881) | function buildToken(builder, text, style, startStyle, endStyle, title, c...
function splitSpaces (line 1945) | function splitSpaces(text, trailingBefore) {
function buildTokenBadBidi (line 1960) | function buildTokenBadBidi(inner, order) {
function buildCollapsedSpan (line 1980) | function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
function insertLineContent (line 1998) | function insertLineContent(line, builder, styles) {
function LineView (line 2070) | function LineView(doc, line, lineN) {
function buildViewArray (line 2082) | function buildViewArray(cm, from, to) {
function pushOperation (line 2094) | function pushOperation(op) {
function fireCallbacksForOps (line 2105) | function fireCallbacksForOps(group) {
function finishOperation (line 2121) | function finishOperation(op, endCb) {
function signalLater (line 2141) | function signalLater(emitter, type /*, values...*/) {
function fireOrphanDelayed (line 2161) | function fireOrphanDelayed() {
function updateLineForChanges (line 2170) | function updateLineForChanges(cm, lineView, lineN, dims) {
function ensureLineWrapped (line 2183) | function ensureLineWrapped(lineView) {
function updateLineBackground (line 2194) | function updateLineBackground(cm, lineView) {
function getLineContent (line 2209) | function getLineContent(cm, lineView) {
function updateLineText (line 2222) | function updateLineText(cm, lineView) {
function updateLineClasses (line 2237) | function updateLineClasses(cm, lineView) {
function updateLineGutter (line 2247) | function updateLineGutter(cm, lineView, lineN, dims) {
function updateLineWidgets (line 2285) | function updateLineWidgets(cm, lineView, dims) {
function buildLineElement (line 2296) | function buildLineElement(cm, lineView, lineN, dims) {
function insertLineWidgets (line 2310) | function insertLineWidgets(cm, lineView, dims) {
function insertLineWidgetsFor (line 2316) | function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
function positionLineWidget (line 2332) | function positionLineWidget(widget, node, lineView, dims) {
function widgetHeight (line 2350) | function widgetHeight(widget) {
function eventInWidget (line 2366) | function eventInWidget(display, e) {
function paddingTop (line 2376) | function paddingTop(display) {return display.lineSpace.offsetTop}
function paddingVert (line 2377) | function paddingVert(display) {return display.mover.offsetHeight - displ...
function paddingH (line 2378) | function paddingH(display) {
function scrollGap (line 2387) | function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }
function displayWidth (line 2388) | function displayWidth(cm) {
function displayHeight (line 2391) | function displayHeight(cm) {
function ensureLineHeights (line 2399) | function ensureLineHeights(cm, lineView, rect) {
function mapFromLineView (line 2420) | function mapFromLineView(lineView, line, lineN) {
function updateExternalMeasurement (line 2433) | function updateExternalMeasurement(cm, line) {
function measureChar (line 2446) | function measureChar(cm, line, ch, bias) {
function findViewForLine (line 2451) | function findViewForLine(cm, lineN) {
function prepareMeasureForLine (line 2464) | function prepareMeasureForLine(cm, line) {
function measureCharPrepared (line 2486) | function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
function nodeAndOffsetInLineMap (line 2508) | function nodeAndOffsetInLineMap(map$$1, ch, bias) {
function getUsefulRect (line 2546) | function getUsefulRect(rects, bias) {
function measureCharInner (line 2556) | function measureCharInner(cm, prepared, ch, bias) {
function maybeUpdateRectForZooming (line 2609) | function maybeUpdateRectForZooming(measure, rect) {
function clearLineMeasurementCacheFor (line 2619) | function clearLineMeasurementCacheFor(lineView) {
function clearLineMeasurementCache (line 2628) | function clearLineMeasurementCache(cm) {
function clearCaches (line 2635) | function clearCaches(cm) {
function pageScrollX (line 2642) | function pageScrollX() {
function pageScrollY (line 2649) | function pageScrollY() {
function widgetTopHeight (line 2654) | function widgetTopHeight(lineObj) {
function intoCoordSystem (line 2665) | function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {
function fromCoordSystem (line 2687) | function fromCoordSystem(cm, coords, context) {
function charCoords (line 2704) | function charCoords(cm, pos, context, lineObj, bias) {
function cursorCoords (line 2725) | function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHei...
function estimateCoords (line 2756) | function estimateCoords(cm, pos) {
function PosWithInfo (line 2771) | function PosWithInfo(line, ch, sticky, outside, xRel) {
function coordsChar (line 2780) | function coordsChar(cm, x, y) {
function wrappedLineExtent (line 2800) | function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {
function wrappedLineExtentChar (line 2808) | function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {
function boxIsAfter (line 2816) | function boxIsAfter(box, x, y, left) {
function coordsCharInner (line 2820) | function coordsCharInner(cm, lineObj, lineNo$$1, x, y) {
function coordsBidiPart (line 2887) | function coordsBidiPart(cm, lineObj, lineNo$$1, preparedMeasure, order, ...
function coordsBidiPartWrapped (line 2911) | function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, or...
function textHeight (line 2946) | function textHeight(display) {
function charWidth (line 2966) | function charWidth(display) {
function getDimensions (line 2978) | function getDimensions(cm) {
function compensateForHScroll (line 2995) | function compensateForHScroll(display) {
function estimateHeight (line 3002) | function estimateHeight(cm) {
function estimateLineHeights (line 3020) | function estimateLineHeights(cm) {
function posFromMouse (line 3033) | function posFromMouse(cm, e, liberal, forRect) {
function findViewIndex (line 3051) | function findViewIndex(cm, n) {
function updateSelection (line 3062) | function updateSelection(cm) {
function prepareSelection (line 3066) | function prepareSelection(cm, primary) {
function drawSelectionCursor (line 3087) | function drawSelectionCursor(cm, head, output) {
function cmpCoords (line 3105) | function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }
function drawSelectionRange (line 3108) | function drawSelectionRange(cm, range$$1, output) {
function restartBlink (line 3201) | function restartBlink(cm) {
function ensureFocus (line 3214) | function ensureFocus(cm) {
function delayBlurEvent (line 3218) | function delayBlurEvent(cm) {
function onFocus (line 3226) | function onFocus(cm, e) {
function onBlur (line 3245) | function onBlur(cm, e) {
function updateHeightsInViewport (line 3259) | function updateHeightsInViewport(cm) {
function updateWidgetHeight (line 3286) | function updateWidgetHeight(line) {
function visibleLines (line 3296) | function visibleLines(display, doc, viewport) {
function alignHorizontally (line 3319) | function alignHorizontally(cm) {
function maybeUpdateLineNumberWidth (line 3342) | function maybeUpdateLineNumberWidth(cm) {
function maybeScrollWindow (line 3364) | function maybeScrollWindow(cm, rect) {
function scrollPosIntoView (line 3381) | function scrollPosIntoView(cm, pos, end, margin) {
function scrollIntoView (line 3415) | function scrollIntoView(cm, rect) {
function calculateScrollPos (line 3425) | function calculateScrollPos(cm, rect) {
function addToScrollTop (line 3455) | function addToScrollTop(cm, top) {
function ensureCursorVisible (line 3463) | function ensureCursorVisible(cm) {
function scrollToCoords (line 3469) | function scrollToCoords(cm, x, y) {
function scrollToRange (line 3475) | function scrollToRange(cm, range$$1) {
function resolveScrollToPos (line 3484) | function resolveScrollToPos(cm) {
function scrollToCoordsRange (line 3493) | function scrollToCoordsRange(cm, from, to, margin) {
function updateScrollTop (line 3505) | function updateScrollTop(cm, val) {
function setScrollTop (line 3513) | function setScrollTop(cm, val, forceScroll) {
function setScrollLeft (line 3523) | function setScrollLeft(cm, val, isScroller, forceScroll) {
function measureForScrollbars (line 3536) | function measureForScrollbars(cm) {
function maybeDisable (line 3628) | function maybeDisable() {
function updateScrollbars (line 3657) | function updateScrollbars(cm, measure) {
function updateScrollbarsInner (line 3671) | function updateScrollbarsInner(cm, measure) {
function initScrollbars (line 3693) | function initScrollbars(cm) {
function startOperation (line 3723) | function startOperation(cm) {
function endOperation (line 3745) | function endOperation(cm) {
function endOperations (line 3756) | function endOperations(group) {
function endOperation_R1 (line 3770) | function endOperation_R1(op) {
function endOperation_W1 (line 3783) | function endOperation_W1(op) {
function endOperation_R2 (line 3787) | function endOperation_R2(op) {
function endOperation_W2 (line 3808) | function endOperation_W2(op) {
function endOperation_finish (line 3833) | function endOperation_finish(op) {
function runInOp (line 3872) | function runInOp(cm, f) {
function operation (line 3879) | function operation(cm, f) {
function methodOp (line 3889) | function methodOp(f) {
function docMethodOp (line 3897) | function docMethodOp(f) {
function regChange (line 3913) | function regChange(cm, from, to, lendiff) {
function regLineChange (line 3978) | function regLineChange(cm, line, type) {
function resetView (line 3992) | function resetView(cm) {
function viewCuttingPoint (line 3998) | function viewCuttingPoint(cm, oldN, newN, dir) {
function adjustView (line 4025) | function adjustView(cm, from, to) {
function countDirtyView (line 4046) | function countDirtyView(cm) {
function startWorker (line 4057) | function startWorker(cm, time) {
function highlightWorker (line 4062) | function highlightWorker(cm) {
function maybeClipScrollbars (line 4132) | function maybeClipScrollbars(cm) {
function selectionSnapshot (line 4143) | function selectionSnapshot(cm) {
function restoreSelection (line 4160) | function restoreSelection(snapshot) {
function updateDisplayIfNeeded (line 4176) | function updateDisplayIfNeeded(cm, update) {
function postUpdateDisplay (line 4248) | function postUpdateDisplay(cm, update) {
function updateDisplaySimple (line 4278) | function updateDisplaySimple(cm, viewport) {
function patchDisplay (line 4295) | function patchDisplay(cm, updateNumbersFrom, dims) {
function updateGutterSpace (line 4336) | function updateGutterSpace(cm) {
function setDocumentHeight (line 4341) | function setDocumentHeight(cm, measure) {
function updateGutters (line 4349) | function updateGutters(cm) {
function setGuttersForLineNumbers (line 4367) | function setGuttersForLineNumbers(options) {
function wheelEventDelta (line 4398) | function wheelEventDelta(e) {
function wheelEventPixels (line 4405) | function wheelEventPixels(e) {
function onScrollWheel (line 4412) | function onScrollWheel(cm, e) {
function normalizeSelection (line 4551) | function normalizeSelection(cm, ranges, primIndex) {
function simpleSelection (line 4569) | function simpleSelection(anchor, head) {
function changeEnd (line 4575) | function changeEnd(change) {
function adjustForChange (line 4583) | function adjustForChange(pos, change) {
function computeSelAfterChange (line 4592) | function computeSelAfterChange(doc, change) {
function offsetPos (line 4602) | function offsetPos(pos, old, nw) {
function computeReplacedSel (line 4611) | function computeReplacedSel(doc, changes, hint) {
function loadMode (line 4632) | function loadMode(cm) {
function resetModeState (line 4637) | function resetModeState(cm) {
function isWholeLineUpdate (line 4653) | function isWholeLineUpdate(doc, change) {
function updateDoc (line 4659) | function updateDoc(doc, change, markedSpans, estimateHeight$$1) {
function linkedDocs (line 4711) | function linkedDocs(doc, f, sharedHistOnly) {
function attachDoc (line 4726) | function attachDoc(cm, doc) {
function setDirectionClass (line 4738) | function setDirectionClass(cm) {
function directionChanged (line 4742) | function directionChanged(cm) {
function History (line 4749) | function History(startGen) {
function historyChangeFromChange (line 4766) | function historyChangeFromChange(doc, change) {
function clearSelectionEvents (line 4775) | function clearSelectionEvents(array) {
function lastChangeEvent (line 4785) | function lastChangeEvent(hist, force) {
function addChangeToHistory (line 4800) | function addChangeToHistory(doc, change, selAfter, opId) {
function selectionEventCanBeMerged (line 4843) | function selectionEventCanBeMerged(doc, origin, prev, sel) {
function addSelectionToHistory (line 4856) | function addSelectionToHistory(doc, sel, opId, options) {
function pushSelectionToHistory (line 4878) | function pushSelectionToHistory(sel, dest) {
function attachLocalSpans (line 4885) | function attachLocalSpans(doc, change, from, to) {
function removeClearedSpans (line 4896) | function removeClearedSpans(spans) {
function getOldSpans (line 4907) | function getOldSpans(doc, change) {
function mergeOldSpans (line 4920) | function mergeOldSpans(doc, change) {
function copyHistoryArray (line 4944) | function copyHistoryArray(events, newGroup, instantiateSel) {
function extendRange (line 4976) | function extendRange(range, head, other, extend) {
function extendSelection (line 4995) | function extendSelection(doc, head, other, options, extend) {
function extendSelections (line 5002) | function extendSelections(doc, heads, options) {
function replaceOneSelection (line 5012) | function replaceOneSelection(doc, i, range, options) {
function setSimpleSelection (line 5019) | function setSimpleSelection(doc, anchor, head, options) {
function filterSelectionChange (line 5025) | function filterSelectionChange(doc, sel, options) {
function setSelectionReplaceHistory (line 5044) | function setSelectionReplaceHistory(doc, sel, options) {
function setSelection (line 5055) | function setSelection(doc, sel, options) {
function setSelectionNoUndo (line 5060) | function setSelectionNoUndo(doc, sel, options) {
function setSelectionInner (line 5072) | function setSelectionInner(doc, sel) {
function reCheckSelection (line 5086) | function reCheckSelection(doc) {
function skipAtomicInSelection (line 5092) | function skipAtomicInSelection(doc, sel, bias, mayClear) {
function skipAtomicInner (line 5107) | function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {
function skipAtomic (line 5140) | function skipAtomic(doc, pos, oldPos, bias, mayClear) {
function movePos (line 5153) | function movePos(doc, pos, dir, line) {
function selectAll (line 5165) | function selectAll(cm) {
function filterChange (line 5172) | function filterChange(doc, change, update) {
function makeChange (line 5196) | function makeChange(doc, change, ignoreReadOnly) {
function makeChangeInner (line 5218) | function makeChangeInner(doc, change) {
function makeChangeFromHistory (line 5236) | function makeChangeFromHistory(doc, type, allowSelectionOnly) {
function shiftDoc (line 5312) | function shiftDoc(doc, distance) {
function makeChangeSingleDoc (line 5328) | function makeChangeSingleDoc(doc, change, selAfter, spans) {
function makeChangeSingleDocInEditor (line 5361) | function makeChangeSingleDocInEditor(cm, change, spans) {
function replaceRange (line 5419) | function replaceRange(doc, code, from, to, origin) {
function rebaseHistSelSingle (line 5430) | function rebaseHistSelSingle(pos, from, to, diff) {
function rebaseHistArray (line 5446) | function rebaseHistArray(array, from, to, diff) {
function rebaseHist (line 5474) | function rebaseHist(hist, change) {
function changeLine (line 5483) | function changeLine(doc, handle, changeType, op) {
function LeafChunk (line 5505) | function LeafChunk(lines) {
function BranchChunk (line 5558) | function BranchChunk(children) {
function adjustScrollWhenAboveVisible (line 5721) | function adjustScrollWhenAboveVisible(cm, line, diff) {
function addLineWidget (line 5726) | function addLineWidget(doc, handle, node, options) {
function markText (line 5886) | function markText(doc, from, to, options, type) {
function markTextShared (line 5984) | function markTextShared(doc, from, to, options, type) {
function findSharedMarkers (line 5999) | function findSharedMarkers(doc) {
function copySharedMarkers (line 6003) | function copySharedMarkers(doc, markers) {
function detachSharedMarkers (line 6015) | function detachSharedMarkers(markers) {
function onDrop (line 6457) | function onDrop(e) {
function onDragStart (line 6517) | function onDragStart(cm, e) {
function onDragOver (line 6540) | function onDragOver(cm, e) {
function clearDragCursor (line 6552) | function clearDragCursor(cm) {
function forEachCodeMirror (line 6563) | function forEachCodeMirror(f) {
function ensureGlobalHandlers (line 6573) | function ensureGlobalHandlers() {
function registerGlobalHandlers (line 6578) | function registerGlobalHandlers() {
function onResize (line 6591) | function onResize(cm) {
function normalizeKeyName (line 6662) | function normalizeKeyName(name) {
function normalizeKeyMap (line 6686) | function normalizeKeyMap(keymap) {
function lookupKey (line 6713) | function lookupKey(key, map$$1, handle, context) {
function isModifierKey (line 6732) | function isModifierKey(value) {
function addModifierNames (line 6737) | function addModifierNames(name, event, noShift) {
function keyName (line 6747) | function keyName(event, noShift) {
function getKeyMap (line 6757) | function getKeyMap(val) {
function deleteNearSelection (line 6763) | function deleteNearSelection(cm, compute) {
function moveCharLogically (line 6786) | function moveCharLogically(line, ch, dir) {
function moveLogically (line 6791) | function moveLogically(line, start, dir) {
function endOfLine (line 6796) | function endOfLine(visually, cm, lineObj, lineNo, dir) {
function moveVisually (line 6823) | function moveVisually(cm, line, start, dir) {
function lineStart (line 7035) | function lineStart(cm, lineN) {
function lineEnd (line 7041) | function lineEnd(cm, lineN) {
function lineStartSmart (line 7047) | function lineStartSmart(cm, pos) {
function doHandleBinding (line 7060) | function doHandleBinding(cm, bound, dropShift) {
function lookupKeyForEditor (line 7080) | function lookupKeyForEditor(cm, name, handle) {
function dispatchKey (line 7094) | function dispatchKey(cm, name, e, handle) {
function dispatchKeyInner (line 7112) | function dispatchKeyInner(cm, name, e, handle) {
function handleKeyBinding (line 7129) | function handleKeyBinding(cm, e) {
function handleCharBinding (line 7148) | function handleCharBinding(cm, e, ch) {
function onKeyDown (line 7153) | function onKeyDown(e) {
function showCrossHair (line 7174) | function showCrossHair(cm) {
function onKeyUp (line 7189) | function onKeyUp(e) {
function onKeyPress (line 7194) | function onKeyPress(e) {
function clickRepeat (line 7221) | function clickRepeat(pos, button) {
function onMouseDown (line 7242) | function onMouseDown(e) {
function handleMappedButton (line 7279) | function handleMappedButton(cm, button, pos, repeat, event) {
function configureMouse (line 7299) | function configureMouse(cm, repeat, event) {
function leftButtonDown (line 7312) | function leftButtonDown(cm, pos, repeat, event) {
function leftButtonStartDrag (line 7330) | function leftButtonStartDrag(cm, event, pos, behavior) {
function rangeForUnit (line 7369) | function rangeForUnit(cm, pos, unit) {
function leftButtonSelect (line 7378) | function leftButtonSelect(cm, event, start, behavior) {
function bidiSimplify (line 7510) | function bidiSimplify(cm, range$$1) {
function gutterEvent (line 7545) | function gutterEvent(cm, e, type, prevent) {
function clickInGutter (line 7574) | function clickInGutter(cm, e) {
function onContextMenu (line 7583) | function onContextMenu(cm, e) {
function contextMenuInGutter (line 7589) | function contextMenuInGutter(cm, e) {
function themeChanged (line 7594) | function themeChanged(cm) {
function defineOptions (line 7605) | function defineOptions(CodeMirror) {
function guttersChanged (line 7741) | function guttersChanged(cm) {
function dragDropChanged (line 7747) | function dragDropChanged(cm, value, old) {
function wrappingChanged (line 7760) | function wrappingChanged(cm) {
function CodeMirror (line 7778) | function CodeMirror(place, options) {
function registerEventHandlers (line 7855) | function registerEventHandlers(cm) {
function indentLine (line 7970) | function indentLine(cm, n, how, aggressive) {
function setLastCopied (line 8034) | function setLastCopied(newLastCopied) {
function applyTextInput (line 8038) | function applyTextInput(cm, inserted, deleted, sel, origin) {
function handlePaste (line 8086) | function handlePaste(e, cm) {
function triggerElectric (line 8096) | function triggerElectric(cm, inserted) {
function copyableRanges (line 8120) | function copyableRanges(cm) {
function disableBrowserMagic (line 8131) | function disableBrowserMagic(field, spellcheck) {
function hiddenTextarea (line 8137) | function hiddenTextarea() {
function addEditorMethods (line 8160) | function addEditorMethods(CodeMirror) {
function findPosH (line 8608) | function findPosH(doc, pos, dir, unit, visually) {
function findPosV (line 8668) | function findPosV(cm, pos, dir, unit) {
function onCopyCut (line 8731) | function onCopyCut(e) {
function poll (line 8889) | function poll() {
function posToDOM (line 9055) | function posToDOM(cm, pos) {
function isInGutter (line 9071) | function isInGutter(node) {
function badPos (line 9077) | function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }
function domTextBetween (line 9079) | function domTextBetween(cm, from, to, fromLine, toLine) {
function domToPos (line 9132) | function domToPos(cm, node, offset) {
function locateNodeInLineView (line 9151) | function locateNodeInLineView(lineView, node, offset) {
function prepareCopyCut (line 9248) | function prepareCopyCut(e) {
function p (line 9388) | function p() {
function prepareSelectAllHack (line 9491) | function prepareSelectAllHack() {
function rehide (line 9504) | function rehide() {
function fromTextArea (line 9550) | function fromTextArea(textarea, options) {
function addLegacyProps (line 9607) | function addLegacyProps(CodeMirror) {
FILE: xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/clike/clike.js
function Context (line 14) | function Context(indented, column, type, info, align, prev) {
function pushContext (line 22) | function pushContext(state, col, type, info) {
function popContext (line 28) | function popContext(state) {
function typeBefore (line 35) | function typeBefore(stream, state, pos) {
function isTopScope (line 41) | function isTopScope(context) {
function tokenBase (line 75) | function tokenBase(stream, state) {
function tokenString (line 128) | function tokenString(quote) {
function tokenComment (line 141) | function tokenComment(stream, state) {
function maybeEOL (line 153) | function maybeEOL(stream, state) {
function words (line 257) | function words(str) {
function contains (line 262) | function contains(words, word) {
function cTypes (line 286) | function cTypes(identifier) {
function objCTypes (line 291) | function objCTypes(identifier) {
function cppHook (line 298) | function cppHook(stream, state) {
function pointerHook (line 313) | function pointerHook(_stream, state) {
function cIsReservedIdentifier (line 320) | function cIsReservedIdentifier(token) {
function cpp14Literal (line 326) | function cpp14Literal(stream) {
function cpp11StringHook (line 331) | function cpp11StringHook(stream, state) {
function cppLooksLikeConstructor (line 355) | function cppLooksLikeConstructor(word) {
function tokenAtString (line 361) | function tokenAtString(stream, state) {
function tokenRawString (line 374) | function tokenRawString(stream, state) {
function def (line 385) | function def(mimes, mode) {
function tokenTripleString (line 520) | function tokenTripleString(stream, state) {
function tokenNestedComment (line 532) | function tokenNestedComment(depth) {
function tokenKotlinString (line 618) | function tokenKotlinString(tripleString){
function tokenCeylonString (line 800) | function tokenCeylonString(type) {
FILE: xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/javascript/javascript.js
function kw (line 25) | function kw(type) {return {type: type, style: "keyword"};}
function readRegexp (line 46) | function readRegexp(stream) {
function ret (line 61) | function ret(tp, style, cont) {
function tokenBase (line 65) | function tokenBase(stream, state) {
function tokenString (line 129) | function tokenString(quote) {
function tokenComment (line 145) | function tokenComment(stream, state) {
function tokenQuasi (line 157) | function tokenQuasi(stream, state) {
function findFatArrow (line 177) | function findFatArrow(stream, state) {
function JSLexical (line 212) | function JSLexical(indented, column, type, align, prev, info) {
function inScope (line 221) | function inScope(state, varname) {
function parseJS (line 230) | function parseJS(state, style, type, content, stream) {
function pass (line 254) | function pass() {
function cont (line 257) | function cont() {
function inList (line 261) | function inList(name, list) {
function register (line 265) | function register(varname) {
function registerVarScoped (line 285) | function registerVarScoped(varname, context) {
function isModifier (line 300) | function isModifier(name) {
function Context (line 306) | function Context(prev, vars, block) { this.prev = prev; this.vars = vars...
function Var (line 307) | function Var(name, next) { this.name = name; this.next = next }
function pushcontext (line 310) | function pushcontext() {
function pushblockcontext (line 314) | function pushblockcontext() {
function popcontext (line 318) | function popcontext() {
function pushlex (line 323) | function pushlex(type, info) {
function poplex (line 334) | function poplex() {
function expect (line 344) | function expect(wanted) {
function statement (line 353) | function statement(type, value) {
function maybeCatchBinding (line 399) | function maybeCatchBinding(type) {
function expression (line 402) | function expression(type, value) {
function expressionNoComma (line 405) | function expressionNoComma(type, value) {
function parenExpr (line 408) | function parenExpr(type) {
function expressionInner (line 412) | function expressionInner(type, value, noComma) {
function maybeexpression (line 433) | function maybeexpression(type) {
function maybeoperatorComma (line 438) | function maybeoperatorComma(type, value) {
function maybeoperatorNoComma (line 442) | function maybeoperatorNoComma(type, value, noComma) {
function quasi (line 465) | function quasi(type, value) {
function continueQuasi (line 470) | function continueQuasi(type) {
function arrowBody (line 477) | function arrowBody(type) {
function arrowBodyNoComma (line 481) | function arrowBodyNoComma(type) {
function maybeTarget (line 485) | function maybeTarget(noComma) {
function target (line 492) | function target(_, value) {
function targetNoComma (line 495) | function targetNoComma(_, value) {
function maybelabel (line 498) | function maybelabel(type) {
function property (line 502) | function property(type) {
function objprop (line 505) | function objprop(type, value) {
function getterSetter (line 535) | function getterSetter(type) {
function afterprop (line 540) | function afterprop(type) {
function commasep (line 544) | function commasep(what, end, sep) {
function contCommasep (line 562) | function contCommasep(what, end, info) {
function block (line 567) | function block(type) {
function maybetype (line 571) | function maybetype(type, value) {
function mayberettype (line 577) | function mayberettype(type) {
function isKW (line 583) | function isKW(_, value) {
function typeexpr (line 589) | function typeexpr(type, value) {
function maybeReturnType (line 604) | function maybeReturnType(type) {
function typeprop (line 607) | function typeprop(type, value) {
function typearg (line 619) | function typearg(type, value) {
function afterType (line 624) | function afterType(type, value) {
function maybeTypeArgs (line 630) | function maybeTypeArgs(_, value) {
function typeparam (line 633) | function typeparam() {
function maybeTypeDefault (line 636) | function maybeTypeDefault(_, value) {
function vardef (line 639) | function vardef(_, value) {
function pattern (line 643) | function pattern(type, value) {
function proppattern (line 650) | function proppattern(type, value) {
function eltpattern (line 660) | function eltpattern() {
function maybeAssign (line 663) | function maybeAssign(_type, value) {
function vardefCont (line 666) | function vardefCont(type) {
function maybeelse (line 669) | function maybeelse(type, value) {
function forspec (line 672) | function forspec(type, value) {
function forspec1 (line 676) | function forspec1(type) {
function formaybeinof (line 682) | function formaybeinof(_type, value) {
function forspec2 (line 686) | function forspec2(type, value) {
function forspec3 (line 691) | function forspec3(type) {
function functiondef (line 694) | function functiondef(type, value) {
function funarg (line 700) | function funarg(type, value) {
function classExpression (line 706) | function classExpression(type, value) {
function className (line 711) | function className(type, value) {
function classNameAfter (line 714) | function classNameAfter(type, value) {
function classBody (line 722) | function classBody(type, value) {
function classfield (line 744) | function classfield(type, value) {
function afterExport (line 750) | function afterExport(type, value) {
function exportField (line 756) | function exportField(type, value) {
function afterImport (line 760) | function afterImport(type) {
function importSpec (line 765) | function importSpec(type, value) {
function maybeMoreImports (line 771) | function maybeMoreImports(type) {
function maybeAs (line 774) | function maybeAs(_type, value) {
function maybeFrom (line 777) | function maybeFrom(_type, value) {
function arrayLiteral (line 780) | function arrayLiteral(type) {
function enumdef (line 784) | function enumdef() {
function enummember (line 787) | function enummember() {
function isContinuedStatement (line 791) | function isContinuedStatement(state, textAfter) {
function expressionAllowed (line 797) | function expressionAllowed(stream, state, backUp) {
FILE: xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/php/php.js
function keywords (line 14) | function keywords(str) {
function matchSequence (line 21) | function matchSequence(list, end, escapes) {
function phpString (line 33) | function phpString(closing, escapes) {
function phpString_ (line 36) | function phpString_(stream, state, closing, escapes) {
function dispatch (line 157) | function dispatch(stream, state) {
FILE: xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/powershell/powershell.js
function buildRegexp (line 16) | function buildRegexp(patterns, options) {
function tokenBase (line 162) | function tokenBase(stream, state) {
function tokenSingleQuoteString (line 237) | function tokenSingleQuoteString(stream, state) {
function tokenDoubleQuoteString (line 251) | function tokenDoubleQuoteString(stream, state) {
function tokenStringInterpolation (line 274) | function tokenStringInterpolation(stream, state) {
function tokenMultiStringReturn (line 278) | function tokenMultiStringReturn(stream, state) {
function tokenHereStringInterpolation (line 284) | function tokenHereStringInterpolation(stream, state) {
function tokenInterpolation (line 288) | function tokenInterpolation(stream, state, parentTokenize) {
function tokenComment (line 312) | function tokenComment(stream, state) {
function tokenVariable (line 324) | function tokenVariable(stream, state) {
function tokenVariableWithBraces (line 339) | function tokenVariableWithBraces(stream, state) {
function tokenMultiString (line 350) | function tokenMultiString(stream, state) {
FILE: xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/python/python.js
function wordRegexp (line 14) | function wordRegexp(words) {
function top (line 37) | function top(state) {
function tokenBase (line 78) | function tokenBase(stream, state) {
function tokenBaseInner (line 101) | function tokenBaseInner(stream, state) {
function formatStringFactory (line 183) | function formatStringFactory(delimiter, tokenOuter) {
function tokenStringFactory (line 254) | function tokenStringFactory(delimiter) {
function pushPyScope (line 287) | function pushPyScope(state) {
function pushBracketScope (line 294) | function pushBracketScope(stream, state, type) {
function dedent (line 301) | function dedent(stream, state) {
function tokenLexer (line 310) | function tokenLexer(stream, state) {
FILE: xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/shell/shell.js
function define (line 17) | function define(style, dict) {
function tokenBase (line 39) | function tokenBase(stream, state) {
function tokenString (line 85) | function tokenString(quote, style) {
function tokenStringStart (line 112) | function tokenStringStart(quote, style) {
function tokenize (line 132) | function tokenize(stream, state) {
FILE: xxl-job-admin/src/main/resources/static/plugins/fullscreen/jquery.fullscreen.js
function fullScreen (line 22) | function fullScreen(state)
function toggleFullScreen (line 110) | function toggleFullScreen()
function fullScreenChangeHandler (line 123) | function fullScreenChangeHandler(event)
function fullScreenErrorHandler (line 135) | function fullScreenErrorHandler(event)
function installFullScreenHandlers (line 143) | function installFullScreenHandlers()
FILE: xxl-job-admin/src/main/resources/static/plugins/layer/layer.js
function e (line 2) | function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}
function o (line 2) | function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onlo...
FILE: xxl-job-admin/src/main/resources/static/plugins/nprogress/nprogress.js
function clamp (line 300) | function clamp(n, min, max) {
function toBarPerc (line 311) | function toBarPerc(n) {
function barPositionCSS (line 321) | function barPositionCSS(n, speed, ease) {
function next (line 344) | function next() {
function camelCase (line 369) | function camelCase(string) {
function getVendorProp (line 375) | function getVendorProp(name) {
function getStyleProp (line 390) | function getStyleProp(name) {
function applyCss (line 395) | function applyCss(element, prop, value) {
function hasClass (line 420) | function hasClass(element, name) {
function addClass (line 429) | function addClass(element, name) {
function removeClass (line 443) | function removeClass(element, name) {
function classList (line 462) | function classList(element) {
function removeElement (line 470) | function removeElement(element) {
FILE: xxl-job-admin/src/main/resources/static/plugins/zTree/js/jquery.ztree.core.js
function _do (line 711) | function _do(_node) {
function makeRange (line 1470) | function makeRange(start, length) {
function coverRange (line 1474) | function coverRange(inner, outer) {
function makePoint (line 1487) | function makePoint(x, y) {
function absolute (line 1497) | function absolute(elem, pt) {
function addCallback (line 1804) | function addCallback() {
function showNodeFocus (line 1855) | function showNodeFocus() {
function showNodeFocus (line 1977) | function showNodeFocus() {
FILE: xxl-job-admin/src/test/java/com/xxl/job/admin/controller/AbstractSpringMvcTest.java
class AbstractSpringMvcTest (line 10) | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
method setup (line 17) | @BeforeEach
FILE: xxl-job-admin/src/test/java/com/xxl/job/admin/controller/JobInfoControllerTest.java
class JobInfoControllerTest (line 16) | public class JobInfoControllerTest extends AbstractSpringMvcTest {
method login (line 21) | @BeforeEach
method testAdd (line 32) | @Test
FILE: xxl-job-admin/src/test/java/com/xxl/job/admin/core/util/CronExpressionTest.java
class CronExpressionTest (line 10) | public class CronExpressionTest {
method shouldWriteValueAsString (line 12) | @Test
FILE: xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobGroupMapperTest.java
class XxlJobGroupMapperTest (line 11) | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
method test (line 17) | @Test
FILE: xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobInfoMapperTest.java
class XxlJobInfoMapperTest (line 15) | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
method pageList (line 22) | @Test
method save_load (line 33) | @Test
FILE: xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobLogGlueMapperTest.java
class XxlJobLogGlueMapperTest (line 11) | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
method test (line 17) | @Test
FILE: xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobLogMapperTest.java
class XxlJobLogMapperTest (line 11) | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
method test (line 17) | @Test
FILE: xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobLogReportMapperTest.java
class XxlJobLogReportMapperTest (line 13) | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
method test (line 20) | @Test
FILE: xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobRegistryMapperTest.java
class XxlJobRegistryMapperTest (line 14) | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
method test (line 20) | @Test
method test2 (line 33) | @Test
FILE: xxl-job-admin/src/test/java/com/xxl/job/admin/schedule/JobScheduleTest.java
class JobScheduleTest (line 15) | @SpringBootTest
method test (line 19) | @Test
method lockTest (line 33) | private void lockTest(String threadName) {
FILE: xxl-job-admin/src/test/java/com/xxl/job/admin/util/I18nUtilTest.java
class I18nUtilTest (line 13) | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
method test (line 17) | @Test
FILE: xxl-job-admin/src/test/java/com/xxl/job/openapi/AdminBizTest.java
class AdminBizTest (line 25) | public class AdminBizTest {
method buildClient (line 31) | private AdminBiz buildClient(){
method callback (line 41) | @Test
method registry (line 60) | @Test
method registryRemove (line 75) | @Test
method jobManage (line 88) | @Test
FILE: xxl-job-admin/src/test/java/com/xxl/job/openapi/ExecutorBizTest.java
class ExecutorBizTest (line 20) | public class ExecutorBizTest {
method buildClient (line 26) | private ExecutorBiz buildClient(){
method beat (line 34) | @Test
method idleBeat (line 47) | @Test
method run (line 63) | @Test
method kill (line 87) | @Test
method log (line 103) | @Test
FILE: xxl-job-core/src/main/java/com/xxl/job/core/constant/Const.java
class Const (line 6) | public class Const {
FILE: xxl-job-core/src/main/java/com/xxl/job/core/constant/ExecutorBlockStrategyEnum.java
type ExecutorBlockStrategyEnum (line 6) | public enum ExecutorBlockStrategyEnum {
method ExecutorBlockStrategyEnum (line 14) | private ExecutorBlockStrategyEnum (String title) {
method setTitle (line 18) | public void setTitle(String title) {
method getTitle (line 21) | public String getTitle() {
method match (line 25) | public static ExecutorBlockStrategyEnum match(String name, ExecutorBlo...
FILE: xxl-job-core/src/main/java/com/xxl/job/core/constant/RegistType.java
type RegistType (line 6) | public enum RegistType{
FILE: xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobContext.java
class XxlJobContext (line 9) | public class XxlJobContext {
method XxlJobContext (line 74) | public XxlJobContext(long jobId,
method getJobId (line 92) | public long getJobId() {
method getJobParam (line 96) | public String getJobParam() {
method getLogId (line 100) | public long getLogId() {
method getLogDateTime (line 104) | public long getLogDateTime() {
method getLogFileName (line 108) | public String getLogFileName() {
method getShardIndex (line 112) | public int getShardIndex() {
method getShardTotal (line 116) | public int getShardTotal() {
method setHandleCode (line 120) | public void setHandleCode(int handleCode) {
method getHandleCode (line 124) | public int getHandleCode() {
method setHandleMsg (line 128) | public void setHandleMsg(String handleMsg) {
method getHandleMsg (line 132) | public String getHandleMsg() {
method setXxlJobContext (line 146) | public static void setXxlJobContext(XxlJobContext xxlJobContext){
method getXxlJobContext (line 153) | public static XxlJobContext getXxlJobContext(){
FILE: xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobHelper.java
class XxlJobHelper (line 19) | public class XxlJobHelper {
method getJobId (line 28) | public static long getJobId() {
method getJobParam (line 42) | public static String getJobParam() {
method getLogId (line 58) | public static long getLogId() {
method getLogDateTime (line 72) | public static long getLogDateTime() {
method getLogFileName (line 86) | public static String getLogFileName() {
method getShardIndex (line 102) | public static int getShardIndex() {
method getShardTotal (line 116) | public static int getShardTotal() {
method log (line 135) | public static boolean log(String appendLogPattern, Object ... appendLo...
method log (line 155) | public static boolean log(Throwable e) {
method logDetail (line 171) | private static boolean logDetail(StackTraceElement callInfo, String ap...
method handleSuccess (line 206) | public static boolean handleSuccess(){
method handleSuccess (line 216) | public static boolean handleSuccess(String handleMsg) {
method handleFail (line 225) | public static boolean handleFail(){
method handleFail (line 235) | public static boolean handleFail(String handleMsg) {
method handleTimeout (line 244) | public static boolean handleTimeout(){
method handleTimeout (line 254) | public static boolean handleTimeout(String handleMsg){
method handleResult (line 268) | public static boolean handleResult(int handleCode, String handleMsg) {
FILE: xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java
class XxlJobExecutor (line 30) | public class XxlJobExecutor {
method setAdminAddresses (line 50) | public void setAdminAddresses(String adminAddresses) {
method setAccessToken (line 53) | public void setAccessToken(String accessToken) {
method setTimeout (line 56) | public void setTimeout(int timeout) {
method setEnabled (line 59) | public void setEnabled(Boolean enabled) {
method setAppname (line 62) | public void setAppname(String appname) {
method setAddress (line 65) | public void setAddress(String address) {
method setIp (line 68) | public void setIp(String ip) {
method setPort (line 71) | public void setPort(int port) {
method setLogPath (line 74) | public void setLogPath(String logPath) {
method setLogRetentionDays (line 77) | public void setLogRetentionDays(int logRetentionDays) {
method start (line 83) | public void start() throws Exception {
method destroy (line 108) | public void destroy(){
method initAdminBizList (line 150) | private void initAdminBizList(String adminAddresses, String accessToke...
method getAdminBizList (line 184) | public static List<AdminBiz> getAdminBizList(){
method initEmbedServer (line 191) | private void initEmbedServer(String address, String ip, int port, Stri...
method stopEmbedServer (line 214) | private void stopEmbedServer() {
method loadJobHandler (line 228) | public static IJobHandler loadJobHandler(String name){
method registryJobHandler (line 231) | public static IJobHandler registryJobHandler(String name, IJobHandler ...
method registryJobHandler (line 235) | protected void registryJobHandler(XxlJob xxlJob, Object bean, Method e...
method registJobThread (line 292) | public static JobThread registJobThread(int jobId, IJobHandler handler...
method removeJobThread (line 306) | public static JobThread removeJobThread(int jobId, String removeOldRea...
method loadJobThread (line 317) | public static JobThread loadJobThread(int jobId){
FILE: xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSimpleExecutor.java
class XxlJobSimpleExecutor (line 18) | public class XxlJobSimpleExecutor extends XxlJobExecutor {
method getXxlJobBeanList (line 23) | public List<Object> getXxlJobBeanList() {
method setXxlJobBeanList (line 26) | public void setXxlJobBeanList(List<Object> xxlJobBeanList) {
method start (line 31) | @Override
method destroy (line 45) | @Override
method initJobHandlerMethodRepository (line 51) | private void initJobHandlerMethodRepository(List<Object> xxlJobBeanLis...
FILE: xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java
class XxlJobSpringExecutor (line 29) | public class XxlJobSpringExecutor extends XxlJobExecutor implements Appl...
method setExcludedPackage (line 39) | public void setExcludedPackage(String excludedPackage) {
method afterSingletonsInstantiated (line 49) | @Override
method destroy (line 69) | @Override
method scanJobHandlerMethod (line 80) | private void scanJobHandlerMethod(ApplicationContext applicationContex...
method isExcluded (line 172) | private boolean isExcluded(List<String> excludedPackageList, String be...
method setApplicationContext (line 196) | @Override
method getApplicationContext (line 201) | public static ApplicationContext getApplicationContext() {
FILE: xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueFactory.java
class GlueFactory (line 17) | public class GlueFactory {
method getInstance (line 21) | public static GlueFactory getInstance(){
method refreshInstance (line 30) | public static void refreshInstance(int type){
method loadNewInstance (line 52) | public IJobHandler loadNewInstance(String codeSource) throws Exception{
method getCodeSourceClass (line 70) | private Class<?> getCodeSourceClass(String codeSource){
method injectService (line 92) | public void injectService(Object instance) {
FILE: xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueTypeEnum.java
type GlueTypeEnum (line 6) | public enum GlueTypeEnum {
method GlueTypeEnum (line 22) | private GlueTypeEnum(String desc, boolean isScript, String cmd, String...
method getDesc (line 29) | public String getDesc() {
method isScript (line 33) | public boolean isScript() {
method getCmd (line 37) | public String getCmd() {
method getSuffix (line 41) | public String getSuffix() {
method match (line 45) | public static GlueTypeEnum match(String name){
FILE: xxl-job-core/src/main/java/com/xxl/job/core/glue/impl/SpringGlueFactory.java
class SpringGlueFactory (line 18) | public class SpringGlueFactory extends GlueFactory {
method injectService (line 26) | @Override
FILE: xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java
class IJobHandler (line 8) | public abstract class IJobHandler {
method execute (line 16) | public abstract void execute() throws Exception;
method init (line 25) | public void init() throws Exception {
method destroy (line 33) | public void destroy() throws Exception {
FILE: xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/GlueJobHandler.java
class GlueJobHandler (line 11) | public class GlueJobHandler extends IJobHandler {
method GlueJobHandler (line 15) | public GlueJobHandler(IJobHandler jobHandler, long glueUpdatetime) {
method getGlueUpdatetime (line 19) | public long getGlueUpdatetime() {
method execute (line 23) | @Override
method init (line 29) | @Override
method destroy (line 34) | @Override
FILE: xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/MethodJobHandler.java
class MethodJobHandler (line 10) | public class MethodJobHandler extends IJobHandler {
method MethodJobHandler (line 17) | public MethodJobHandler(Object target, Method method, Method initMetho...
method execute (line 25) | @Override
method init (line 35) | @Override
method destroy (line 42) | @Override
method toString (line 49) | @Override
FILE: xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java
class ScriptJobHandler (line 15) | public class ScriptJobHandler extends IJobHandler {
method ScriptJobHandler (line 22) | public ScriptJobHandler(int jobId, long glueUpdatetime, String gluesou...
method getGlueUpdatetime (line 43) | public long getGlueUpdatetime() {
method execute (line 47) | @Override
FILE: xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java
class XxlJobFileAppender (line 22) | public class XxlJobFileAppender {
method initLogPath (line 39) | public static void initLogPath(String logPath) throws IOException {
method getLogPath (line 54) | public static String getLogPath() {
method getGlueSrcPath (line 57) | public static String getGlueSrcPath() {
method getCallbackLogPath (line 60) | public static String getCallbackLogPath() {
method makeLogFileName (line 70) | public static String makeLogFileName(Date triggerDate, long logId) {
method appendLog (line 93) | public static void appendLog(String logFileName, String appendLog) {
method readLog (line 115) | public static LogResult readLog(String logFileName, final int fromLine...
FILE: xxl-job-core/src/main/java/com/xxl/job/core/openapi/AdminBiz.java
type AdminBiz (line 12) | public interface AdminBiz {
method callback (line 23) | public Response<String> callback(List<CallbackRequest> callbackRequest...
method registry (line 34) | public Response<String> registry(RegistryRequest registryRequest);
method registryRemove (line 42) | public Response<String> registryRemove(RegistryRequest registryRequest);
FILE: xxl-job-core/src/main/java/com/xxl/job/core/openapi/ExecutorBiz.java
type ExecutorBiz (line 9) | public interface ExecutorBiz {
method beat (line 15) | public Response<String> beat();
method idleBeat (line 23) | public Response<String> idleBeat(IdleBeatRequest idleBeatRequest);
method run (line 30) | public Response<String> run(TriggerRequest triggerRequest);
method kill (line 37) | public Response<String> kill(KillRequest killRequest);
method log (line 44) | public Response<LogResult> log(LogRequest logRequest);
FILE: xxl-job-core/src/main/java/com/xxl/job/core/openapi/impl/ExecutorBizImpl.java
class ExecutorBizImpl (line 24) | public class ExecutorBizImpl implements ExecutorBiz {
method beat (line 27) | @Override
method idleBeat (line 32) | @Override
method run (line 48) | @Override
method kill (line 152) | @Override
method log (line 164) | @Override
FILE: xxl-job-core/src/main/java/com/xxl/job/core/openapi/model/CallbackRequest.java
class CallbackRequest (line 8) | public class CallbackRequest implements Serializable {
method CallbackRequest (line 17) | public CallbackRequest(){}
method CallbackRequest (line 18) | public CallbackRequest(long logId, long logDateTim, int handleCode, St...
method getLogId (line 25) | public long getLogId() {
method setLogId (line 29) | public void setLogId(long logId) {
method getLogDateTim (line 33) | public long getLogDateTim() {
method setLogDateTim (line 37) | public void setLogDateTim(long logDateTim) {
method getHandleCode (line 41) | public int getHandleCode() {
method setHandleCode (line 45) | public void setHandleCode(int handleCode) {
method getHandleMsg (line 49) | public String getHandleMsg() {
method setHandleMsg (line 53) | public void setHandleMsg(String handleMsg) {
method toString (line 57) | @Override
FILE: xxl-job-core/src/main/java/com/xxl/job/core/openapi/model/IdleBeatRequest.java
class IdleBeatRequest (line 8) | public class IdleBeatRequest implements Serializable {
method IdleBeatRequest (line 11) | public IdleBeatRequest() {
method IdleBeatRequest (line 13) | public IdleBeatRequest(int jobId) {
method getJobId (line 20) | public int getJobId() {
method setJobId (line 24) | public void setJobId(int jobId) {
FILE: xxl-job-core/src/main/java/com/xxl/job/core/openapi/model/KillRequest.java
class KillRequest (line 8) | public class KillRequest implements Serializable {
method KillRequest (line 11) | public KillRequest() {
method KillRequest (line 13) | public KillRequest(int jobId) {
method getJobId (line 20) | public int getJobId() {
method setJobId (line 24) | public void setJobId(int jobId) {
FILE: xxl-job-core/src/main/java/com/xxl/job/core/openapi/model/LogRequest.java
class LogRequest (line 8) | public class LogRequest implements Serializable {
method LogRequest (line 11) | public LogRequest() {
method LogRequest (line 13) | public LogRequest(long logDateTim, long logId, int fromLineNum) {
method getLogDateTim (line 23) | public long getLogDateTim() {
method setLogDateTim (line 27) | public void setLogDateTim(long logDateTim) {
method getLogId (line 31) | public long getLogId() {
method setLogId (line 35) | public void setLogId(long logId) {
method getFromLineNum (line 39) | public int getFromLineNum() {
method setFromLineNum (line 43) | public void setFromLineNum(int fromLineNum) {
FILE: xxl-job-core/src/main/java/com/xxl/job/core/openapi/model/LogResult.java
class LogResult (line 8) | public class LogResult implements Serializable {
method LogResult (line 11) | public LogResult() {
method LogResult (line 13) | public LogResult(int fromLineNum, int toLineNum, String logContent, bo...
method getFromLineNum (line 25) | public int getFromLineNum() {
method setFromLineNum (line 29) | public void setFromLineNum(int fromLineNum) {
method getToLineNum (line 33) | public int getToLineNum() {
method setToLineNum (line 37) | public void setToLineNum(int toLineNum) {
method getLogContent (line 41) | public String getLogContent() {
method setLogContent (line 45) | public void setLogContent(String logContent) {
method isEnd (line 49) | public boolean isEnd() {
method setEnd (line 53) | public void setEnd(boolean end) {
FILE: xxl-job-core/src/main/java/com/xxl/job/core/openapi/model/RegistryRequest.java
class RegistryRequest (line 8) | public class RegistryRequest implements Serializable {
method RegistryRequest (line 15) | public RegistryRequest(){}
method RegistryRequest (line 16) | public RegistryRequest(String registryGroup, String registryKey, Strin...
method getRegistryGroup (line 22) | public String getRegistryGroup() {
method setRegistryGroup (line 26) | public void setRegistryGroup(String registryGroup) {
method getRegistryKey (line 30) | public String getRegistryKey() {
method setRegistryKey (line 34) | public void setRegistryKey(String registryKey) {
method getRegistryValue (line 38) | public String getRegistryValue() {
method setRegistryValue (line 42) | public void setRegistryValue(String registryValue) {
method toString (line 46) | @Override
FILE: xxl-job-core/src/main/java/com/xxl/job/core/openapi/model/TriggerRequest.java
class TriggerRequest (line 8) | public class TriggerRequest implements Serializable{
method getJobId (line 34) | public int getJobId() {
method setJobId (line 38) | public void setJobId(int jobId) {
method getExecutorHandler (line 42) | public String getExecutorHandler() {
method setExecutorHandler (line 46) | public void setExecutorHandler(String executorHandler) {
method getExecutorParams (line 50) | public String getExecutorParams() {
method setExecutorParams (line 54) | public void setExecutorParams(String executorParams) {
method getExecutorBlockStrategy (line 58) | public String getExecutorBlockStrategy() {
method setExecutorBlockStrategy (line 62) | public void setExecutorBlockStrategy(String executorBlockStrategy) {
method getExecutorTimeout (line 66) | public int getExecutorTimeout() {
method setExecutorTimeout (line 70) | public void setExecutorTimeout(int executorTimeout) {
method getLogId (line 74) | public long getLogId() {
method setLogId (line 78) | public void setLogId(long logId) {
method getLogDateTime (line 82) | public long getLogDateTime() {
method setLogDateTime (line 86) | public void setLogDateTime(long logDateTime) {
method getGlueType (line 90) | public String getGlueType() {
method setGlueType (line 94) | public void setGlueType(String glueType) {
method getGlueSource (line 98) | public String getGlueSource() {
method setGlueSource (line 102) | public void setGlueSource(String glueSource) {
method getGlueUpdatetime (line 106) | public long getGlueUpdatetime() {
method setGlueUpdatetime (line 110) | public void setGlueUpdatetime(long glueUpdatetime) {
method getBroadcastIndex (line 114) | public int getBroadcastIndex() {
method setBroadcastIndex (line 118) | public void setBroadcastIndex(int broadcastIndex) {
method getBroadcastTotal (line 122) | public int getBroadcastTotal() {
method setBroadcastTotal (line 126) | public void setBroadcastTotal(int broadcastTotal) {
method toString (line 131) | @Override
FILE: xxl-job-core/src/main/java/com/xxl/job/core/server/EmbedServer.java
class EmbedServer (line 31) | public class EmbedServer {
method start (line 37) | public void start(final String address, final int port, final String a...
method stop (line 110) | public void stop() throws Exception {
class EmbedHttpServerHandler (line 131) | public static class EmbedHttpServerHandler extends SimpleChannelInboun...
method EmbedHttpServerHandler (line 138) | public EmbedHttpServerHandler(ExecutorBiz executorBiz, String access...
method channelRead0 (line 144) | @Override
method dispatchRequest (line 170) | private Object dispatchRequest(HttpMethod httpMethod, String uri, St...
method writeResponse (line 213) | private void writeResponse(ChannelHandlerContext ctx, boolean keepAl...
method channelReadComplete (line 224) | @Override
method exceptionCaught (line 229) | @Override
method userEventTriggered (line 235) | @Override
method startRegistry (line 248) | public void startRegistry(final String appname, final String address) {
method stopRegistry (line 253) | public void stopRegistry() {
FILE: xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java
class ExecutorRegistryThread (line 17) | public class ExecutorRegistryThread {
method getInstance (line 21) | public static ExecutorRegistryThread getInstance(){
method start (line 27) | public void start(final String appname, final String address){
method toStop (line 115) | public void toStop() {
FILE: xxl-job-core/src/main/java/com/xxl/job/core/thread/JobLogFileCleanThread.java
class JobLogFileCleanThread (line 19) | public class JobLogFileCleanThread {
method getInstance (line 23) | public static JobLogFileCleanThread getInstance(){
method start (line 29) | public void start(final long logRetentionDays){
method toStop (line 111) | public void toStop() {
FILE: xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java
class JobThread (line 25) | public class JobThread extends Thread{
method JobThread (line 40) | public JobThread(int jobId, IJobHandler handler) {
method getHandler (line 50) | public IJobHandler getHandler() {
method pushTriggerQueue (line 57) | public Response<String> pushTriggerQueue(TriggerRequest triggerParam) {
method toStop (line 72) | public void toStop(String stopReason) {
method isRunningOrHasQueue (line 85) | public boolean isRunningOrHasQueue() {
method run (line 89) | @Override
FILE: xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java
class TriggerCallbackThread (line 33) | public class TriggerCallbackThread {
method getInstance (line 37) | public static TriggerCallbackThread getInstance(){
method pushCallBack (line 45) | public static void pushCallBack(CallbackRequest callback){
method start (line 56) | public void start() {
method toStop (line 150) | public void toStop(){
method doCallback (line 179) | private void doCallback(List<CallbackRequest> callbackParamList){
method callbackLog (line 204) | private void callbackLog(List<CallbackRequest> callbackParamList, Stri...
method appendFailCallbackFile (line 236) | private void appendFailCallbackFile(List<CallbackRequest> callbackPara...
method retryFailCallbackFile (line 261) | private void retryFailCallbackFile() {
FILE: xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java
class ScriptUtil (line 21) | public class ScriptUtil {
method markScriptFile (line 30) | public static void markScriptFile(String scriptFileName, String script...
method execToFile (line 58) | public static int execToFile(String command, String scriptFile, String...
FILE: xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/XxlJobFramelessApplication.java
class XxlJobFramelessApplication (line 12) | public class XxlJobFramelessApplication {
method main (line 15) | public static void main(String[] args) {
FILE: xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/config/FrameLessXxlJobConfig.java
class FrameLessXxlJobConfig (line 15) | public class FrameLessXxlJobConfig {
method getInstance (line 20) | public static FrameLessXxlJobConfig getInstance() {
method initXxlJobExecutor (line 30) | public void initXxlJobExecutor() {
method destroyXxlJobExecutor (line 62) | public void destroyXxlJobExecutor() {
FILE: xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/jobhandler/SampleXxlJob.java
class SampleXxlJob (line 32) | public class SampleXxlJob {
method demoJobHandler (line 39) | @XxlJob("demoJobHandler")
method shardingJobHandler (line 54) | @XxlJob("shardingJobHandler")
method commandJobHandler (line 80) | @XxlJob("commandJobHandler")
method httpJobHandler (line 165) | @XxlJob("httpJobHandler")
method isValidDomain (line 258) | private boolean isValidDomain(String url) {
class HttpJobParam (line 288) | private static class HttpJobParam{
method getUrl (line 299) | public String getUrl() {
method setUrl (line 303) | public void setUrl(String url) {
method getMethod (line 307) | public String getMethod() {
method setMethod (line 311) | public void setMethod(String method) {
method getContentType (line 315) | public String getContentType() {
method setContentType (line 319) | public void setContentType(String contentType) {
method getHeaders (line 323) | public Map<String, String> getHeaders() {
method setHeaders (line 327) | public void setHeaders(Map<String, String> headers) {
method getCookies (line 331) | public Map<String, String> getCookies() {
method setCookies (line 335) | public void setCookies(Map<String, String> cookies) {
method getTimeout (line 339) | public int getTimeout() {
method setTimeout (line 343) | public void setTimeout(int timeout) {
method getData (line 347) | public String getData() {
method setData (line 351) | public void setData(String data) {
method getForm (line 355) | public Map<String, String> getForm() {
method setForm (line 359) | public void setForm(Map<String, String> form) {
method getAuth (line 363) | public String getAuth() {
method setAuth (line 367) | public void setAuth(String auth) {
method demoJobHandler2 (line 376) | @XxlJob(value = "demoJobHandler2", init = "init", destroy = "destroy")
method init (line 380) | public void init(){
method destroy (line 383) | public void destroy(){
FILE: xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/test/java/com/xxl/job/executor/sample/frameless/test/FramelessApplicationTest.java
class FramelessApplicationTest (line 10) | @Testable
method test1 (line 14) | @Test
FILE: xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/XxlJobAIExecutorApplication.java
class XxlJobAIExecutorApplication (line 9) | @SpringBootApplication
method main (line 12) | public static void main(String[] args) {
FILE: xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/config/XxlJobConfig.java
class XxlJobConfig (line 15) | @Configuration
method xxlJobExecutor (line 53) | @Bean
FILE: xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/controller/IndexController.java
class IndexController (line 35) | @Controller
method index (line 41) | @RequestMapping("/")
method simpleChat (line 58) | @GetMapping("/chat/simple")
method streamChat (line 84) | @GetMapping("/chat/stream")
method difySimple (line 111) | @GetMapping("/dify/simple")
method write2Json (line 133) | private String write2Json(Object obj) {
method difyStream (line 144) | @GetMapping( "/dify/stream")
FILE: xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/jobhandler/AIXxlJob.java
class AIXxlJob (line 28) | @Component
method ollamaJobHandler (line 47) | @XxlJob("ollamaJobHandler")
class OllamaParam (line 102) | private static class OllamaParam{
method getInput (line 107) | public String getInput() {
method setInput (line 111) | public void setInput(String input) {
method getPrompt (line 115) | public String getPrompt() {
method setPrompt (line 119) | public void setPrompt(String prompt) {
method getModel (line 123) | public String getModel() {
method setModel (line 127) | public void setModel(String model) {
method difyWorkflowJobHandler (line 148) | @XxlJob("difyWorkflowJobHandler")
class DifyParam (line 199) | private static class DifyParam{
method getInputs (line 221) | public Map<String, Object> getInputs() {
method setInputs (line 225) | public void setInputs(Map<String, Object> inputs) {
method getUser (line 229) | public String getUser() {
method setUser (line 233) | public void setUser(String user) {
method getBaseUrl (line 237) | public String getBaseUrl() {
method setBaseUrl (line 241) | public void setBaseUrl(String baseUrl) {
method getApiKey (line 245) | public String getApiKey() {
method setApiKey (line 249) | public void setApiKey(String apiKey) {
FILE: xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/test/java/com/xxl/job/executor/test/BaseTests.java
class BaseTests (line 6) | @SpringBootTest
method test (line 9) | @Test
FILE: xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/test/java/com/xxl/job/executor/test/dify/DifyTest.java
class DifyTest (line 17) | @SpringBootTest
method test (line 25) | @Test
FILE: xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/test/java/com/xxl/job/executor/test/ollama/OllamaTest.java
class OllamaTest (line 20) | @SpringBootTest
method chatTest (line 32) | @Test
method chatStreamTest (line 59) | @Test
FILE: xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/XxlJobExecutorApplication.java
class XxlJobExecutorApplication (line 9) | @SpringBootApplication
method main (line 12) | public static void main(String[] args) {
FILE: xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/config/XxlJobConfig.java
class XxlJobConfig (line 15) | @Configuration
method xxlJobExecutor (line 53) | @Bean
FILE: xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/jobhandler/SampleXxlJob.java
class SampleXxlJob (line 33) | @Component
method demoJobHandler (line 41) | @XxlJob("demoJobHandler")
method shardingJobHandler (line 56) | @XxlJob("shardingJobHandler")
method commandJobHandler (line 82) | @XxlJob("commandJobHandler")
method httpJobHandler (line 167) | @XxlJob("httpJobHandler")
method isValidDomain (line 260) | private boolean isValidDomain(String url) {
class HttpJobParam (line 290) | private static class HttpJobParam{
method getUrl (line 301) | public String getUrl() {
method setUrl (line 305) | public void setUrl(String url) {
method getMethod (line 309) | public String getMethod() {
method setMethod (line 313) | public void setMethod(String method) {
method getContentType (line 317) | public String getContentType() {
method setContentType (line 321) | public void setContentType(String contentType) {
method getHeaders (line 325) | public Map<String, String> getHeaders() {
method setHeaders (line 329) | public void setHeaders(Map<String, String> headers) {
method getCookies (line 333) | public Map<String, String> getCookies() {
method setCookies (line 337) | public void setCookies(Map<String, String> cookies) {
method getTimeout (line 341) | public int getTimeout() {
method setTimeout (line 345) | public void setTimeout(int timeout) {
method getData (line 349) | public String getData() {
method setData (line 353) | public void setData(String data) {
method getForm (line 357) | public Map<String, String> getForm() {
method setForm (line 361) | public void setForm(Map<String, String> form) {
method getAuth (line 365) | public String getAuth() {
method setAuth (line 369) | public void setAuth(String auth) {
method demoJobHandler2 (line 377) | @XxlJob(value = "demoJobHandler2", init = "init", destroy = "destroy")
method init (line 381) | public void init(){
method destroy (line 384) | public void destroy(){
FILE: xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/test/java/com/xxl/job/executor/test/XxlJobExecutorExampleBootApplicationTests.java
class XxlJobExecutorExampleBootApplicationTests (line 6) | @SpringBootTest
method test (line 9) | @Test
Condensed preview — 268 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,216K chars).
[
{
"path": ".github/FUNDING.yml",
"chars": 757,
"preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
},
{
"path": ".github/ISSUE_TEMPLATE",
"chars": 214,
"preview": "Please answer some questions before submitting your issue. Thanks!\n\n### Which version of XXL-JOB do you using?\n\n### Expe"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE",
"chars": 251,
"preview": "**What kind of change does this PR introduce?** (check at least one)\n\n- [ ] Bugfix\n- [ ] Feature\n- [ ] Code style update"
},
{
"path": ".github/workflows/maven.yml",
"chars": 425,
"preview": "name: Java CI\n\non:\n push:\n branches: [ \"master\" ]\n pull_request:\n branches: [ \"master\" ]\n\njobs:\n build:\n\n ru"
},
{
"path": ".gitignore",
"chars": 65,
"preview": ".idea\n.classpath\n.project\n*.iml\ntarget/\n.DS_Store\n.gitattributes\n"
},
{
"path": "LICENSE",
"chars": 35141,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "NOTICE",
"chars": 679,
"preview": "Copyright (c) 2015-present, xuxueli.\n\nDependencies:\n================================================================\n\nSp"
},
{
"path": "README.md",
"chars": 24024,
"preview": "<p align=\"center\" >\n <img src=\"https://www.xuxueli.com/doc/static/xxl-job/images/xxl-logo.jpg\" width=\"150\">\n <h3 a"
},
{
"path": "doc/XXL-JOB-English-Documentation.md",
"chars": 86659,
"preview": "## 《Distributed task scheduling framework XXL-JOB》\n\n[](https://githu"
},
{
"path": "doc/db/tables_xxl_job.sql",
"chars": 8457,
"preview": "#\n# XXL-JOB\n# Copyright (c) 2015-present, xuxueli.\n\nCREATE database if NOT EXISTS `xxl_job` default character set utf8mb"
},
{
"path": "docker/docker-compose.yml",
"chars": 2336,
"preview": "# docker-compose version\nversion: '3.8'\n\nservices:\n mysql:\n image: mysql:8.4\n container_name: xxl-job-mysql\n e"
},
{
"path": "pom.xml",
"chars": 9140,
"preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLoca"
},
{
"path": "xxl-job-admin/Dockerfile",
"chars": 495,
"preview": "# base image\nFROM openjdk:21-jdk-slim\n\n# maintainer\nMAINTAINER xuxueli\n\n# set params\nENV PARAMS=\"\"\n\n# set timezone\nENV T"
},
{
"path": "xxl-job-admin/pom.xml",
"chars": 2268,
"preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLoca"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java",
"chars": 372,
"preview": "package com.xxl.job.admin;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfi"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/constant/Consts.java",
"chars": 116,
"preview": "package com.xxl.job.admin.constant;\n\npublic class Consts {\n\n public static final String ADMIN_ROLE = \"ADMIN\";\n\n}\n"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/constant/TriggerStatus.java",
"chars": 537,
"preview": "package com.xxl.job.admin.constant;\n\npublic enum TriggerStatus {\n\n STOPPED(0, \"stopped\"),\n RUNNING(1, \"running\");\n"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/controller/base/IndexController.java",
"chars": 4321,
"preview": "package com.xxl.job.admin.controller.base;\n\nimport com.xxl.job.admin.constant.Consts;\nimport com.xxl.job.admin.model.dto"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/controller/base/LoginController.java",
"chars": 4430,
"preview": "package com.xxl.job.admin.controller.base;\n\nimport com.xxl.job.admin.mapper.XxlJobUserMapper;\nimport com.xxl.job.admin.m"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobCodeController.java",
"chars": 4158,
"preview": "package com.xxl.job.admin.controller.biz;\n\nimport com.xxl.job.admin.mapper.XxlJobInfoMapper;\nimport com.xxl.job.admin.ma"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobGroupController.java",
"chars": 8287,
"preview": "package com.xxl.job.admin.controller.biz;\n\nimport com.xxl.job.admin.constant.Consts;\nimport com.xxl.job.admin.model.XxlJ"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobInfoController.java",
"chars": 7843,
"preview": "package com.xxl.job.admin.controller.biz;\n\nimport com.xxl.job.admin.mapper.XxlJobGroupMapper;\nimport com.xxl.job.admin.m"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobLogController.java",
"chars": 11415,
"preview": "package com.xxl.job.admin.controller.biz;\n\nimport com.xxl.job.admin.mapper.XxlJobGroupMapper;\nimport com.xxl.job.admin.m"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobUserController.java",
"chars": 7880,
"preview": "package com.xxl.job.admin.controller.biz;\n\nimport com.xxl.job.admin.constant.Consts;\nimport com.xxl.job.admin.mapper.Xxl"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobGroupMapper.java",
"chars": 1128,
"preview": "package com.xxl.job.admin.mapper;\n\nimport com.xxl.job.admin.model.XxlJobGroup;\nimport org.apache.ibatis.annotations.Mapp"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobInfoMapper.java",
"chars": 1765,
"preview": "package com.xxl.job.admin.mapper;\n\nimport com.xxl.job.admin.model.XxlJobInfo;\nimport org.apache.ibatis.annotations.Mappe"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobLockMapper.java",
"chars": 257,
"preview": "package com.xxl.job.admin.mapper;\n\nimport org.apache.ibatis.annotations.Mapper;\n\n/**\n * job lock\n *\n * @author xuxueli 2"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobLogGlueMapper.java",
"chars": 564,
"preview": "package com.xxl.job.admin.mapper;\n\nimport com.xxl.job.admin.model.XxlJobLogGlue;\nimport org.apache.ibatis.annotations.Ma"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobLogMapper.java",
"chars": 2050,
"preview": "package com.xxl.job.admin.mapper;\n\nimport com.xxl.job.admin.model.XxlJobLog;\nimport org.apache.ibatis.annotations.Mapper"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobLogReportMapper.java",
"chars": 686,
"preview": "package com.xxl.job.admin.mapper;\n\nimport com.xxl.job.admin.model.XxlJobLogReport;\nimport org.apache.ibatis.annotations."
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobRegistryMapper.java",
"chars": 1923,
"preview": "package com.xxl.job.admin.mapper;\n\nimport com.xxl.job.admin.model.XxlJobRegistry;\nimport org.apache.ibatis.annotations.M"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/mapper/XxlJobUserMapper.java",
"chars": 1070,
"preview": "package com.xxl.job.admin.mapper;\n\nimport com.xxl.job.admin.model.XxlJobUser;\nimport com.xxl.tool.response.Response;\nimp"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/model/XxlJobGroup.java",
"chars": 1667,
"preview": "package com.xxl.job.admin.model;\n\nimport com.xxl.tool.core.StringTool;\n\nimport java.util.ArrayList;\nimport java.util.Arr"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/model/XxlJobInfo.java",
"chars": 4914,
"preview": "package com.xxl.job.admin.model;\n\nimport java.util.Date;\n\n/**\n * xxl-job info\n *\n * @author xuxueli 2016-1-12 18:25:49\n"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/model/XxlJobLog.java",
"chars": 2907,
"preview": "package com.xxl.job.admin.model;\n\nimport java.util.Date;\n\n/**\n * xxl-job log, used to track trigger process\n * @author x"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/model/XxlJobLogGlue.java",
"chars": 1288,
"preview": "package com.xxl.job.admin.model;\n\nimport java.util.Date;\n\n/**\n * xxl-job log for glue, used to track job code process\n *"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/model/XxlJobLogReport.java",
"chars": 974,
"preview": "package com.xxl.job.admin.model;\n\nimport java.util.Date;\n\npublic class XxlJobLogReport {\n\n private int id;\n\n priva"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/model/XxlJobRegistry.java",
"chars": 1096,
"preview": "package com.xxl.job.admin.model;\n\nimport java.util.Date;\n\n/**\n * Created by xuxueli on 16/9/30.\n */\npublic class XxlJobR"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/model/XxlJobUser.java",
"chars": 1024,
"preview": "package com.xxl.job.admin.model;\n\n/**\n * @author xuxueli 2019-05-04 16:43:12\n */\npublic class XxlJobUser {\n\t\n\tprivate in"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/model/dto/XxlBootResourceDTO.java",
"chars": 3206,
"preview": "package com.xxl.job.admin.model.dto;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n *"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/alarm/JobAlarm.java",
"chars": 358,
"preview": "package com.xxl.job.admin.scheduler.alarm;\n\nimport com.xxl.job.admin.model.XxlJobInfo;\nimport com.xxl.job.admin.model.Xx"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/alarm/JobAlarmer.java",
"chars": 2088,
"preview": "package com.xxl.job.admin.scheduler.alarm;\n\nimport com.xxl.job.admin.model.XxlJobInfo;\nimport com.xxl.job.admin.model.Xx"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/alarm/impl/EmailJobAlarm.java",
"chars": 4792,
"preview": "package com.xxl.job.admin.scheduler.alarm.impl;\n\nimport com.xxl.job.admin.scheduler.alarm.JobAlarm;\nimport com.xxl.job.a"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/complete/JobCompleter.java",
"chars": 4476,
"preview": "package com.xxl.job.admin.scheduler.complete;\n\nimport com.xxl.job.admin.mapper.XxlJobInfoMapper;\nimport com.xxl.job.admi"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/config/XxlJobAdminBootstrap.java",
"chars": 8213,
"preview": "package com.xxl.job.admin.scheduler.config;\n\nimport com.xxl.job.admin.mapper.*;\nimport com.xxl.job.admin.scheduler.alarm"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/cron/CronExpression.java",
"chars": 58386,
"preview": "package com.xxl.job.admin.scheduler.cron;\n\nimport java.io.Serializable;\nimport java.text.ParseException;\nimport java.uti"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/exception/XxlJobException.java",
"chars": 267,
"preview": "package com.xxl.job.admin.scheduler.exception;\n\n/**\n * @author xuxueli 2019-05-04 23:19:29\n */\npublic class XxlJobExcept"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/MisfireHandler.java",
"chars": 270,
"preview": "package com.xxl.job.admin.scheduler.misfire;\n\n/**\n * Misfire Handler\n *\n * @author xuxueli 2020-10-29\n */\npublic abstrac"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/MisfireStrategyEnum.java",
"chars": 1441,
"preview": "package com.xxl.job.admin.scheduler.misfire;\n\nimport com.xxl.job.admin.scheduler.misfire.strategy.MisfireDoNothing;\nimpo"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/strategy/MisfireDoNothing.java",
"chars": 467,
"preview": "package com.xxl.job.admin.scheduler.misfire.strategy;\n\nimport com.xxl.job.admin.scheduler.misfire.MisfireHandler;\nimport"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/misfire/strategy/MisfireFireOnceNow.java",
"chars": 760,
"preview": "package com.xxl.job.admin.scheduler.misfire.strategy;\n\nimport com.xxl.job.admin.scheduler.config.XxlJobAdminBootstrap;\ni"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/openapi/OpenApiController.java",
"chars": 2973,
"preview": "package com.xxl.job.admin.scheduler.openapi;\n\nimport com.xxl.job.admin.scheduler.config.XxlJobAdminBootstrap;\nimport com"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/ExecutorRouteStrategyEnum.java",
"chars": 1822,
"preview": "package com.xxl.job.admin.scheduler.route;\n\nimport com.xxl.job.admin.scheduler.route.strategy.*;\nimport com.xxl.job.admi"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/ExecutorRouter.java",
"chars": 620,
"preview": "package com.xxl.job.admin.scheduler.route;\n\nimport com.xxl.job.core.openapi.model.TriggerRequest;\nimport com.xxl.tool.re"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteBusyover.java",
"chars": 1871,
"preview": "package com.xxl.job.admin.scheduler.route.strategy;\n\nimport com.xxl.job.admin.scheduler.config.XxlJobAdminBootstrap;\nimp"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteConsistentHash.java",
"chars": 2759,
"preview": "package com.xxl.job.admin.scheduler.route.strategy;\n\nimport com.xxl.job.admin.scheduler.route.ExecutorRouter;\nimport com"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteFailover.java",
"chars": 1718,
"preview": "package com.xxl.job.admin.scheduler.route.strategy;\n\nimport com.xxl.job.admin.scheduler.config.XxlJobAdminBootstrap;\nimp"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteFirst.java",
"chars": 496,
"preview": "package com.xxl.job.admin.scheduler.route.strategy;\n\nimport com.xxl.job.admin.scheduler.route.ExecutorRouter;\nimport com"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteLFU.java",
"chars": 2666,
"preview": "package com.xxl.job.admin.scheduler.route.strategy;\n\nimport com.xxl.job.admin.scheduler.route.ExecutorRouter;\nimport com"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteLRU.java",
"chars": 2596,
"preview": "package com.xxl.job.admin.scheduler.route.strategy;\n\nimport com.xxl.job.admin.scheduler.route.ExecutorRouter;\nimport com"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteLast.java",
"chars": 515,
"preview": "package com.xxl.job.admin.scheduler.route.strategy;\n\nimport com.xxl.job.admin.scheduler.route.ExecutorRouter;\nimport com"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteRandom.java",
"chars": 650,
"preview": "package com.xxl.job.admin.scheduler.route.strategy;\n\nimport com.xxl.job.admin.scheduler.route.ExecutorRouter;\nimport com"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/route/strategy/ExecutorRouteRound.java",
"chars": 1525,
"preview": "package com.xxl.job.admin.scheduler.route.strategy;\n\nimport com.xxl.job.admin.scheduler.route.ExecutorRouter;\nimport com"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobCompleteHelper.java",
"chars": 5113,
"preview": "package com.xxl.job.admin.scheduler.thread;\n\nimport com.xxl.job.admin.model.XxlJobLog;\nimport com.xxl.job.admin.schedule"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobFailAlarmMonitorHelper.java",
"chars": 3501,
"preview": "package com.xxl.job.admin.scheduler.thread;\n\nimport com.xxl.job.admin.model.XxlJobInfo;\nimport com.xxl.job.admin.model.X"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobLogReportHelper.java",
"chars": 6869,
"preview": "package com.xxl.job.admin.scheduler.thread;\n\nimport com.xxl.job.admin.scheduler.config.XxlJobAdminBootstrap;\nimport com."
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobRegistryHelper.java",
"chars": 7104,
"preview": "package com.xxl.job.admin.scheduler.thread;\n\nimport com.xxl.job.admin.model.XxlJobGroup;\nimport com.xxl.job.admin.model."
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobScheduleHelper.java",
"chars": 15963,
"preview": "package com.xxl.job.admin.scheduler.thread;\n\nimport com.xxl.job.admin.constant.TriggerStatus;\nimport com.xxl.job.admin.m"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/thread/JobTriggerPoolHelper.java",
"chars": 5553,
"preview": "package com.xxl.job.admin.scheduler.thread;\n\nimport com.xxl.job.admin.scheduler.config.XxlJobAdminBootstrap;\nimport com."
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/trigger/JobTrigger.java",
"chars": 12899,
"preview": "package com.xxl.job.admin.scheduler.trigger;\n\nimport com.xxl.job.admin.mapper.XxlJobGroupMapper;\nimport com.xxl.job.admi"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/trigger/TriggerTypeEnum.java",
"chars": 723,
"preview": "package com.xxl.job.admin.scheduler.trigger;\n\nimport com.xxl.job.admin.util.I18nUtil;\n\n/**\n * trigger type enum\n *\n * @a"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/ScheduleType.java",
"chars": 444,
"preview": "package com.xxl.job.admin.scheduler.type;\n\nimport com.xxl.job.admin.model.XxlJobInfo;\n\nimport java.util.Date;\n\n/**\n * Sc"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/ScheduleTypeEnum.java",
"chars": 1668,
"preview": "package com.xxl.job.admin.scheduler.type;\n\nimport com.xxl.job.admin.scheduler.type.strategy.CronScheduleType;\nimport com"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/CronScheduleType.java",
"chars": 544,
"preview": "package com.xxl.job.admin.scheduler.type.strategy;\n\nimport com.xxl.job.admin.model.XxlJobInfo;\nimport com.xxl.job.admin."
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/FixRateScheduleType.java",
"chars": 499,
"preview": "package com.xxl.job.admin.scheduler.type.strategy;\n\nimport com.xxl.job.admin.model.XxlJobInfo;\nimport com.xxl.job.admin."
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/scheduler/type/strategy/NoneScheduleType.java",
"chars": 404,
"preview": "package com.xxl.job.admin.scheduler.type.strategy;\n\nimport com.xxl.job.admin.model.XxlJobInfo;\nimport com.xxl.job.admin."
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java",
"chars": 1313,
"preview": "package com.xxl.job.admin.service;\n\nimport com.xxl.job.admin.model.XxlJobInfo;\nimport com.xxl.sso.core.model.LoginInfo;\n"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java",
"chars": 1080,
"preview": "package com.xxl.job.admin.service.impl;\n\nimport com.xxl.job.admin.scheduler.config.XxlJobAdminBootstrap;\nimport com.xxl."
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java",
"chars": 21651,
"preview": "package com.xxl.job.admin.service.impl;\n\nimport com.xxl.job.admin.constant.TriggerStatus;\nimport com.xxl.job.admin.mappe"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/util/I18nUtil.java",
"chars": 3347,
"preview": "package com.xxl.job.admin.util;\n\nimport com.xxl.job.core.constant.ExecutorBlockStrategyEnum;\nimport com.xxl.tool.core.Pr"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/util/JobGroupPermissionUtil.java",
"chars": 2596,
"preview": "package com.xxl.job.admin.util;\n\nimport com.xxl.job.admin.constant.Consts;\nimport com.xxl.job.admin.model.XxlJobGroup;\ni"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/util/old/CommonDataInterceptor.java",
"chars": 1319,
"preview": "//package com.xxl.job.admin.web.interceptor;\n//\n//import com.xxl.job.admin.util.I18nUtil;\n//import com.xxl.tool.freemark"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/util/old/CookieUtil.java",
"chars": 2278,
"preview": "//package com.xxl.job.admin.util;\n//\n//import jakarta.servlet.http.Cookie;\n//import jakarta.servlet.http.HttpServletRequ"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/util/old/FtlUtil.java",
"chars": 1067,
"preview": "//package com.xxl.job.admin.util;\n//\n//import freemarker.ext.beans.BeansWrapper;\n//import freemarker.ext.beans.BeansWrap"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/util/old/JacksonUtil.java",
"chars": 2632,
"preview": "//package com.xxl.job.admin.util.old;\n//\n//import com.fasterxml.jackson.core.JsonGenerationException;\n//import com.faste"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/util/old/LocalCacheUtil.java",
"chars": 3563,
"preview": "//package com.xxl.job.admin.util;\n//\n//import java.util.concurrent.ConcurrentHashMap;\n//import java.util.concurrent.Conc"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/util/old/RemoteHttpJobBean.java",
"chars": 1016,
"preview": "//package com.xxl.job.admin.core.jobbean;\n//\n//import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;\n//import com.x"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/util/old/XxlJobDynamicScheduler.java",
"chars": 14396,
"preview": "//package com.xxl.job.admin.core.schedule;\n//\n//import com.xxl.job.admin.core.conf.XxlJobAdminConfig;\n//import com.xxl.j"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/util/old/XxlJobThreadPool.java",
"chars": 1082,
"preview": "//package com.xxl.job.admin.core.quartz;\n//\n//import org.quartz.SchedulerConfigException;\n//import org.quartz.spi.Thread"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/web/error/WebErrorPageRegistrar.java",
"chars": 554,
"preview": "package com.xxl.job.admin.web.error;\n\nimport org.springframework.boot.web.error.ErrorPage;\nimport org.springframework.bo"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/web/error/WebHandlerExceptionResolver.java",
"chars": 1919,
"preview": "package com.xxl.job.admin.web.error;\n\nimport com.xxl.job.admin.scheduler.exception.XxlJobException;\nimport com.xxl.tool."
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/web/xxlsso/SimpleLoginStore.java",
"chars": 2415,
"preview": "package com.xxl.job.admin.web.xxlsso;\n\nimport com.xxl.job.admin.constant.Consts;\nimport com.xxl.job.admin.mapper.XxlJobU"
},
{
"path": "xxl-job-admin/src/main/java/com/xxl/job/admin/web/xxlsso/XxlSsoConfig.java",
"chars": 1721,
"preview": "package com.xxl.job.admin.web.xxlsso;\n\nimport com.xxl.sso.core.auth.interceptor.XxlSsoWebInterceptor;\nimport com.xxl.sso"
},
{
"path": "xxl-job-admin/src/main/resources/application.properties",
"chars": 2412,
"preview": "### web\nserver.port=8080\nserver.servlet.context-path=/xxl-job-admin\n\n### actuator\nmanagement.endpoints.web.base-path=/ac"
},
{
"path": "xxl-job-admin/src/main/resources/i18n/message_en.properties",
"chars": 10334,
"preview": "admin_name=Scheduling Center\nadmin_name_full=Distributed Task Scheduling Platform|XXL-JOB\nadmin_version=3.4.0-SNAPSHOT\na"
},
{
"path": "xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties",
"chars": 7172,
"preview": "admin_name=任务调度中心\nadmin_name_full=分布式任务调度平台|XXL-JOB\nadmin_version=3.4.0-SNAPSHOT\nadmin_i18n=\n\n## system\nsystem_tips=系统提示"
},
{
"path": "xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties",
"chars": 7169,
"preview": "admin_name=任務調度中心\nadmin_name_full=分布式任務調度平臺|XXL-JOB\nadmin_version=3.4.0-SNAPSHOT\nadmin_i18n=\n\n## system\nsystem_tips=系統提示"
},
{
"path": "xxl-job-admin/src/main/resources/logback.xml",
"chars": 1046,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration debug=\"false\" scan=\"true\" scanPeriod=\"1 seconds\">\n\n <contextNam"
},
{
"path": "xxl-job-admin/src/main/resources/mapper/XxlJobGroupMapper.xml",
"chars": 3025,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \n\t\"http://mybatis.or"
},
{
"path": "xxl-job-admin/src/main/resources/mapper/XxlJobInfoMapper.xml",
"chars": 8257,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n\t\"http://mybatis.org"
},
{
"path": "xxl-job-admin/src/main/resources/mapper/XxlJobLockMapper.xml",
"chars": 372,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \n\t\"http://mybatis.or"
},
{
"path": "xxl-job-admin/src/main/resources/mapper/XxlJobLogGlueMapper.xml",
"chars": 1943,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \n\t\"http://mybatis.or"
},
{
"path": "xxl-job-admin/src/main/resources/mapper/XxlJobLogMapper.xml",
"chars": 7505,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \n\t\"http://mybatis.or"
},
{
"path": "xxl-job-admin/src/main/resources/mapper/XxlJobLogReportMapper.xml",
"chars": 2331,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \n\t\"http://mybatis.or"
},
{
"path": "xxl-job-admin/src/main/resources/mapper/XxlJobRegistryMapper.xml",
"chars": 2630,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \n\t\"http://mybatis.or"
},
{
"path": "xxl-job-admin/src/main/resources/mapper/XxlJobUserMapper.xml",
"chars": 2747,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n\t\"http://mybatis.org"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.css",
"chars": 8163,
"preview": ".daterangepicker {\n position: absolute;\n color: inherit;\n background-color: #fff;\n border-radius: 4px;\n width: 278p"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.js",
"chars": 71115,
"preview": "/**\n* @version: 2.1.27\n* @author: Dan Grossman http://www.dangrossman.info/\n* @copyright: Copyright (c) 2012-2017 Dan Gr"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/ckeditor.js",
"chars": 645010,
"preview": "/*\nCopyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or https:/"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/config.js",
"chars": 1321,
"preview": "/**\n * @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see https:"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/contents.css",
"chars": 2886,
"preview": "/*\nCopyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or https://"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/lang/zh-cn.js",
"chars": 8472,
"preview": "/*\nCopyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or https:/"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/image/dialogs/image.js",
"chars": 21350,
"preview": "/*\n Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or https"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/link/dialogs/anchor.js",
"chars": 1826,
"preview": "/*\n Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or https"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/link/dialogs/link.js",
"chars": 13149,
"preview": "/*\n Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or https"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/scayt/dialogs/dialog.css",
"chars": 396,
"preview": "div.cke_dialog_ui_scaytItemList {\n\tborder: 1px solid #c9cccf;\n}\n\n.cke_scaytItemList-child {\n\tposition: relative;\n\tpaddin"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/scayt/dialogs/options.js",
"chars": 16134,
"preview": "CKEDITOR.dialog.add(\"scaytDialog\",function(d){var c=d.scayt,k='\\x3cp\\x3e\\x3cimg alt\\x3d\"logo\" title\\x3d\"logo\" src\\x3d\"'"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/scayt/dialogs/toolbar.css",
"chars": 1231,
"preview": "a\n{\n\ttext-decoration:none;\n\tpadding: 2px 4px 4px 6px;\n\tdisplay : block;\n\tborder-width: 1px;\n\tborder-style: solid;\n\tmargi"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/scayt/skins/moono-lisa/scayt.css",
"chars": 356,
"preview": ".scayt-lang-list > div\n{\n padding-bottom: 6px !important;\n}\n\n.scayt-lang-list > div input\n{\n margin-right: 4px;\n}\n"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js",
"chars": 2420,
"preview": "/*\n Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or https"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/specialchar/dialogs/specialchar.js",
"chars": 5073,
"preview": "/*\n Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or https"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/table/dialogs/table.js",
"chars": 8802,
"preview": "/*\n Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\n For licensing, see LICENSE.md or https"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/tableselection/styles/tableselection.css",
"chars": 1109,
"preview": ".cke_table-faked-selection-editor *::selection, table[data-cke-table-faked-selection-table] *::selection {\n\tbackground: "
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/plugins/wsc/skins/moono-lisa/wsc.css",
"chars": 1263,
"preview": ".cke_dialog_body #overlayBlock,\n.cke_dialog_body #no_check_over\n{\n top: 39px !important;\n}\n\ndiv[name=SpellTab] .wsc-s"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/dialog.css",
"chars": 13704,
"preview": "/*\nCopyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or https://"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/dialog_ie.css",
"chars": 14727,
"preview": "/*\nCopyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or https://"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/dialog_ie8.css",
"chars": 15276,
"preview": "/*\nCopyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or https://"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/dialog_iequirks.css",
"chars": 14756,
"preview": "/*\nCopyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or https://"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/editor.css",
"chars": 50912,
"preview": "/*\nCopyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or https://"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/editor_gecko.css",
"chars": 50993,
"preview": "/*\nCopyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or https://"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/editor_ie.css",
"chars": 51911,
"preview": "/*\nCopyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or https://"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/editor_ie8.css",
"chars": 52717,
"preview": "/*\nCopyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or https://"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/editor_iequirks.css",
"chars": 52560,
"preview": "/*\nCopyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\nFor licensing, see LICENSE.md or https://"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/skins/moono-lisa/readme.md",
"chars": 2240,
"preview": "\"Moono-lisa\" Skin\n=================\n\nThis skin has been made a **default skin** starting from CKEditor 4.6.0 and is main"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/ckeditor/styles.js",
"chars": 5440,
"preview": "/**\n * Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or "
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/bower_components/fastclick/fastclick.js",
"chars": 25965,
"preview": ";(function () {\n\t'use strict';\n\n\t/**\n\t * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs"
},
{
"path": "xxl-job-admin/src/main/resources/static/adminlte/plugins/iCheck/square/blue.css",
"chars": 1611,
"preview": "/* iCheck plugin Square skin, blue\n----------------------------------- */\n.icheckbox_square-blue,\n.iradio_square-blue {\n"
},
{
"path": "xxl-job-admin/src/main/resources/static/biz/common/admin.setting.js",
"chars": 22054,
"preview": "/*!\n* Admin Setting for XXL-BOOT\n* ================\n*\n* 1、logout: 退出登录\n* 2、updatePwd: 修改密码\n* 3、slideToTop: "
},
{
"path": "xxl-job-admin/src/main/resources/static/biz/common/admin.tab.css",
"chars": 3920,
"preview": "/* admin tab start */\nhtml,\nbody {\n height: 100% !important;\n min-height: 0px !important;\n}\n\nbody .wrapper{\n he"
},
{
"path": "xxl-job-admin/src/main/resources/static/biz/common/admin.tab.js",
"chars": 18974,
"preview": "/*!\n* Admin Tab for XXL-BOOT\n* ================\n*\n* 1、menu:\n* - J_menuItem: 菜单\n* 2、tab:\n* - J_tabLeft: "
},
{
"path": "xxl-job-admin/src/main/resources/static/biz/common/admin.table.js",
"chars": 16691,
"preview": "/*!\n* Admin Table for XXL-BOOT\n* ================\n*\n* 1、data_filter:\n* searchBtn: 搜索\n* resetBtn: "
},
{
"path": "xxl-job-admin/src/main/resources/static/biz/common/admin.util.js",
"chars": 1091,
"preview": "/*!\n* Admin Util for XXL-BOOT\n* ================\n*\n* 1、openTab: 打开新页面,兼容iframe和window.open\n*\n* @author xuxueli\n"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/codemirror/addon/hint/anyword-hint.js",
"chars": 1681,
"preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/codemirror/addon/hint/show-hint.css",
"chars": 623,
"preview": ".CodeMirror-hints {\n position: absolute;\n z-index: 10;\n overflow: hidden;\n list-style: none;\n\n margin: 0;\n padding"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/codemirror/addon/hint/show-hint.js",
"chars": 15991,
"preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/codemirror/lib/codemirror.css",
"chars": 8542,
"preview": "/* BASICS */\n\n.CodeMirror {\n /* Set height, width, borders, and global font properties here */\n font-family: monospace"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/codemirror/lib/codemirror.js",
"chars": 392149,
"preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/clike/clike.js",
"chars": 35196,
"preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/javascript/javascript.js",
"chars": 35897,
"preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/php/php.js",
"chars": 18268,
"preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/powershell/powershell.js",
"chars": 12917,
"preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/python/python.js",
"chars": 14991,
"preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/codemirror/mode/shell/shell.js",
"chars": 4933,
"preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/cronGen/cronGen.js",
"chars": 64740,
"preview": "(function ($) {\n // var resultsName = \"\";\n var inputElement;\n var displayElement;\n $.fn.extend({\n cr"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/cronGen/cronGen_en.js",
"chars": 65241,
"preview": "(function ($) {\n // var resultsName = \"\";\n var inputElement;\n var displayElement;\n $.fn.extend({\n cr"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/fullscreen/jquery.fullscreen.js",
"chars": 6170,
"preview": "/**\n * modify base jQuery FullScreen, support IE\n */\n(function(jQuery) {\n \n /**\n * Sets or gets the fullscreen"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/jquery-treegrid/jquery.treegrid.css",
"chars": 341,
"preview": ".treegrid-indent {width:16px; height: 16px; display: inline-block; position: relative;}\n\n.treegrid-expander {width:16px;"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/layer/layer.js",
"chars": 22104,
"preview": "/*! layer-v3.1.1 Web弹层组件 MIT License http://layer.layui.com/ By 贤心 */\n ;!function(e,t){\"use strict\";var i,n,a=e.layui&"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/layer/theme/default/layer.css",
"chars": 14367,
"preview": ".layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:elli"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/nprogress/nprogress.css",
"chars": 1458,
"preview": "/* Make clicks pass-through */\n#nprogress {\n pointer-events: none;\n}\n\n#nprogress .bar {\n background: #29d;\n\n position"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/nprogress/nprogress.js",
"chars": 11565,
"preview": "/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress\n * @license MIT */\n\n;(function(root, fact"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/zTree/css/metroStyle/metroStyle.css",
"chars": 6576,
"preview": "/*-------------------------------------\nzTree Style\n\nversion: 3.4\nauthor: Hunter.z\nemail: hunter.z@263.net\nw"
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/zTree/js/jquery.ztree.core.js",
"chars": 75163,
"preview": "/*\n * JQuery zTree core\n * v3.5.48\n * http://treejs.cn/\n *\n * Copyright (c) 2010 Hunter.z\n *\n * Licensed same as jquery "
},
{
"path": "xxl-job-admin/src/main/resources/static/plugins/zTree/js/jquery.ztree.excheck.js",
"chars": 25124,
"preview": "/*\n * JQuery zTree excheck\n * v3.5.42\n * http://treejs.cn/\n *\n * Copyright (c) 2010 Hunter.z\n *\n * Licensed same as jque"
},
{
"path": "xxl-job-admin/src/main/resources/templates/base/dashboard.ftl",
"chars": 12764,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <#-- import macro -->\n <#import \"../common/common.macro.ftl\" as netCommon>\n\n <!-"
},
{
"path": "xxl-job-admin/src/main/resources/templates/base/help.ftl",
"chars": 996,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n\t<#-- import macro -->\n\t<#import \"../common/common.macro.ftl\" as netCommon>\n\n\t<!-- 1-style"
},
{
"path": "xxl-job-admin/src/main/resources/templates/base/index.ftl",
"chars": 7737,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n <#-- import macro -->\n <#import \"../common/common.macro.ftl\" as netCommon>\n\n <!-"
},
{
"path": "xxl-job-admin/src/main/resources/templates/base/login.ftl",
"chars": 3398,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n\t<#-- import macro -->\n\t<#import \"../common/common.macro.ftl\" as netCommon>\n\n\t<!-- 1-style"
},
{
"path": "xxl-job-admin/src/main/resources/templates/biz/group.list.ftl",
"chars": 13443,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n\t<#-- import macro -->\n\t<#import \"../common/common.macro.ftl\" as netCommon>\n\n\t<!-- 1-style"
},
{
"path": "xxl-job-admin/src/main/resources/templates/biz/job.code.ftl",
"chars": 9177,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n\t<#-- import macro -->\n\t<#import \"../common/common.macro.ftl\" as netCommon>\n\n\t<!-- 1-style"
},
{
"path": "xxl-job-admin/src/main/resources/templates/biz/job.list.ftl",
"chars": 49959,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n\t<#-- import macro -->\n\t<#import \"../common/common.macro.ftl\" as netCommon>\n\n\t<!-- 1-style"
},
{
"path": "xxl-job-admin/src/main/resources/templates/biz/log.detail.ftl",
"chars": 5113,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n\t<#-- import macro -->\n\t<#import \"../common/common.macro.ftl\" as netCommon>\n\n\t<!-- 1-style"
},
{
"path": "xxl-job-admin/src/main/resources/templates/biz/log.list.ftl",
"chars": 17416,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n\t<#-- import macro -->\n\t<#import \"../common/common.macro.ftl\" as netCommon>\n\n\t<!-- 1-style"
},
{
"path": "xxl-job-admin/src/main/resources/templates/biz/user.list.ftl",
"chars": 11523,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n\t<#-- import macro -->\n\t<#import \"../common/common.macro.ftl\" as netCommon>\n\n\t<!-- 1-style"
},
{
"path": "xxl-job-admin/src/main/resources/templates/common/common.errorpage.ftl",
"chars": 1208,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n\t<#-- import macro -->\n\t<#import \"../common/common.macro.ftl\" as netCommon>\n\n\t<meta charse"
},
{
"path": "xxl-job-admin/src/main/resources/templates/common/common.macro.ftl",
"chars": 2343,
"preview": "<#-- import: style -->\n<#macro commonStyle>\n\n<#-- i18n -->\n<#global I18n = I18nUtil.getMultString()?eval />\n<#-- title、f"
},
{
"path": "xxl-job-admin/src/test/java/com/xxl/job/admin/controller/AbstractSpringMvcTest.java",
"chars": 729,
"preview": "package com.xxl.job.admin.controller;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.springframework.beans.factory"
},
{
"path": "xxl-job-admin/src/test/java/com/xxl/job/admin/controller/JobInfoControllerTest.java",
"chars": 1607,
"preview": "package com.xxl.job.admin.controller;\n\nimport com.xxl.sso.core.constant.Const;\nimport jakarta.servlet.http.Cookie;\nimpor"
},
{
"path": "xxl-job-admin/src/test/java/com/xxl/job/admin/core/util/CronExpressionTest.java",
"chars": 720,
"preview": "package com.xxl.job.admin.core.util;\n\nimport com.xxl.job.admin.scheduler.cron.CronExpression;\nimport com.xxl.tool.core.D"
},
{
"path": "xxl-job-admin/src/test/java/com/xxl/job/admin/core/util/JacksonUtilTest.java",
"chars": 1084,
"preview": "//package com.xxl.job.admin.core.util;\n//\n//import com.xxl.job.admin.util.JacksonUtil;\n//import org.junit.jupiter.api.Te"
},
{
"path": "xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobGroupMapperTest.java",
"chars": 1303,
"preview": "package com.xxl.job.admin.mapper;\n\nimport com.xxl.job.admin.model.XxlJobGroup;\nimport jakarta.annotation.Resource;\nimpor"
},
{
"path": "xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobInfoMapperTest.java",
"chars": 2872,
"preview": "package com.xxl.job.admin.mapper;\n\nimport com.xxl.job.admin.model.XxlJobInfo;\nimport com.xxl.job.admin.scheduler.misfire"
},
{
"path": "xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobLogGlueMapperTest.java",
"chars": 1000,
"preview": "package com.xxl.job.admin.mapper;\n\nimport com.xxl.job.admin.model.XxlJobLogGlue;\nimport jakarta.annotation.Resource;\nimp"
},
{
"path": "xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobLogMapperTest.java",
"chars": 1515,
"preview": "package com.xxl.job.admin.mapper;\n\nimport com.xxl.job.admin.model.XxlJobLog;\nimport jakarta.annotation.Resource;\nimport "
},
{
"path": "xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobLogReportMapperTest.java",
"chars": 1062,
"preview": "package com.xxl.job.admin.mapper;\n\nimport com.xxl.job.admin.model.XxlJobLogReport;\nimport com.xxl.tool.core.DateTool;\nim"
},
{
"path": "xxl-job-admin/src/test/java/com/xxl/job/admin/mapper/XxlJobRegistryMapperTest.java",
"chars": 1665,
"preview": "package com.xxl.job.admin.mapper;\n\nimport com.xxl.job.admin.model.XxlJobRegistry;\nimport com.xxl.job.core.constant.Regis"
},
{
"path": "xxl-job-admin/src/test/java/com/xxl/job/admin/schedule/JobScheduleTest.java",
"chars": 1857,
"preview": "package com.xxl.job.admin.schedule;\n\nimport com.xxl.job.admin.scheduler.config.XxlJobAdminBootstrap;\nimport com.xxl.tool"
},
{
"path": "xxl-job-admin/src/test/java/com/xxl/job/admin/util/I18nUtilTest.java",
"chars": 664,
"preview": "package com.xxl.job.admin.util;\n\nimport org.junit.jupiter.api.Test;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFact"
},
{
"path": "xxl-job-admin/src/test/java/com/xxl/job/openapi/AdminBizTest.java",
"chars": 2706,
"preview": "package com.xxl.job.openapi;\n\nimport com.xxl.job.core.constant.RegistType;\nimport com.xxl.job.core.openapi.AdminBiz;\nimp"
},
{
"path": "xxl-job-admin/src/test/java/com/xxl/job/openapi/ExecutorBizTest.java",
"chars": 3666,
"preview": "package com.xxl.job.openapi;\n\nimport com.xxl.job.core.constant.Const;\nimport com.xxl.job.core.openapi.ExecutorBiz;\nimpor"
},
{
"path": "xxl-job-core/pom.xml",
"chars": 1843,
"preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLoca"
},
{
"path": "xxl-job-core/src/main/java/com/xxl/job/core/constant/Const.java",
"chars": 578,
"preview": "package com.xxl.job.core.constant;\n\n/**\n * Created by xuxueli on 17/5/10.\n */\npublic class Const {\n\n // -------------"
},
{
"path": "xxl-job-core/src/main/java/com/xxl/job/core/constant/ExecutorBlockStrategyEnum.java",
"chars": 893,
"preview": "package com.xxl.job.core.constant;\n\n/**\n * Created by xuxueli on 17/5/9.\n */\npublic enum ExecutorBlockStrategyEnum {\n\n "
},
{
"path": "xxl-job-core/src/main/java/com/xxl/job/core/constant/RegistType.java",
"chars": 209,
"preview": "package com.xxl.job.core.constant;\n\n/**\n * Created by xuxueli on 17/5/9.\n */\npublic enum RegistType{\n\n /**\n * exe"
},
{
"path": "xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobContext.java",
"chars": 3286,
"preview": "package com.xxl.job.core.context;\n\n/**\n * xxl-job context\n *\n * @author xuxueli 2020-05-21\n * [Dear hj]\n */\npublic class"
},
{
"path": "xxl-job-core/src/main/java/com/xxl/job/core/context/XxlJobHelper.java",
"chars": 7507,
"preview": "package com.xxl.job.core.context;\n\nimport com.xxl.job.core.log.XxlJobFileAppender;\nimport com.xxl.tool.core.DateTool;\nim"
},
{
"path": "xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java",
"chars": 11704,
"preview": "package com.xxl.job.core.executor;\n\nimport com.xxl.job.core.constant.Const;\nimport com.xxl.job.core.openapi.AdminBiz;\nim"
},
{
"path": "xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSimpleExecutor.java",
"chars": 1842,
"preview": "package com.xxl.job.core.executor.impl;\n\nimport com.xxl.job.core.executor.XxlJobExecutor;\nimport com.xxl.job.core.handle"
},
{
"path": "xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java",
"chars": 7179,
"preview": "package com.xxl.job.core.executor.impl;\n\nimport com.xxl.job.core.executor.XxlJobExecutor;\nimport com.xxl.job.core.glue.G"
}
]
// ... and 68 more files (download for full content)
About this extraction
This page contains the full source code of the xuxueli/xxl-job GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 268 files (2.9 MB), approximately 784.3k tokens, and a symbol index with 1979 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.