I want only one schedule method to work for many instances.
I added the snap-scheduler to my project, and after that I deployed two different instances to the railway. And two entries about the execution of my method are added to the snap_lock
table. Сan you explain where I went wrong?
It`s scheduler config:
@Configuration
@Import(SnapAppConfig.class)
public class SchedulerConfiguration {
private static final String SNAP_DB_POOL_NAME = "snap-pool";
@Bean(name = "snapDataSource")
public DataSource customDataSource(final DataSourceProperties properties,
@Value("${spring.datasource.hikari.schema}") final String schema) {
final HikariDataSource dataSource = properties.initializeDataSourceBuilder()
.type(HikariDataSource.class).build();
dataSource.setPoolName(SNAP_DB_POOL_NAME);
Optional.ofNullable(schema).ifPresent(dataSource::setSchema);
return dataSource;
}
}
It`s method with @SnapLock and @Scheduled annotations
@Slf4j
@Service
@RequiredArgsConstructor
public class SchedulerService {
private static final String EUROPE_KIEV_ZONE = "Europe/Kiev";
@SnapLock(key = "REPORT_CURRENT_TIME", time = 30)
@Scheduled(cron = "0 */1 * * * *", zone = EUROPE_KIEV_ZONE)
protected void test() {
log.info("time now equals = " + Instant.now());
}
}
It`s psql
CREATE TABLE snap_lock
(
task_key text NOT NULL,
task_method text NOT NULL,
lock_until timestamp with time zone NOT NULL,
lock_at timestamp with time zone NOT NULL,
lock_by text NOT NULL,
CONSTRAINT snap_lock_pkey PRIMARY KEY (task_key, task_method)
);
CREATE TABLE snap_task_audit
(
id integer GENERATED BY DEFAULT AS identity,
task_key text NOT NULL,
task_method text NOT NULL,
run_on text NOT NULL,
start_run timestamp with time zone NOT NULL,
end_run timestamp with time zone NOT NULL,
run_time_seconds numeric NOT NULL,
task_error jsonb,
CONSTRAINT snap_task_audit_pkey PRIMARY KEY (id)
);
CREATE TABLE snap_scheduler
(
name text NOT NULL,
task_key text NOT NULL,
type text NOT NULL,
task_class text NOT NULL,
task_data jsonb,
task_data_class text,
run_at timestamp with time zone NOT NULL,
recurrence text,
picked boolean NOT NULL DEFAULT false,
picked_by text,
end_run timestamp with time zone,
CONSTRAINT snap_scheduler_pkey PRIMARY KEY (task_key)
);
As an alternative, I solved my problem using a library https://github.com/lukas-krecan/ShedLock. Everything is similar there, the method through the base is blocked. But there were no problems with crowns.