From 7242f8fe77299818c47ca1a46843a303668c9c6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henning=20P=C3=B6ttker?= Date: Sat, 27 Mar 2021 00:07:30 +0100 Subject: [PATCH] Replace deprecated TransactionSynchronizationAdapter Issue #3838 --- .../batch/core/step/tasklet/TaskletStep.java | 5 +- .../ChunkOrientedStepIntegrationTests.java | 20 +- .../batch/item/data/MongoItemWriter.java | 6 +- .../TransactionAwareBufferedWriter.java | 4 +- .../TransactionAwareProxyFactory.java | 6 +- .../ResourcelessTransactionManagerTests.java | 211 +++++++----------- 6 files changed, 100 insertions(+), 152 deletions(-) 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 077a9c530..9db3acf39 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.DefaultTransactionAttribute; 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 class TaskletStep extends AbstractStep { * @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 a4282f20b..856646deb 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.job.JobSupport; 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.beans.factory.annotation.Autowired; 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 class ChunkOrientedStepIntegrationTests { @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 aaba4f999..75a25e42f 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.MongoOperations; 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 @@ public class MongoItemWriter implements ItemWriter, InitializingBean { 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 97e834886..1875c6aa9 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.ByteBuffer; 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 @@ public class TransactionAwareBufferedWriter extends Writer { 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 1c5d872ec..4bca834cc 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.MethodInterceptor; 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 class TransactionAwareProxyFactory { 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 class TransactionAwareProxyFactory { @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 240568987..0f58a83fa 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.assertEquals; 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 class ResourcelessTransactionManagerTests { } @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 class ResourcelessTransactionManagerTests { } @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"); }