業務場景,通過redis來模擬延遲消息處理
還是採用傳統思維模式
寫入消息
// 離線列表 延遲一分鐘 redisOperationService.zaddWithPrefix(BusinessRedisKeyDefinition.SESSION_STATE_OFFLINE_QUEUE.get(privateProviderId), System.currentTimeMillis() + 60000, key, expirationDate);
定時任務掃描處理
Date currentDate = new Date(); // 每次處理100條 final Set<Tuple> tuples = redisOperationService.zrangeByScoreWithScores(queueKey, 0, Long.valueOf(currentDate.getTime()).doubleValue(), 0, 100);
但是爲什麼不統一封裝設計呢
public interface MessageInvoker { void invoke(String message); }
public class RedisJobScheduler { MessageInvoker messageInvoker; private RedisOperationService redisOperationService; // 掃描頻率 private Integer interval = 1000; // 默認處理行數 private Integer batchProcessNumber = 10; // 任務不活躍多久自動過期 private int expirationDate = 60 * 60 * 12 * 2 * 2; private String taskName; public void addJob(String message, Integer delayMillis) { redisOperationService.zaddWithPrefix(taskName, System.currentTimeMillis() + delayMillis, message, expirationDate); } public void startJob() { new Thread(() -> { while (true) { try { Thread.sleep(interval); // 1. 獲取消息 Set<String> messageName = redisOperationService.zrangeByScoreWithPrefix(taskName, 0, Long.valueOf(new Date().getTime()).doubleValue(), 0, batchProcessNumber); for (String message : messageName) { // 3. 處理任務 messageInvoker.invoke(message); // 4. 刪除任務 redisOperationService.zremWithPrefix(taskName, message); } } catch (InterruptedException e) { throw new RuntimeException(e); } } }); } }
這裏startjob還可以採用動態新建的方式
https://www.cnblogs.com/LQBlog/p/17188613.html