Планировщик постоянных заданий Redisson не работает - PullRequest
0 голосов
/ 07 августа 2020

Я создал планировщик с помощью Redisson, и он работает для обычного сценария ios. Но планировщик не запускается при перезапуске службы, поэтому я в первую очередь использовал планирование Redisson. Когда я проверяю сетку данных Redis, информация, связанная с планировщиком, есть в Redis.

Есть ли какая-либо конкретная c конфигурация, которая должна быть выполнена для включения постоянного планирования.

RedisConfiguration

@Configuration
public class RedisConfiguration {

  @Value("${spring.redis.port}")
  private int redisPort;

  @Value("${spring.redis.host}")
  private String redisHost;

  @Bean
  RedissonConnectionFactory redissonConnectionFactory(RedissonClient redissonClient) {
    return new RedissonConnectionFactory(redissonClient);
  }

  @Bean(destroyMethod = "shutdown")
  RedissonClient redissonClient() {
    Config config = new Config();
    config.useSingleServer().setAddress("redis://" + redisHost + ":" + redisPort);
    return Redisson.create(config);
  }

}

SchedulerService

@Service
public class SchedulerService {

  private static final String SCHEDULED_TASK_ID_MAP = "SCHEDULED_TASK_ID_MAP";

  private final RedissonClient redissonClient;

  private final int numOfWorkers;

  @Autowired
  public SchedulerService(final RedissonClient redissonClient,
      @Value("${app.redis.workers.count}") final int numOfWorkers) {
    this.redissonClient = redissonClient;
    this.numOfWorkers = numOfWorkers;
  }

  public String scheduleTask(final TaskInfo taskInfo) {
    SchedulerTask task = SchedulerTask.builder().taskInfo(taskInfo).build();

    RScheduledExecutorService executorService = redissonClient
        .getExecutorService(taskInfo.getJobKey());
    executorService
        .registerWorkers(getWorkerOptions(getScheduledTaskIdMap(), taskInfo.getJobKey()));

    RScheduledFuture<?> future = executorService
        .schedule(task, taskInfo.getDelay(), taskInfo.getTimeUnit());
    getScheduledTaskIdMap().put(taskInfo.getJobKey(), future.getTaskId());

    return taskInfo.getJobKey();
  }

  public boolean cancelTask(final String jobKey) {
    String taskId = getScheduledTaskIdMap().get(jobKey);

    if (!StringUtils.isEmpty(taskId)) {
      boolean isCancelled = cancelTask(jobKey, taskId);

      if (isCancelled) {
        removeTaskId(jobKey);
      }

      return isCancelled;
    }

    throw new InvalidJobKeyException("Invalid job key : " + jobKey);
  }

  private RMap<String, String> getScheduledTaskIdMap() {
    return redissonClient.getMap(SCHEDULED_TASK_ID_MAP);
  }

  private boolean cancelTask(final String jobKey, final String taskId) {
    RScheduledExecutorService executorService = redissonClient.getExecutorService(jobKey);
    boolean isCancelled = false;

    if (executorService.hasTask(taskId)) {
      isCancelled = executorService.cancelTask(taskId);
    }

    return isCancelled;
  }

  private void removeTaskId(final String jobKey) {
    getScheduledTaskIdMap().remove(jobKey);
  }

  private WorkerOptions getWorkerOptions(final RMap<String, String> rMap, final String jobKey) {
    return WorkerOptions.defaults().workers(numOfWorkers)
        .addListener(new TaskSuccessListenerImpl(rMap, jobKey));
  }
}

Зависимости

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.13.1</version>
        </dependency>

Redis изображение информации планировщика redis

...