I'm writing a batch that reads from one table that returns let's say X. And for every X I'm making rest api requests in the processor and I'm writing the response to the another table in the writer. For every X I'm writing 0..N records to another table.
I want to read 10 items per page, and I want to process these items using 5 threads after processing I want to write response data to the db.
For this architecture, I'm using HibernatePagingItemReader for ItemReader with a pageSize of 10 for example. And I'm using AsyncItemProcessor for processing and AsyncItemWriter for write part. And my chunkSize is same with pageSize.
My problem is, I'm logging X's id in the ItemProcessor (also in the itemread listener) and in different threads I see the same X getting read/processed. How can I fix this?
My code looks something like this;
public class MyItemReader extends HibernatePagingItemReader<X> {
public MyItemReader(SessionFactory sessionFactory, Integer pageSize) { // Reader constructor.
setSessionFactory(sessionFactory);
setName("MyItemReader");
setPageSize(pageSize);
setQueryString(getQuery());
setParameterValues(getQueryParams());
setSaveState(false);
}
}
@Bean
public ItemReader<X> myItemReader() {
return new MyItemReader(sessionFactory, pageSize);
}
@SneakyThrows
@Bean
@StepScope
public AsyncItemProcessor<X, Y> myItemProcessor() {
var asyncItemProcessor = new AsyncItemProcessor<X, Y>();
asyncItemProcessor.setDelegate(new MyItemProcessor());
asyncItemProcessor.setTaskExecutor(taskExecutor());
asyncItemProcessor.afterPropertiesSet();
return asyncItemProcessor;
}
@SneakyThrows
@Bean
public AsyncItemWriter<Y> myItemWriter() {
var asyncItemWriter = new AsyncItemWriter<Y>();
asyncItemWriter.setDelegate(new MyItemWriter(repository));
asyncItemWriter.afterPropertiesSet();
return asyncItemWriter;
}
@Bean
public TaskExecutor taskExecutor() {
SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor();
executor.setConcurrencyLimit(getNumberOfThreads());
executor.setThreadNamePrefix("Thread-");
return executor;
}
@Bean
public Step myStoreStep() {
return baseStep("myStep")
.<X, Future<Y>>chunk(chunkSize)
.reader(myItemReader())
.processor(myItemProcessor())
.writer(myItemWriter())
.taskExecutor(taskExecutor())
.build();
}
Update: I changed the question title because the problem stems from HibernatePagingItemReader not the AsyncItemProcessor
As mentioned in the comment, I think the listener is misleading and makes you think items are processed more than once while they are not. Here is a sample output I get when running your sample:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.3)
2022-12-06 09:10:40.973 INFO 49865 --- [ main] c.f.s.SpringBatchPagingReaderApplication : No active profile set, falling back to default profiles: default
2022-12-06 09:10:41.391 INFO 49865 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2022-12-06 09:10:41.534 INFO 49865 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 132 ms. Found 1 JPA repository interfaces.
2022-12-06 09:10:41.588 INFO 49865 --- [ main] faultConfiguringBeanFactoryPostProcessor : No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created.
2022-12-06 09:10:41.601 INFO 49865 --- [ main] faultConfiguringBeanFactoryPostProcessor : No bean named 'integrationHeaderChannelRegistry' has been explicitly defined. Therefore, a default DefaultHeaderChannelRegistry will be created.
2022-12-06 09:10:41.757 INFO 49865 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.integration.config.IntegrationManagementConfiguration' of type [org.springframework.integration.config.IntegrationManagementConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2022-12-06 09:10:41.767 INFO 49865 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'integrationChannelResolver' of type [org.springframework.integration.support.channel.BeanFactoryChannelResolver] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2022-12-06 09:10:41.834 INFO 49865 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2022-12-06 09:10:41.989 INFO 49865 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2022-12-06 09:10:42.129 INFO 49865 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2022-12-06 09:10:42.181 INFO 49865 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.6.4.Final
2022-12-06 09:10:42.329 INFO 49865 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2022-12-06 09:10:42.456 INFO 49865 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
2022-12-06 09:10:42.966 INFO 49865 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2022-12-06 09:10:42.973 INFO 49865 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2022-12-06 09:10:43.264 WARN 49865 --- [ main] o.s.b.a.batch.JpaBatchConfigurer : JPA does not support custom isolation levels, so locks may not be taken when launching Jobs
2022-12-06 09:10:43.266 INFO 49865 --- [ main] o.s.b.c.r.s.JobRepositoryFactoryBean : No database type set, using meta data indicating: H2
2022-12-06 09:10:43.407 INFO 49865 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : No TaskExecutor has been set, defaulting to synchronous executor.
2022-12-06 09:10:43.589 INFO 49865 --- [ main] o.s.i.endpoint.EventDrivenConsumer : Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
2022-12-06 09:10:43.589 INFO 49865 --- [ main] o.s.i.channel.PublishSubscribeChannel : Channel 'application.errorChannel' has 1 subscriber(s).
2022-12-06 09:10:43.589 INFO 49865 --- [ main] o.s.i.endpoint.EventDrivenConsumer : started bean '_org.springframework.integration.errorLogger'
2022-12-06 09:10:43.599 INFO 49865 --- [ main] c.f.s.SpringBatchPagingReaderApplication : Started SpringBatchPagingReaderApplication in 2.909 seconds (JVM running for 3.477)
2022-12-06 09:10:43.600 INFO 49865 --- [ main] o.s.b.a.b.JobLauncherApplicationRunner : Running default command line with: []
2022-12-06 09:10:43.649 INFO 49865 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=myJob]] launched with the following parameters: [{}]
2022-12-06 09:10:43.684 INFO 49865 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [myStep]
2022-12-06 09:10:43.807 INFO 49865 --- [ main] o.s.batch.core.step.AbstractStep : Step: [myStep] executed in 123ms
2022-12-06 09:10:43.812 INFO 49865 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=myJob]] completed with the following parameters: [{}] and the following status: [COMPLETED] in 139ms
2022-12-06 09:10:43.896 INFO 49865 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=myJob]] launched with the following parameters: [{time=1670314243893}]
2022-12-06 09:10:43.900 INFO 49865 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [myStep]
2022-12-06 09:10:43.907 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=cd600a96-18e4-48b2-ad3d-507781ff56e4, name=Entity-49-processed, date=2022-12-06T09:10:43.907659)
2022-12-06 09:10:43.907 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=d83d45e0-b2dd-4a39-a485-3ed2b9006d3d, name=Entity-47-processed, date=2022-12-06T09:10:43.907659)
2022-12-06 09:10:43.907 INFO 49865 --- [ Thread-3] c.f.springbatchpagingreader.MyProcessor : Thread-3 processed: MyEntity(id=0a81a593-15aa-4b94-a2a7-289b26cb7cb6, name=Entity-48-processed, date=2022-12-06T09:10:43.907659)
2022-12-06 09:10:43.908 INFO 49865 --- [ Thread-3] c.f.springbatchpagingreader.MyProcessor : Thread-3 processed: MyEntity(id=3a0c3a43-8cff-416b-ae56-dee6eef55510, name=Entity-44-processed, date=2022-12-06T09:10:43.908829)
2022-12-06 09:10:43.908 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=ef579965-754b-469f-938d-07d100ca604f, name=Entity-45-processed, date=2022-12-06T09:10:43.908829)
2022-12-06 09:10:43.908 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=520d30e1-0949-4d11-94f4-2e2639dcbf8a, name=Entity-46-processed, date=2022-12-06T09:10:43.908829)
2022-12-06 09:10:43.909 INFO 49865 --- [ Thread-3] c.f.springbatchpagingreader.MyProcessor : Thread-3 processed: MyEntity(id=60a7ec08-5d2c-40e9-a74c-4c49ec564439, name=Entity-41-processed, date=2022-12-06T09:10:43.909266)
2022-12-06 09:10:43.909 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=301d0531-7789-4bc4-866c-a57edf9b0b4d, name=Entity-43-processed, date=2022-12-06T09:10:43.909266)
2022-12-06 09:10:43.909 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=1a141f30-53bf-4a3d-958c-832719efb9dd, name=Entity-42-processed, date=2022-12-06T09:10:43.909266)
2022-12-06 09:10:43.919 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=8fd7ef68-a5f6-49f2-a63b-4e00db9743a6, name=Entity-40-processed, date=2022-12-06T09:10:43.919006)
2022-12-06 09:10:43.919 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=ab1cf7b8-16f7-40a0-a796-d452100f95c7, name=Entity-39-processed, date=2022-12-06T09:10:43.919291)
2022-12-06 09:10:43.919 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=f01dbb6d-4de4-425d-ad92-636de972f46b, name=Entity-38-processed, date=2022-12-06T09:10:43.919423)
2022-12-06 09:10:43.919 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=5539c0ed-09a4-4bb7-bbfd-8e25c23d4100, name=Entity-37-processed, date=2022-12-06T09:10:43.919760)
2022-12-06 09:10:43.919 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=a04658ec-95df-45bf-97d6-0737e11c5e08, name=Entity-36-processed, date=2022-12-06T09:10:43.919872)
2022-12-06 09:10:43.919 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=e6482b80-7e6a-46b2-bb1d-ff3adca3ef6f, name=Entity-35-processed, date=2022-12-06T09:10:43.919963)
2022-12-06 09:10:43.923 INFO 49865 --- [ Thread-3] c.f.springbatchpagingreader.MyProcessor : Thread-3 processed: MyEntity(id=a7b8d0ba-5bb8-4f09-9100-e4b0340fdb09, name=Entity-34-processed, date=2022-12-06T09:10:43.923216)
2022-12-06 09:10:43.923 INFO 49865 --- [ Thread-3] c.f.springbatchpagingreader.MyProcessor : Thread-3 processed: MyEntity(id=853af3e1-ea1b-406a-b672-4910b9c2d1fc, name=Entity-33-processed, date=2022-12-06T09:10:43.923413)
2022-12-06 09:10:43.923 INFO 49865 --- [ Thread-3] c.f.springbatchpagingreader.MyProcessor : Thread-3 processed: MyEntity(id=ec5e260e-ebd7-49e1-bbff-d7283ad660c6, name=Entity-32-processed, date=2022-12-06T09:10:43.923511)
2022-12-06 09:10:43.923 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=78789cdd-0dfa-417c-80b3-197424062cae, name=Entity-31-processed, date=2022-12-06T09:10:43.923901)
2022-12-06 09:10:43.924 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=5be18675-c5d9-435b-b896-1caac625da9e, name=Entity-30-processed, date=2022-12-06T09:10:43.924022)
2022-12-06 09:10:43.924 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=a46d8233-ac18-4dea-a173-c1c314d2cec8, name=Entity-29-processed, date=2022-12-06T09:10:43.924164)
2022-12-06 09:10:43.925 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=f918ed0b-5d66-4eca-b110-af0ed99419f7, name=Entity-28-processed, date=2022-12-06T09:10:43.925106)
2022-12-06 09:10:43.925 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=00ae2964-d5e7-43fa-acc2-eb5c1d471b57, name=Entity-27-processed, date=2022-12-06T09:10:43.925260)
2022-12-06 09:10:43.925 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=0d3f4907-d8e5-488b-a81f-ec48dfcd78a0, name=Entity-26-processed, date=2022-12-06T09:10:43.925350)
2022-12-06 09:10:43.928 INFO 49865 --- [ Thread-3] c.f.springbatchpagingreader.MyProcessor : Thread-3 processed: MyEntity(id=e6277d2a-c42c-4bb9-b547-ac2bbec529cb, name=Entity-25-processed, date=2022-12-06T09:10:43.928304)
2022-12-06 09:10:43.928 INFO 49865 --- [ Thread-3] c.f.springbatchpagingreader.MyProcessor : Thread-3 processed: MyEntity(id=6af2be3a-d37f-4c8e-9e84-0f0e8dd345a1, name=Entity-24-processed, date=2022-12-06T09:10:43.928496)
2022-12-06 09:10:43.928 INFO 49865 --- [ Thread-3] c.f.springbatchpagingreader.MyProcessor : Thread-3 processed: MyEntity(id=2fe5047d-a372-4f7a-accb-7a92ab47badf, name=Entity-23-processed, date=2022-12-06T09:10:43.928595)
2022-12-06 09:10:43.929 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=e5bacc63-7e30-4f86-9f0f-58969e48627e, name=Entity-22-processed, date=2022-12-06T09:10:43.929452)
2022-12-06 09:10:43.929 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=1dbbcbe3-e7e8-4764-985b-5f4a460842f8, name=Entity-21-processed, date=2022-12-06T09:10:43.929629)
2022-12-06 09:10:43.929 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=a314e534-57f2-48bc-86fb-b8bbc864430c, name=Entity-20-processed, date=2022-12-06T09:10:43.929722)
2022-12-06 09:10:43.931 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=a632d843-cd28-451e-9ca7-9a67d267a7ed, name=Entity-19-processed, date=2022-12-06T09:10:43.931264)
2022-12-06 09:10:43.931 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=f8d0ce64-e806-46be-9412-f8907a68735e, name=Entity-18-processed, date=2022-12-06T09:10:43.931455)
2022-12-06 09:10:43.931 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=06041655-8260-4637-81f2-f35d6aac6aec, name=Entity-17-processed, date=2022-12-06T09:10:43.931546)
2022-12-06 09:10:43.932 INFO 49865 --- [ Thread-3] c.f.springbatchpagingreader.MyProcessor : Thread-3 processed: MyEntity(id=d703c25d-cb63-42e5-8d5b-e699ea410cf7, name=Entity-16-processed, date=2022-12-06T09:10:43.932924)
2022-12-06 09:10:43.933 INFO 49865 --- [ Thread-3] c.f.springbatchpagingreader.MyProcessor : Thread-3 processed: MyEntity(id=ad7d58de-4962-49ea-b9d2-37aa3ec1ccca, name=Entity-15-processed, date=2022-12-06T09:10:43.933123)
2022-12-06 09:10:43.933 INFO 49865 --- [ Thread-3] c.f.springbatchpagingreader.MyProcessor : Thread-3 processed: MyEntity(id=c907025d-a863-4701-ad7e-5d7c298e774b, name=Entity-14-processed, date=2022-12-06T09:10:43.933246)
2022-12-06 09:10:43.934 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=eba0c9b7-3aac-4e68-aa29-cf63643e3fac, name=Entity-13-processed, date=2022-12-06T09:10:43.934154)
2022-12-06 09:10:43.934 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=fef8acdd-9aa8-4a04-8489-2d2726c5495a, name=Entity-12-processed, date=2022-12-06T09:10:43.934340)
2022-12-06 09:10:43.934 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=a8933475-68bd-48a2-a486-7967a8c2ea0c, name=Entity-11-processed, date=2022-12-06T09:10:43.934464)
2022-12-06 09:10:43.936 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=c307bdfa-8946-434b-9ed2-6e4a4a8fa88d, name=Entity-10-processed, date=2022-12-06T09:10:43.936282)
2022-12-06 09:10:43.936 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=2335a872-a7f3-4e28-884b-5d930b3c3429, name=Entity-9-processed, date=2022-12-06T09:10:43.936448)
2022-12-06 09:10:43.936 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=3efd8445-ed6f-403f-a26d-6786700196ad, name=Entity-8-processed, date=2022-12-06T09:10:43.936534)
2022-12-06 09:10:43.937 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=24326a3b-9005-458c-a273-4cbdff51f43c, name=Entity-7-processed, date=2022-12-06T09:10:43.937383)
2022-12-06 09:10:43.937 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=b32b4bdc-52b9-4a27-8d32-1108d0db8abb, name=Entity-6-processed, date=2022-12-06T09:10:43.937544)
2022-12-06 09:10:43.937 INFO 49865 --- [ Thread-2] c.f.springbatchpagingreader.MyProcessor : Thread-2 processed: MyEntity(id=50e1d017-ab8b-4870-88d5-984e519037ae, name=Entity-5-processed, date=2022-12-06T09:10:43.937665)
2022-12-06 09:10:43.939 INFO 49865 --- [ Thread-3] c.f.springbatchpagingreader.MyProcessor : Thread-3 processed: MyEntity(id=5a7c0341-212f-442d-af5a-ce1517bf5761, name=Entity-4-processed, date=2022-12-06T09:10:43.939247)
2022-12-06 09:10:43.939 INFO 49865 --- [ Thread-3] c.f.springbatchpagingreader.MyProcessor : Thread-3 processed: MyEntity(id=b880c519-7d73-4851-9f19-48ce6da7bbe0, name=Entity-3-processed, date=2022-12-06T09:10:43.939438)
2022-12-06 09:10:43.939 INFO 49865 --- [ Thread-3] c.f.springbatchpagingreader.MyProcessor : Thread-3 processed: MyEntity(id=7a639650-6568-4d81-a3a9-fa7401ca1c6a, name=Entity-2-processed, date=2022-12-06T09:10:43.939539)
2022-12-06 09:10:43.940 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=da662b27-0297-472c-9f5a-21be2141ec38, name=Entity-1-processed, date=2022-12-06T09:10:43.940009)
2022-12-06 09:10:43.940 INFO 49865 --- [ Thread-1] c.f.springbatchpagingreader.MyProcessor : Thread-1 processed: MyEntity(id=6774f169-d6af-48d9-af1f-ec9897a7e6cb, name=Entity-0-processed, date=2022-12-06T09:10:43.940138)
2022-12-06 09:10:43.947 INFO 49865 --- [ main] o.s.batch.core.step.AbstractStep : Step: [myStep] executed in 47ms
2022-12-06 09:10:43.949 INFO 49865 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=myJob]] completed with the following parameters: [{time=1670314243893}] and the following status: [COMPLETED] in 52ms
I just changed your processor like follows:
@Slf4j
public class MyProcessor implements ItemProcessor<MyEntity, MyEntity> {
@Override
public MyEntity process(MyEntity myEntity) throws Exception {
myEntity.setName(myEntity.getName() + "-processed");
myEntity.setDate(LocalDateTime.now());
log.info(Thread.currentThread().getName() + " processed: {}", myEntity);
return myEntity;
}
}
and removed the listener from the step definition.
According to the output, items are processed concurrently by different threads, and there are no items processed twice. Some items are processed out of order (which is expected), like Entity-41
and Entity-44
. The total number of items is also correct (50 items in total). I have a similar output with a dozen executions.
So as mentioned in the comment, I cannot see how the same item could be read by two different threads because the AbstractPagingItemReader#doRead
method is synchronized on a lock . I'm not sure if the behaviour you are expecting from the listener is actually what you think is really happening (ie only one thread at a time is calling afterRead, even though you are using a concurrent map in the listener) to draw the initial conclusion.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.