Skip to content

Commit e0414e5

Browse files
committed
Merge pull request #7493 from robotmrv/gh-7492
Dispose default Scheduler
2 parents 3051a79 + 39600b9 commit e0414e5

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

core/src/main/java/org/springframework/security/authentication/AbstractUserDetailsReactiveAuthenticationManager.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.apache.commons.logging.Log;
2020
import org.apache.commons.logging.LogFactory;
21+
import org.springframework.beans.factory.DisposableBean;
2122
import reactor.core.publisher.Mono;
2223
import reactor.core.scheduler.Scheduler;
2324
import reactor.core.scheduler.Schedulers;
@@ -45,7 +46,7 @@
4546
* @author Eddú Meléndez
4647
* @since 5.2
4748
*/
48-
public abstract class AbstractUserDetailsReactiveAuthenticationManager implements ReactiveAuthenticationManager {
49+
public abstract class AbstractUserDetailsReactiveAuthenticationManager implements ReactiveAuthenticationManager, DisposableBean {
4950

5051
protected final Log logger = LogFactory.getLog(getClass());
5152

@@ -55,7 +56,8 @@ public abstract class AbstractUserDetailsReactiveAuthenticationManager implement
5556

5657
private ReactiveUserDetailsPasswordService userDetailsPasswordService;
5758

58-
private Scheduler scheduler = Schedulers.newParallel("password-encoder");
59+
Scheduler scheduler = Schedulers.newParallel("password-encoder");
60+
private boolean defaultScheduler = true;
5961

6062
private UserDetailsChecker preAuthenticationChecks = user -> {
6163
if (!user.isAccountNonLocked()) {
@@ -138,6 +140,10 @@ public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
138140
*/
139141
public void setScheduler(Scheduler scheduler) {
140142
Assert.notNull(scheduler, "scheduler cannot be null");
143+
if (this.defaultScheduler) {
144+
this.defaultScheduler = false;
145+
this.scheduler.dispose();
146+
}
141147
this.scheduler = scheduler;
142148
}
143149

@@ -171,4 +177,10 @@ public void setPostAuthenticationChecks(UserDetailsChecker postAuthenticationChe
171177
*/
172178
protected abstract Mono<UserDetails> retrieveUser(String username);
173179

180+
@Override
181+
public void destroy() {
182+
if (this.defaultScheduler) {
183+
this.scheduler.dispose();
184+
}
185+
}
174186
}

core/src/test/java/org/springframework/security/authentication/ReactiveUserDetailsServiceAuthenticationManagerTests.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import org.springframework.security.core.userdetails.UserDetails;
3434
import org.springframework.security.crypto.password.PasswordEncoder;
3535
import reactor.core.publisher.Mono;
36+
import reactor.core.scheduler.Scheduler;
37+
import reactor.core.scheduler.Schedulers;
3638
import reactor.test.StepVerifier;
3739

3840
/**
@@ -136,4 +138,33 @@ public void authenticateWhenPasswordEncoderAndFailThenFail() {
136138
.expectError(BadCredentialsException.class)
137139
.verify();
138140
}
141+
142+
@Test
143+
public void destroyWhenDefaultSchedulerThenShouldDispose() {
144+
assertThat(manager.scheduler.isDisposed()).isFalse();
145+
manager.destroy();
146+
assertThat(manager.scheduler.isDisposed())
147+
.as("default Scheduler should be disposed")
148+
.isTrue();
149+
}
150+
151+
@Test
152+
public void destroyWhenCustomSchedulerThenShouldNotDispose() {
153+
manager.setScheduler(Schedulers.parallel());
154+
manager.destroy();
155+
assertThat(manager.scheduler.isDisposed())
156+
.as("custom Scheduler should not be disposed")
157+
.isFalse();
158+
}
159+
160+
@Test
161+
public void setSchedulerWhenSetCustomSchedulerThenDisposeDefault() {
162+
Scheduler defaultScheduler = manager.scheduler;
163+
assertThat(defaultScheduler.isDisposed()).isFalse();
164+
manager.setScheduler(Schedulers.parallel());
165+
assertThat(defaultScheduler.isDisposed())
166+
.as("default Scheduler should be disposed")
167+
.isTrue();
168+
}
169+
139170
}

0 commit comments

Comments
 (0)