Spring Batch LocalTaskLauncher启动报错:参数列表过长
Spring Batch LocalTaskLauncher启动Worker时参数列表过长问题
我在用LocalTaskLauncher启动Spring Batch Worker时遇到参数列表过长的错误,相关核心代码如下:
HashMap<String, String> args = new HashMap<>(request.getDefinition().getProperties()); args.put(JMX_DEFAULT_DOMAIN_KEY, taskLaunchId); args.put("endpoints.shutdown.enabled", "true"); args.put("endpoints.jmx.unique-names", "true"); try { Path workDir = createWorkingDirLocal(request.getDeploymentProperties(), taskLaunchId); int port = calcServerPort(request, true, args); ProcessBuilder builder = buildProcessBuilder(request, args, Optional.empty(), taskLaunchId).inheritIO(); TaskInstance instance = new TaskInstance(builder, workDir, port); if (this.shouldInheritLogging(request)) { instance.start(builder); log.info("launching task {} Logs will be inherited.", taskLaunchId); } else { instance.start(builder, getLocalDeployerProperties().isDeleteFilesOnExit()); log.info("launching task {} Logs will be in {}", taskLaunchId, workDir); } running.put(taskLaunchId, instance); }
运行测试用例时抛出如下错误:
Encountered an error executing step BatchJob:masterStep in job BatchJob [SimpleAsyncTaskExecutor-1] [] com.example.exceptions.ApplicationException: UNABLE_TO_INITIALIZE_BATCH at com.example.batch.tasklauncher.BatchLocalTaskLauncher.launch(BatcLocalTaskLauncher.java:108) at org.springframework.cloud.task.batch.partition.DeployerPartitionHandler.launchWorker(DeployerPartitionHandler.java:394) at org.springframework.cloud.task.batch.partition.DeployerPartitionHandler.launchWorkers(DeployerPartitionHandler.java:313) at org.springframework.cloud.task.batch.partition.DeployerPartitionHandler.handle(DeployerPartitionHandler.java:302) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:137) at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:124) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) at com.sun.proxy.$Proxy340.handle(Unknown Source) at org.springframework.batch.core.partition.support.PartitionStep.doExecute(PartitionStep.java:106) at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:208) at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:152) at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:68) at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:68) at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:169) at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:144) at org.springframework.batch.core.job.flow.support.state.SplitState$1.call(SplitState.java:94) at org.springframework.batch.core.job.flow.support.state.SplitState$1.call(SplitState.java:91) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: java.io.IOException: Cannot run program "/usr/lib/jvm/jdk-11.0.1/bin/java" (in directory "/tmp/85075662064908/BatchJobworker-65044ddf-f133-4894-a8a6-588ef994c89c"): error=7, Argument list too long at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128) at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071) at com.example.batch.tasklauncher.BatchLocalTaskLauncher$TaskInstance.start(BatchLocalTaskLauncher.java:253) at com.example.batch.tasklauncher.BatchLocalTaskLauncher.launch(BatchLocalTaskLauncher.java:102) ... 26 common frames omitted Caused by: java.io.IOException: error=7, Argument list too long at java.base/java.lang.ProcessImpl.forkAndExec(Native Method) at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:340) at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:271) at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107) ... 29 common frames omitted
技术栈
- Spring Boot: 2.7.2
- Spring Batch: 2.7.2
- Spring Cloud Deployer Local: 2.7.2
已尝试的无效方案
- 增大系统
ARG_MAX值 - 提高
ulimit限制 - 手动从args映射中移除
surefire.test.class.path和java.class.path键,但这些参数仍会被自动传入构建的命令中
核心问题
由于无法减少Master传递给Worker的环境变量大小,请问能否配置LocalTaskLauncher通过JAR清单或argfile传递环境变量?
内容的提问来源于stack exchange,提问作者Abhinav Sharma
相关产品推荐
相关产品推荐

