Skip to content

Commit e0cf590

Browse files
committed
Improve MessageChannelPartitionHandler::receiveReplies
1. Message payload not always be `Set`, if you return payload directly, you will see tests failed: ``` [main] ERROR org.springframework.batch.core.step.AbstractStep - Encountered an error executing step step1-manager in job job1 java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class java.util.Set (java.util.ArrayList and java.util.Set are in module java.base of loader 'bootstrap') at org.springframework.batch.integration.partition.MessageChannelPartitionHandler.receiveReplies(MessageChannelPartitionHandler.java:298) at org.springframework.batch.integration.partition.MessageChannelPartitionHandler.doHandle(MessageChannelPartitionHandler.java:244) at org.springframework.batch.core.partition.support.AbstractPartitionHandler.handle(AbstractPartitionHandler.java:60) at org.springframework.batch.core.partition.support.PartitionStep.doExecute(PartitionStep.java:102) at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:230) at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:153) 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:165) at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:140) at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:132) at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:307) at org.springframework.batch.core.launch.support.TaskExecutorJobLauncher$1.run(TaskExecutorJobLauncher.java:155) at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50) at org.springframework.batch.core.launch.support.TaskExecutorJobLauncher.run(TaskExecutorJobLauncher.java:146) at org.springframework.batch.integration.partition.VanillaIntegrationTests.testLaunchJob(VanillaIntegrationTests.java:58) ``` 2. No need to create a new `HashSet` if payload is `Set` since no modifications applied to it. Signed-off-by: Yanming Zhou <[email protected]>
1 parent 961734b commit e0cf590

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

Diff for: spring-batch-integration/src/main/java/org/springframework/batch/integration/partition/MessageChannelPartitionHandler.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2009-2024 the original author or authors.
2+
* Copyright 2009-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
1515
*/
1616
package org.springframework.batch.integration.partition;
1717

18+
import java.util.Collection;
1819
import java.util.HashSet;
1920
import java.util.List;
2021
import java.util.Set;
@@ -83,6 +84,7 @@
8384
* @author Will Schipp
8485
* @author Michael Minella
8586
* @author Mahmoud Ben Hassine
87+
* @author Yanming Zhou
8688
*
8789
*/
8890
@MessageEndpoint
@@ -286,7 +288,7 @@ private Set<StepExecution> pollReplies(final StepExecution managerStepExecution,
286288

287289
@SuppressWarnings("unchecked")
288290
private Set<StepExecution> receiveReplies(PollableChannel currentReplyChannel) {
289-
Message<Set<StepExecution>> message = (Message<Set<StepExecution>>) messagingGateway
291+
Message<Collection<StepExecution>> message = (Message<Collection<StepExecution>>) messagingGateway
290292
.receive(currentReplyChannel);
291293

292294
if (message == null) {
@@ -296,7 +298,8 @@ else if (logger.isDebugEnabled()) {
296298
logger.debug("Received replies: " + message);
297299
}
298300

299-
return new HashSet<>(message.getPayload());
301+
Collection<StepExecution> payload = message.getPayload();
302+
return payload instanceof Set ? (Set<StepExecution>) payload : new HashSet<>(message.getPayload());
300303
}
301304

302305
private Message<StepExecutionRequest> createMessage(int sequenceNumber, int sequenceSize,

0 commit comments

Comments
 (0)