Нет подходящего bean-компонента типа LockProvider при настройке Spring Scheduler с Shedlock - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь интегрировать Shedlock, чтобы запланированное задание в моем загрузочном приложении Spring работало без проблем при развертывании нескольких модулей.

Основной класс выглядит следующим образом:

@SpringBootApplication
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "60m", defaultLockAtLeastFor = "15m")
@ComponentScan
public class MyService {

  public static void main(String[] args) {
    SconeApp.run(MyService.class, args);
  }
}

Для настройки планировщика с Shedlock добавил следующий класс:

import com.salesforce.tm.scheduler.MyScheduler;
import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;

@Configuration
public class LockProviderConfiguration {

  @Bean
  public LockProvider lockProvider(MyDbDataSource dataSource) {
    return new JdbcTemplateLockProvider(
        JdbcTemplateLockProvider.Configuration.builder()
            .withJdbcTemplate(new JdbcTemplate(dataSource))
            .build()
    );
  }

  @Bean
  public MyScheduler myScheduler(LockProvider lockProvider) {
    return new MyScheduler();
  }
}

MyDbDataSource имеет следующий вид:

@Component
public class MyDbDataSource implements InitializingBean {

  public TcDbDataSource(..) {
    super();
    ...
  }

  @Override
  public void afterPropertiesSet() {
     ...
  }
}

Мой класс планировщика выглядит следующим образом:

public class MyScheduler {

  @Scheduled(cron = "*/1 * * * * *")
  @SchedulerLock(name = "myTask",
      lockAtMostFor = "${scheduling.my-job.lock-at-most}",
      lockAtLeastFor = "${scheduling.my-joblock-at-least}")
  public void myCronJob() throws InterruptedException {
    LockAssert.assertLocked();
    while(true) {
      System.out.println("Test");
      Thread.sleep(1000L);
    }
  }
}

При запуске приложения, Я получаю следующую ошибку:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'net.javacrumbs.shedlock.core.LockProvider' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1714)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1270)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1224)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:884)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:788)

Я не понимаю, что мне здесь не хватает.

1 Ответ

0 голосов
/ 03 августа 2020

попробуйте переопределить bean-компонент LockProvider

@Bean
public LockProvider lockProvider(DataSource dataSource) {
    return new JdbcTemplateLockProvider(dataSource);
}

, как в этом руководстве https://www.baeldung.com/shedlock-spring

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...