스케줄을 수행하고 아직 처리상태가 완료되지 않은 건이 있는 경우에 스케줄의 메소드를 재수행하기 위해 레디스를 활용하였다.
1. 완료되지 않은 건이 있는 경우, 레디스에 데이터를 생성하고 TTL을 설정.
2. 만료 이벤트를 수신하여 스케줄 메소드 재실행.
3. 더이상 스케줄이 돌지 않아도 되면 레디스에 데이터를 생성하지 않는다.
위와 같은 식으로 활용하였다. 만료 이벤트는 아래를 참고하여 구현.
KeyExpirationEvent 관련 Bean을 선언
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer() {
RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory());
return redisMessageListenerContainer;
}
@Bean
public KeyExpirationEventMessageListener keyExpirationEventMessageListener() {
return new KeyExpirationEventMessageListener(new RedisMessageListenerContainer() {{
setConnectionFactory(redisConnectionFactory());
}});
}
이벤트를 수신할 클래스 생성
@Slf4j
@Component
public class KeyExpirationEventListener extends KeyExpirationEventMessageListener {
public KeyExpirationEventMessageListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
public void onMessage(Message message, byte[] pattern) {
String expiredKey = new String(message.getBody());
String hashKey = "찾을 키";
if (expiredKey.startsWith(hashKey)) {
log.info("Key expired: {}", expiredKey);
handledExpiredKey();
}
}
private void handledExpiredKey() {
// 만료 이벤트를 받았을 때, 동작할 로직
}
}