Merge branch '6.2.x'
This commit is contained in:
@@ -50,7 +50,7 @@ public class CheckstyleConventions {
|
|||||||
project.getPlugins().apply(CheckstylePlugin.class);
|
project.getPlugins().apply(CheckstylePlugin.class);
|
||||||
project.getTasks().withType(Checkstyle.class).forEach(checkstyle -> checkstyle.getMaxHeapSize().set("1g"));
|
project.getTasks().withType(Checkstyle.class).forEach(checkstyle -> checkstyle.getMaxHeapSize().set("1g"));
|
||||||
CheckstyleExtension checkstyle = project.getExtensions().getByType(CheckstyleExtension.class);
|
CheckstyleExtension checkstyle = project.getExtensions().getByType(CheckstyleExtension.class);
|
||||||
checkstyle.setToolVersion("10.22.0");
|
checkstyle.setToolVersion("10.23.0");
|
||||||
checkstyle.getConfigDirectory().set(project.getRootProject().file("src/checkstyle"));
|
checkstyle.getConfigDirectory().set(project.getRootProject().file("src/checkstyle"));
|
||||||
String version = SpringJavaFormatPlugin.class.getPackage().getImplementationVersion();
|
String version = SpringJavaFormatPlugin.class.getPackage().getImplementationVersion();
|
||||||
DependencySet checkstyleDependencies = project.getConfigurations().getByName("checkstyle").getDependencies();
|
DependencySet checkstyleDependencies = project.getConfigurations().getByName("checkstyle").getDependencies();
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ dependencies {
|
|||||||
api(platform("org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.1"))
|
api(platform("org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.1"))
|
||||||
api(platform("org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0"))
|
api(platform("org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0"))
|
||||||
api(platform("org.junit:junit-bom:5.12.1"))
|
api(platform("org.junit:junit-bom:5.12.1"))
|
||||||
api(platform("org.mockito:mockito-bom:5.16.1"))
|
api(platform("org.mockito:mockito-bom:5.17.0"))
|
||||||
|
|
||||||
constraints {
|
constraints {
|
||||||
api("com.fasterxml:aalto-xml:1.3.2")
|
api("com.fasterxml:aalto-xml:1.3.2")
|
||||||
|
|||||||
@@ -313,7 +313,7 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
|
|||||||
while ((singletonObject = this.singletonObjects.get(beanName)) == null) {
|
while ((singletonObject = this.singletonObjects.get(beanName)) == null) {
|
||||||
Thread otherThread = this.currentCreationThreads.get(beanName);
|
Thread otherThread = this.currentCreationThreads.get(beanName);
|
||||||
if (otherThread != null && (otherThread == currentThread ||
|
if (otherThread != null && (otherThread == currentThread ||
|
||||||
this.lenientWaitingThreads.get(otherThread) == currentThread)) {
|
checkDependentWaitingThreads(otherThread, currentThread))) {
|
||||||
throw ex;
|
throw ex;
|
||||||
}
|
}
|
||||||
if (!this.singletonsInLenientCreation.contains(beanName)) {
|
if (!this.singletonsInLenientCreation.contains(beanName)) {
|
||||||
@@ -429,6 +429,16 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean checkDependentWaitingThreads(Thread waitingThread, Thread candidateThread) {
|
||||||
|
Thread threadToCheck = waitingThread;
|
||||||
|
while ((threadToCheck = this.lenientWaitingThreads.get(threadToCheck)) != null) {
|
||||||
|
if (threadToCheck == candidateThread) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine whether the current thread is allowed to hold the singleton lock.
|
* Determine whether the current thread is allowed to hold the singleton lock.
|
||||||
* <p>By default, any thread may acquire and hold the singleton lock, except
|
* <p>By default, any thread may acquire and hold the singleton lock, except
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ class BackgroundBootstrapTests {
|
|||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
}
|
}
|
||||||
catch (InterruptedException ex) {
|
catch (InterruptedException ex) {
|
||||||
throw new RuntimeException(ex);
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
return new TestBean();
|
return new TestBean();
|
||||||
}
|
}
|
||||||
@@ -150,7 +150,7 @@ class BackgroundBootstrapTests {
|
|||||||
Thread.sleep(2000);
|
Thread.sleep(2000);
|
||||||
}
|
}
|
||||||
catch (InterruptedException ex) {
|
catch (InterruptedException ex) {
|
||||||
throw new RuntimeException(ex);
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
return new TestBean();
|
return new TestBean();
|
||||||
}
|
}
|
||||||
@@ -170,7 +170,7 @@ class BackgroundBootstrapTests {
|
|||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
}
|
}
|
||||||
catch (InterruptedException ex) {
|
catch (InterruptedException ex) {
|
||||||
throw new RuntimeException(ex);
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
return new TestBean();
|
return new TestBean();
|
||||||
}
|
}
|
||||||
@@ -191,7 +191,7 @@ class BackgroundBootstrapTests {
|
|||||||
Thread.sleep(2000);
|
Thread.sleep(2000);
|
||||||
}
|
}
|
||||||
catch (InterruptedException ex) {
|
catch (InterruptedException ex) {
|
||||||
throw new RuntimeException(ex);
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
return new TestBean();
|
return new TestBean();
|
||||||
}
|
}
|
||||||
@@ -208,7 +208,7 @@ class BackgroundBootstrapTests {
|
|||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
}
|
}
|
||||||
catch (InterruptedException ex) {
|
catch (InterruptedException ex) {
|
||||||
throw new RuntimeException(ex);
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
return new TestBean("testBean1");
|
return new TestBean("testBean1");
|
||||||
}
|
}
|
||||||
@@ -230,7 +230,7 @@ class BackgroundBootstrapTests {
|
|||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
}
|
}
|
||||||
catch (InterruptedException ex) {
|
catch (InterruptedException ex) {
|
||||||
throw new RuntimeException(ex);
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
return new TestBean();
|
return new TestBean();
|
||||||
}
|
}
|
||||||
@@ -241,7 +241,7 @@ class BackgroundBootstrapTests {
|
|||||||
Thread.sleep(2000);
|
Thread.sleep(2000);
|
||||||
}
|
}
|
||||||
catch (InterruptedException ex) {
|
catch (InterruptedException ex) {
|
||||||
throw new RuntimeException(ex);
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
return new TestBean();
|
return new TestBean();
|
||||||
}
|
}
|
||||||
@@ -253,37 +253,25 @@ class BackgroundBootstrapTests {
|
|||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public TestBean testBean1(ObjectProvider<TestBean> testBean2) {
|
public TestBean testBean1(ObjectProvider<TestBean> testBean2) {
|
||||||
Thread thread = new Thread(testBean2::getObject);
|
new Thread(testBean2::getObject).start();
|
||||||
thread.setUncaughtExceptionHandler((t, ex) -> System.out.println(System.currentTimeMillis() + " " + ex + " " + t));
|
|
||||||
thread.start();
|
|
||||||
try {
|
try {
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
}
|
}
|
||||||
catch (InterruptedException ex) {
|
catch (InterruptedException ex) {
|
||||||
throw new RuntimeException(ex);
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
return new TestBean(testBean2.getObject());
|
return new TestBean(testBean2.getObject());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public TestBean testBean2(ObjectProvider<TestBean> testBean1) {
|
public TestBean testBean2(ObjectProvider<TestBean> testBean1) {
|
||||||
System.out.println(System.currentTimeMillis() + " testBean2 begin " + Thread.currentThread());
|
|
||||||
try {
|
try {
|
||||||
Thread.sleep(2000);
|
Thread.sleep(2000);
|
||||||
}
|
}
|
||||||
catch (InterruptedException ex) {
|
catch (InterruptedException ex) {
|
||||||
throw new RuntimeException(ex);
|
Thread.currentThread().interrupt();
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new TestBean(testBean1.getObject());
|
|
||||||
}
|
|
||||||
catch (RuntimeException ex) {
|
|
||||||
System.out.println(System.currentTimeMillis() + " testBean2 exception " + Thread.currentThread());
|
|
||||||
throw ex;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
System.out.println(System.currentTimeMillis() + " testBean2 end " + Thread.currentThread());
|
|
||||||
}
|
}
|
||||||
|
return new TestBean(testBean1.getObject());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,7 +286,7 @@ class BackgroundBootstrapTests {
|
|||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
}
|
}
|
||||||
catch (InterruptedException ex) {
|
catch (InterruptedException ex) {
|
||||||
throw new RuntimeException(ex);
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
return new TestBean();
|
return new TestBean();
|
||||||
}
|
}
|
||||||
@@ -309,7 +297,7 @@ class BackgroundBootstrapTests {
|
|||||||
Thread.sleep(2000);
|
Thread.sleep(2000);
|
||||||
}
|
}
|
||||||
catch (InterruptedException ex) {
|
catch (InterruptedException ex) {
|
||||||
throw new RuntimeException(ex);
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
return new TestBean();
|
return new TestBean();
|
||||||
}
|
}
|
||||||
@@ -325,14 +313,17 @@ class BackgroundBootstrapTests {
|
|||||||
static class CircularReferenceInMultipleThreadsBeanConfig {
|
static class CircularReferenceInMultipleThreadsBeanConfig {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public TestBean testBean1(ObjectProvider<TestBean> testBean2, ObjectProvider<TestBean> testBean3) {
|
public TestBean testBean1(ObjectProvider<TestBean> testBean2, ObjectProvider<TestBean> testBean3,
|
||||||
|
ObjectProvider<TestBean> testBean4) {
|
||||||
|
|
||||||
new Thread(testBean2::getObject).start();
|
new Thread(testBean2::getObject).start();
|
||||||
new Thread(testBean3::getObject).start();
|
new Thread(testBean3::getObject).start();
|
||||||
|
new Thread(testBean4::getObject).start();
|
||||||
try {
|
try {
|
||||||
Thread.sleep(2000);
|
Thread.sleep(3000);
|
||||||
}
|
}
|
||||||
catch (InterruptedException ex) {
|
catch (InterruptedException ex) {
|
||||||
throw new RuntimeException(ex);
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
return new TestBean();
|
return new TestBean();
|
||||||
}
|
}
|
||||||
@@ -343,18 +334,29 @@ class BackgroundBootstrapTests {
|
|||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
}
|
}
|
||||||
catch (InterruptedException ex) {
|
catch (InterruptedException ex) {
|
||||||
throw new RuntimeException(ex);
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
return new TestBean(testBean3.getObject());
|
return new TestBean(testBean3.getObject());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public TestBean testBean3(ObjectProvider<TestBean> testBean2) {
|
public TestBean testBean3(ObjectProvider<TestBean> testBean4) {
|
||||||
try {
|
try {
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
}
|
}
|
||||||
catch (InterruptedException ex) {
|
catch (InterruptedException ex) {
|
||||||
throw new RuntimeException(ex);
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
return new TestBean(testBean4.getObject());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public TestBean testBean4(ObjectProvider<TestBean> testBean2) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
}
|
||||||
|
catch (InterruptedException ex) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
return new TestBean(testBean2.getObject());
|
return new TestBean(testBean2.getObject());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user