Tech Corner

How to discard tasks after timeouts with Redis keyspace notifications?

Engati Team
.
Nov 29
.
2-3 mins

Table of contents

Automate your business at $5/day with Engati

REQUEST A DEMO
Ways to discard tasks after timeouts with Redis keyspace notifications

I was trying to figure out how to implement some sort of timeout mechanism to discard any task if that task surpassed the maximum wait time, and the wait time can be configurable in seconds, minutes, hours, and may vary from customer to customer.

Then I came across notifications events in Redis. This article will give you an overview of how I have used Redis keyspace notifications events with the spring boot application to achieve the functionality.

Basically the idea here is whenever a new task came in, set a key in Redis with some prefix along with task metadata and expiry as the configured max wait time, and then by using Redis Keyspace Notifications for Expired Keys listen to the key expiry event, and based on that discard the task.

Enable keyspace notifications for Expired key Only:

IMPORTANT Keyspace notifications feature is available in Redis server version 2.8.0 or higher.

By default keyspace, notifications are disabled in Redis to avoid unnecessary CPU utilization. There are two ways we can enable this either using redis-cli or redis.conf file.

Enable Using Redis-CLI:

Subhams-MBP-2:~ subhammajavadiya$ redis-cli
127.0.0.1:6379> config set notify-keyspace-events Ex
OK

Enable Using Redis.conf:

By adding the below line in redis.conf and restarting the redis-server.

notify-keyspace-events Ex

I would recommend enabling from redis.conf file in the production environment to avoid the config reset if redis-server gets restarted.

Create Task timeout listener

  • To listen to the key expire event in spring boot application I have added spring.data.redis dependency in the build.gradleand implemented TaskTimeOutListener as MessageListener bean.

@Slf4j
@Component
public class TaskTimeOutListener implements MessageListener {  @Override
 public void onMessage(Message message, byte[] pattern) {
   String body = new String(message.getBody());
   String channel = new String(message.getChannel());log.info("Received task timeout event: {} for key: {}", body, channel);

   String expiredKey = channel.split(":")[1];
   //implemented logic to discard task
 }}

  • Register TaskTimeOutListener, MessageListener bean with RedisMessageListenerContainer to listen the key expiry event with a specific pattern i.e task_with_max_wait_time__*

@Slf4j
@Configuration
public class RedisConfiguration {  @Bean
 public RedisMessageListenerContainer redisMessageListenerContainer(
     RedisConnectionFactory connectionFactory,
     TaskTimeOutListener taskTimeoutListener) {
   RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();
   listenerContainer.setConnectionFactory(connectionFactory);
   listenerContainer.addMessageListener(maxWaitTimeExpiryListener,
       new PatternTopic("__key*__:task_with_max_wait_time__*"));
   listenerContainer.setErrorHandler(
       e ->log.error("Error in redisMessageListenerContainer", e));
   return listenerContainer;
 }
}

  • Let’s start the spring boot application and from redis-cli set a task with expiry time as 10 sec with key task_with_max_wait_time__1.

Subhams-MBP-2:~ subhammajavadiya$ redis-cli
127.0.0.1:6379> SETEX  task_with_max_wait_time__1  10  "test task"
OK

  • After 10 seconds

{"@timestamp":"2020-06-12T19:28:48.063+00:00","@version":1,"message":"Received task timeout event: expired, for key :task_with_max_wait_time__1","logger_name":"com.test.redislistener.TaskTimeOutListener",

"thread_name":"redisMessageListenerContainer-2","level":"INFO","level_value":20000,"app_name":"test-app","log_type":"app"}

And, it's up and running. Hope this helps you.

Engati Team

At the forefront for digital customer experience, Engati helps you reimagine the customer journey through engagement-first solutions, spanning automation and live chat.

Close Icon
Request a Demo!
Get started on Engati with the help of a personalised demo.
Thanks for the information.
We will be shortly getting in touch with you.
Oops! something went wrong!
For any query reach out to us on contact@engati.com
Close Icon
Congratulations! Your demo is recorded.

Select an option on how Engati can help you.

I am looking for a conversational AI engagement solution for the web and other channels.

I would like for a conversational AI engagement solution for WhatsApp as the primary channel

I am an e-commerce store with Shopify. I am looking for a conversational AI engagement solution for my business

I am looking to partner with Engati to build conversational AI solutions for other businesses

continue
Finish
Close Icon
You're a step away from building your Al chatbot

How many customers do you expect to engage in a month?

Less Than 2000

2000-5000

More than 5000

Finish
Close Icon
Thanks for the information.

We will be shortly getting in touch with you.

Close Icon

Contact Us

Please fill in your details and we will contact you shortly.

Thanks for the information.
We will be shortly getting in touch with you.
Oops! Looks like there is a problem.
Never mind, drop us a mail at contact@engati.com

<script type="application/ld+json">
{
 "@context": "https://schema.org",
 "@type": "FAQPage",
 "mainEntity": [{
   "@type": "Question",
   "name": "How to Enable keyspace notifications for Expired key Only?",
   "acceptedAnswer": {
     "@type": "Answer",
     "text": "IMPORTANT Keyspace notifications feature is available in Redis server version 2.8.0 or higher.By default keyspace, notifications are disabled in Redis to avoid unnecessary CPU utilization. There are two ways we can enable this either using redis-cli or redis.conf file."
   }
 },{
   "@type": "Question",
   "name": "How to Enable Using Redis-CLI?",
   "acceptedAnswer": {
     "@type": "Answer",
     "text": "Subhams-MBP-2:~ subhammajavadiya$ redis-cli127.0.0.1:6379> config set notify-keyspace-events ExOK"
   }
 }]
}
</script>