diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/TaskletStep.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/TaskletStep.java index 077a9c530d..9db3acf393 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/TaskletStep.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/TaskletStep.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2018 the original author or authors. + * Copyright 2006-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,7 +46,6 @@ import org.springframework.transaction.interceptor.TransactionAttribute; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationAdapter; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.transaction.support.TransactionTemplate; import org.springframework.util.Assert; @@ -328,7 +327,7 @@ public Tasklet getTasklet() { * @author Dave Syer * */ - private class ChunkTransactionCallback extends TransactionSynchronizationAdapter implements TransactionCallback { + private class ChunkTransactionCallback implements TransactionSynchronization, TransactionCallback { private final StepExecution stepExecution; diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/ChunkOrientedStepIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/ChunkOrientedStepIntegrationTests.java index a4282f20b2..856646debb 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/ChunkOrientedStepIntegrationTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/ChunkOrientedStepIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2013 the original author or authors. + * Copyright 2006-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,7 +29,6 @@ import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.item.ItemReader; -import org.springframework.batch.item.ItemWriter; import org.springframework.batch.item.support.ListItemReader; import org.springframework.batch.repeat.policy.SimpleCompletionPolicy; import org.springframework.batch.repeat.support.RepeatTemplate; @@ -37,12 +36,11 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.support.TransactionSynchronizationAdapter; +import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; import java.util.Arrays; import java.util.Collections; -import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -93,19 +91,15 @@ public void onSetUp() throws Exception { @Ignore public void testStatusForCommitFailedException() throws Exception { - step.setTasklet(new TestingChunkOrientedTasklet<>(getReader(new String[] { "a", "b", "c" }), - new ItemWriter() { - @Override - public void write(List data) throws Exception { - TransactionSynchronizationManager - .registerSynchronization(new TransactionSynchronizationAdapter() { + step.setTasklet(new TestingChunkOrientedTasklet<>( + getReader(new String[]{"a", "b", "c"}), + data -> TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void beforeCommit(boolean readOnly) { throw new RuntimeException("Simulate commit failure"); } - }); - } - }, chunkOperations)); + }), + chunkOperations)); JobExecution jobExecution = jobRepository.createJobExecution(job.getName(), new JobParameters(Collections .singletonMap("run.id", new JobParameter(getClass().getName() + ".1")))); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/MongoItemWriter.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/MongoItemWriter.java index aaba4f9998..75a25e42f9 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/MongoItemWriter.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/MongoItemWriter.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,7 +31,7 @@ import org.springframework.data.mongodb.core.convert.MongoConverter; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; -import org.springframework.transaction.support.TransactionSynchronizationAdapter; +import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -191,7 +191,7 @@ private List getCurrentBuffer() { if(!TransactionSynchronizationManager.hasResource(bufferKey)) { TransactionSynchronizationManager.bindResource(bufferKey, new ArrayList()); - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void beforeCommit(boolean readOnly) { List items = (List) TransactionSynchronizationManager.getResource(bufferKey); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/support/transaction/TransactionAwareBufferedWriter.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/support/transaction/TransactionAwareBufferedWriter.java index 97e8348861..1875c6aa94 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/support/transaction/TransactionAwareBufferedWriter.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/support/transaction/TransactionAwareBufferedWriter.java @@ -22,7 +22,7 @@ import java.nio.channels.FileChannel; import org.springframework.batch.item.WriteFailedException; -import org.springframework.transaction.support.TransactionSynchronizationAdapter; +import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; /** @@ -95,7 +95,7 @@ private StringBuilder getCurrentBuffer() { TransactionSynchronizationManager.bindResource(bufferKey, new StringBuilder()); - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCompletion(int status) { clear(); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/support/transaction/TransactionAwareProxyFactory.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/support/transaction/TransactionAwareProxyFactory.java index 1c5d872ec5..4bca834cc5 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/support/transaction/TransactionAwareProxyFactory.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/support/transaction/TransactionAwareProxyFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2007 the original author or authors. + * Copyright 2006-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,7 +32,6 @@ import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.framework.ProxyFactory; import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationAdapter; import org.springframework.transaction.support.TransactionSynchronizationManager; /** @@ -194,7 +193,7 @@ public static List createTransactionalList(List list) { return new TransactionAwareProxyFactory<>(new CopyOnWriteArrayList<>(list)).createInstance(); } - private class TargetSynchronization extends TransactionSynchronizationAdapter { + private class TargetSynchronization implements TransactionSynchronization { private final T cache; @@ -208,7 +207,6 @@ public TargetSynchronization(Object key, T cache) { @Override public void afterCompletion(int status) { - super.afterCompletion(status); if (status == TransactionSynchronization.STATUS_COMMITTED) { synchronized (target) { commit(cache, target); diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/ResourcelessTransactionManagerTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/ResourcelessTransactionManagerTests.java index 2405689870..0f58a83fa6 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/ResourcelessTransactionManagerTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/ResourcelessTransactionManagerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2007 the original author or authors. + * Copyright 2006-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,10 +20,7 @@ import static org.junit.Assert.fail; import org.junit.Test; -import org.springframework.transaction.TransactionStatus; -import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationAdapter; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.transaction.support.TransactionTemplate; @@ -36,121 +33,95 @@ public class ResourcelessTransactionManagerTests { private int count = 0; @Test - public void testCommit() throws Exception { - new TransactionTemplate(transactionManager).execute(new TransactionCallback() { - @Override - public Void doInTransaction(TransactionStatus status) { - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { - @Override - public void afterCompletion(int status) { - super.afterCompletion(status); - txStatus = status; - } - }); - return null; - } + public void testCommit() { + new TransactionTemplate(transactionManager).execute(status -> { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCompletion(int status) { + txStatus = status; + } + }); + return null; }); assertEquals(TransactionSynchronization.STATUS_COMMITTED, txStatus); } @Test - public void testCommitTwice() throws Exception { + public void testCommitTwice() { testCommit(); txStatus = -1; - new TransactionTemplate(transactionManager).execute(new TransactionCallback() { - @Override - public Void doInTransaction(TransactionStatus status) { - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { - @Override - public void afterCompletion(int status) { - super.afterCompletion(status); - txStatus = status; - } - }); - return null; - } + new TransactionTemplate(transactionManager).execute(status -> { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCompletion(int status) { + txStatus = status; + } + }); + return null; }); assertEquals(TransactionSynchronization.STATUS_COMMITTED, txStatus); } @Test - public void testCommitNested() throws Exception { + public void testCommitNested() { final TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); - transactionTemplate.execute(new TransactionCallback() { - @Override - public Void doInTransaction(TransactionStatus status) { - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { - @Override - public void afterCompletion(int status) { - super.afterCompletion(status); - txStatus = status; - count++; - } - }); - transactionTemplate.execute(new TransactionCallback() { - @Override - public Void doInTransaction(TransactionStatus status) { - assertEquals(0, count); - count++; - return null; - } - }); - assertEquals(1, count); + transactionTemplate.execute(outerStatus -> { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCompletion(int status) { + txStatus = status; + count++; + } + }); + transactionTemplate.execute(innerStatus -> { + assertEquals(0, count); + count++; return null; - } + }); + assertEquals(1, count); + return null; }); assertEquals(TransactionSynchronization.STATUS_COMMITTED, txStatus); assertEquals(2, count); } @Test - public void testCommitNestedTwice() throws Exception { + public void testCommitNestedTwice() { testCommitNested(); count = 0; txStatus = -1; final TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); - transactionTemplate.execute(new TransactionCallback() { - @Override - public Void doInTransaction(TransactionStatus status) { - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { - @Override - public void afterCompletion(int status) { - super.afterCompletion(status); - txStatus = status; - count++; - } - }); - transactionTemplate.execute(new TransactionCallback() { - @Override - public Void doInTransaction(TransactionStatus status) { - assertEquals(0, count); - count++; - return null; - } - }); - assertEquals(1, count); + transactionTemplate.execute(outerStatus -> { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCompletion(int status) { + txStatus = status; + count++; + } + }); + transactionTemplate.execute(innerStatus -> { + assertEquals(0, count); + count++; return null; - } + }); + assertEquals(1, count); + return null; }); assertEquals(TransactionSynchronization.STATUS_COMMITTED, txStatus); assertEquals(2, count); } @Test - public void testRollback() throws Exception { + public void testRollback() { try { - new TransactionTemplate(transactionManager).execute(new TransactionCallback() { - @Override - public Void doInTransaction(TransactionStatus status) { - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + new TransactionTemplate(transactionManager).execute(status -> { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCompletion(int status) { - super.afterCompletion(status); txStatus = status; } }); throw new RuntimeException("Rollback!"); - } }); fail("Expected RuntimeException"); } @@ -161,31 +132,24 @@ public void afterCompletion(int status) { } @Test - public void testRollbackNestedInner() throws Exception { + public void testRollbackNestedInner() { final TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); try { - transactionTemplate.execute(new TransactionCallback() { - @Override - public Void doInTransaction(TransactionStatus status) { - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { - @Override - public void afterCompletion(int status) { - super.afterCompletion(status); - txStatus = status; - count++; - } - }); - transactionTemplate.execute(new TransactionCallback() { - @Override - public Void doInTransaction(TransactionStatus status) { - assertEquals(0, count); - count++; - throw new RuntimeException("Rollback!"); - } - }); - assertEquals(1, count); - return null; - } + transactionTemplate.execute(outerStatus -> { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCompletion(int status) { + txStatus = status; + count++; + } + }); + transactionTemplate.execute(innerStatus -> { + assertEquals(0, count); + count++; + throw new RuntimeException("Rollback!"); + }); + assertEquals(1, count); + return null; }); fail("Expected RuntimeException"); } @@ -197,31 +161,24 @@ public Void doInTransaction(TransactionStatus status) { } @Test - public void testRollbackNestedOuter() throws Exception { + public void testRollbackNestedOuter() { final TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); try { - transactionTemplate.execute(new TransactionCallback() { - @Override - public Void doInTransaction(TransactionStatus status) { - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { - @Override - public void afterCompletion(int status) { - super.afterCompletion(status); - txStatus = status; - count++; - } - }); - transactionTemplate.execute(new TransactionCallback() { - @Override - public Void doInTransaction(TransactionStatus status) { - assertEquals(0, count); - count++; - return null; - } - }); - assertEquals(1, count); - throw new RuntimeException("Rollback!"); - } + transactionTemplate.execute(outerStatus -> { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCompletion(int status) { + txStatus = status; + count++; + } + }); + transactionTemplate.execute(innerStatus -> { + assertEquals(0, count); + count++; + return null; + }); + assertEquals(1, count); + throw new RuntimeException("Rollback!"); }); fail("Expected RuntimeException"); }