Skip to content

Commit

Permalink
Merge pull request spring-projects#7493 from robotmrv/spring-projects…
Browse files Browse the repository at this point in the history
…gh-7492

Dispose default Scheduler
  • Loading branch information
rwinch committed Sep 30, 2019
2 parents 3051a79 + 39600b9 commit e0414e5
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 2 deletions.
Expand Up @@ -18,6 +18,7 @@

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.DisposableBean;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Scheduler;
import reactor.core.scheduler.Schedulers;
Expand Down Expand Up @@ -45,7 +46,7 @@
* @author Eddú Meléndez
* @since 5.2
*/
public abstract class AbstractUserDetailsReactiveAuthenticationManager implements ReactiveAuthenticationManager {
public abstract class AbstractUserDetailsReactiveAuthenticationManager implements ReactiveAuthenticationManager, DisposableBean {

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

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

private ReactiveUserDetailsPasswordService userDetailsPasswordService;

private Scheduler scheduler = Schedulers.newParallel("password-encoder");
Scheduler scheduler = Schedulers.newParallel("password-encoder");
private boolean defaultScheduler = true;

private UserDetailsChecker preAuthenticationChecks = user -> {
if (!user.isAccountNonLocked()) {
Expand Down Expand Up @@ -138,6 +140,10 @@ public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
*/
public void setScheduler(Scheduler scheduler) {
Assert.notNull(scheduler, "scheduler cannot be null");
if (this.defaultScheduler) {
this.defaultScheduler = false;
this.scheduler.dispose();
}
this.scheduler = scheduler;
}

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

@Override
public void destroy() {
if (this.defaultScheduler) {
this.scheduler.dispose();
}
}
}
Expand Up @@ -33,6 +33,8 @@
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.password.PasswordEncoder;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Scheduler;
import reactor.core.scheduler.Schedulers;
import reactor.test.StepVerifier;

/**
Expand Down Expand Up @@ -136,4 +138,33 @@ public void authenticateWhenPasswordEncoderAndFailThenFail() {
.expectError(BadCredentialsException.class)
.verify();
}

@Test
public void destroyWhenDefaultSchedulerThenShouldDispose() {
assertThat(manager.scheduler.isDisposed()).isFalse();
manager.destroy();
assertThat(manager.scheduler.isDisposed())
.as("default Scheduler should be disposed")
.isTrue();
}

@Test
public void destroyWhenCustomSchedulerThenShouldNotDispose() {
manager.setScheduler(Schedulers.parallel());
manager.destroy();
assertThat(manager.scheduler.isDisposed())
.as("custom Scheduler should not be disposed")
.isFalse();
}

@Test
public void setSchedulerWhenSetCustomSchedulerThenDisposeDefault() {
Scheduler defaultScheduler = manager.scheduler;
assertThat(defaultScheduler.isDisposed()).isFalse();
manager.setScheduler(Schedulers.parallel());
assertThat(defaultScheduler.isDisposed())
.as("default Scheduler should be disposed")
.isTrue();
}

}

0 comments on commit e0414e5

Please sign in to comment.