brpoplpush is a block queue, when the network is cut down, or weak network, my config timeout is set to 20 second, but after that, thread is always running, but is dead, not accept any push request, what I mean is that, brpoplpush is not working normally anyway. How can I solve the problem? or is a bug? Now, what I can do is to restart the tomcat server.

ps: I use jedis pool client, and also set the timeout 20s.

Comment From: ljluestc


import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class RedisQueueHandler {
    private final JedisPool jedisPool;

    public RedisQueueHandler(JedisPool jedisPool) {
        this.jedisPool = jedisPool;
    }

    public String handleBrpoplpush(String source, String destination, int timeoutSeconds) {
        String result = null;
        try (Jedis jedis = jedisPool.getResource()) {
            // Use a separate thread to handle the timeout
            Thread worker = new Thread(() -> {
                try {
                    result = jedis.brpoplpush(source, destination, timeoutSeconds);
                } catch (Exception e) {
                    // Log the exception or handle it appropriately
                    System.err.println("Error in BRPOPLPUSH: " + e.getMessage());
                }
            });
            worker.start();
            worker.join(timeoutSeconds * 1000);  // Wait for the timeout duration

            if (worker.isAlive()) {
                // If the thread is still running, it means the operation didn't complete within the timeout
                worker.interrupt();  // Attempt to interrupt the thread
                return null;  // Or some error indicator
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            System.err.println("Thread was interrupted: " + e.getMessage());
        }
        return result;
    }
}