Common questions about managing, troubleshooting, and configuring jobs in SchedulerX.
Error troubleshooting
Spring application cannot find beans
Work through these checks in order:
Go to the Application Management page and click the number in the Total number of instances column for your application. Confirm the boot mode is Spring or Spring Boot.
Make sure
JobProcessoris injected as a bean in your code -- for example, by adding the@Componentannotation.If your
pom.xmlincludes thespring-boot-devtoolsdependency, remove it. This dependency causes class-loading conflicts with SchedulerX.If your
JobProcessoror itsprocessmethod uses any aspect-oriented programming (AOP) annotation, upgrade the SchedulerX agent to the latest version. Earlier versions do not support AOP annotations.Check whether beans are proxied by unintended aspects. Add breakpoints to the
DefaultListableBeanFactoryclass and inspectbeanDefinitionNamesto see all registered beans. If any are proxied by aspects from indirectly imported libraries, remove those aspects.

If none of these steps resolve the issue, debug ThreadContainer.start. A class.forName error for a class that exists typically means the Spring framework and the SchedulerXWorker agent are using different class loaders. Fix this by calling SchedulerxWorker.setClassLoader with the correct class loader.
Error: Unable to make field private
MapReduce jobs use serialization and deserialization frameworks that require reflective access to private fields. Java 9 and later restrict this access by default. Add the following JVM parameter:
--add-opens java.base/java.lang=ALL-UNNAMEDError: submit jobInstanceId to worker timeout
If this error occurs during application deployments or only occasionally, it is safe to ignore.
If the error persists and the workAddr in each occurrence is the same, the persistent connection between the server and the agent has dropped. Restart the affected worker node, or upgrade the SchedulerX agent to the latest version. The connection recovers automatically after either action.
Error: used space beyond 90.0%!
The disk on your Elastic Compute Service (ECS) instance or container is full. Free up disk space to resolve this.
Error: ClassNotFoundException
The worker running the job does not have the specified class. Verify that the Processor class name for the Java job is the fully qualified class path (for example, com.example.MyJobProcessor).
If the class name is correct but the class is still missing from the worker, the likely cause is an incorrect deployment package or a connection to the wrong worker. Log on to the worker and use Java decompilation to inspect the deployed classes.
Error: jobInstance=xxx don't update progress more than 60s
When a running worker fails to report progress for 60 seconds, the server forcibly terminates it. If the worker crashed or no longer exists, this is expected behavior and can be ignored.
Job fails with no error message
This usually means your business logic failed without throwing an exception.
To investigate:
Open the Execution List page and click the Task instance List tab. Find the job and click Details in the Operation column. If no task details are available, the job is a standalone job. The WorkAddr on the Basic information tab identifies which worker ran the job.
Log on to that worker and open ~/logs/schedulerx/worker.log. Run the following command to filter logs for the specific instance:
grep <Instance ID> worker.logIf the error description is empty, the failure is in your business logic. Check your application code for unhandled exceptions or silent failures.
If the error points to a SchedulerX framework exception, join DingTalk group 23103656 for technical support.
Diagnosing job failures
Identify the cause of a job failure
The approach depends on your job type and SchedulerX edition:
| Scenario | Action |
|---|---|
| Standalone job with an exception | Open the Execution List page, click the Task instance List tab, find the job, and click Details in the Operation column to view the error message. |
| No exception, or distributed job (Professional Edition) | Use Log Service to search and analyze execution logs. |
| Basic Edition | Log on to the worker node and check both the SchedulerX logs (~/logs/schedulerx/worker.log) and your application logs. |
Job stuck in running state
If the issue is caused by business logic (for example, a deadlock or infinite loop), use one of these approaches:
Professional Edition: Use the ThreadDump feature in the console to capture the thread stack. This feature requires agent version 1.4.2 or later.
Basic Edition: Log on to the worker node and run:
jstack <pid> | grep <Instance ID> -A 20

If the issue is not related to business logic, join DingTalk group 23103656 for technical support.
Slow job execution
Enable the Tracing Analysis feature in Professional Edition for end-to-end performance analysis. For details, see Integrate tracing analysis.
Job stuck or slow during application deployment
For distributed jobs, when a worker goes offline during deployment, SchedulerX redistributes its tasks and polls for online workers. This can slow down the entire job.
Upgrade the agent to version 1.7.9 or later to resolve this issue.
Scheduling behavior
Job not triggered at the expected time
If a standalone job is not triggered, check the following:
Open the Application Management page and verify that workers appear in the worker list.
Confirm that not all workers are in the Busy state. For details on handling busy workers, see What to do when all workers are busy.
For related connection issues, see What do I do if the system displays the message "no workers available"?.
Turn on the No machine alarm available switch to receive alerts when no workers are available. For configuration details, see Job management.
What happens when a job does not finish before the next scheduled run
The default Instance concurrency is 1, meaning only one instance of the job runs at a time. If a job is still running when the next trigger time arrives, the new run is discarded -- it is not queued.
To allow overlapping runs, increase Instance concurrency. For example, setting it to 2 allows up to two instances of the same job to run simultaneously.
Create a one-time job
Set the Time type parameter to one_time. The job runs once and is then automatically destroyed. No execution records are kept.
View history for a one-time job
One-time jobs are destroyed after execution, so no historical records are available by default. To retain execution logs for up to two weeks, enable Log Service. For details, see Application management.
Set up second-delay scheduling
Set the Time type parameter to second_delay. The job runs repeatedly, with each run starting after a specified delay from the end of the previous run.
Jobs with Time type set to cron or fix_rate do not support second-delay scheduling.
Set the timeout period
SchedulerX supports timeout settings for jobs, but not for individual tasks. Configure the timeout in the console. For details, see Job management.
Instance concurrency and lifecycle
Error: The number of concurrent job instances reaches the upper limit
This error appears when you click Run once and the job already has the maximum number of instances running (as defined by Instance concurrency).
To check which instances are running, go to the Task Management page, find the job, and choose in the Operation column.
To increase the limit, click Edit for the job and change the Instance concurrency value in Advanced Configuration.
Job keeps running after stopping an instance
After you stop a job instance, SchedulerX sends a Kill message to the agent. The agent then:
Stops delivering new tasks.
Destroys the instance context and all thread pools.
Interrupts threads for tasks that are already executing.
However, tasks that are mid-execution continue running until they complete -- the interrupt signal only requests a stop, it does not force one.
To stop tasks immediately: Modify your task processing logic to check for the interrupt state on the current thread and exit gracefully when detected.
Worker management
What to do when all workers are busy
Go to the Application Management page and click View instances for the application.
Identify workers in the Busy state. Hover over Busy to see which metrics exceed the threshold.
To adjust thresholds, click Edit for the application and update the settings in the Edit application grouping panel.
Kubernetes deployments: If the CPU utilization metric appears incorrect, it may be because the agent is reading host-level metrics instead of container-level metrics. Add the following configuration:
| Key | Description | Value | Minimum version |
|---|---|---|---|
spring.schedulerx2.enableCgroupMetrics | Use control groups (cgroups) to collect agent metrics in Kubernetes | true or false (default: false) | 1.2.2.2 |
spring.schedulerx2.cgroupPathPrefix | Cgroup path in the container | Default: /sys/fs/cgroup/cpu/ | 1.2.2.2 |
For setup instructions, see Connect a Spring Boot application to SchedulerX.
Job parameters
What is the instance parameters field in the Run once dialog
When you click Run once on the Task Management page, the Instance Parameters field is optional. It is intended for testing and lets you pass parameters to a single manual run without changing the job configuration.
Instance parameters vs. job parameters
Instance parameters and job parameters are separate values. Which one your code reads depends on your implementation. Access either through JobContext:
@Component
public class JavaDemoProcessor extends JavaProcessor {
private static final Logger LOGGER = LoggerFactory.getLogger("schedulerxLog");
@Override
public ProcessResult process(JobContext jobContext) throws InterruptedException {
// Get job parameters (configured in the job definition)
String jobParameters = jobContext.getJobParameters();
// Get instance parameters (passed via Run once dialog)
String instanceParameters = jobContext.getInstanceParameters();
LOGGER.info("Job parameters: " + jobParameters);
LOGGER.info("Instance parameters: " + instanceParameters);
return new ProcessResult(InstanceStatus.SUCCESS);
}
}Fall back to job parameters when no instance parameters are set
Read instance parameters when available, and fall back to job parameters otherwise:
@Component
public class JavaDemoProcessor extends JavaProcessor {
private static final Logger LOGGER = LoggerFactory.getLogger("schedulerxLog");
@Override
public ProcessResult process(JobContext jobContext) throws InterruptedException {
String params;
if (StringUtils.isNotBlank(jobContext.getInstanceParameters())) {
params = jobContext.getInstanceParameters();
} else {
params = jobContext.getJobParameters();
}
LOGGER.info("JavaDemoProcessor params: {}", params);
return new ProcessResult(InstanceStatus.SUCCESS);
}
}Advanced configuration
Configure advanced job settings
For the full list of advanced parameters (retry policies, data expiration, custom alarm rules, and more), see Advanced parameters for job management.
Integrate tracing analysis
SchedulerX supports end-to-end tracing for job execution. For setup instructions, see Integrate tracing analysis.