設計模式之美學習-一些反思

業務場景,通過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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章