Redis 实现 简单的消息队列 Message Queue

文章目录[隐藏]

近日项目中有一个需求,需要提供一个接口,用来打包客户端,接口只负责透传资源文件以及保留打包进度查询.但是有一个需求,当前只能有一个打包任务在同时进行,就是说当前有任务在进行时,新添加的任务只能之前任务完毕后,才可以开始打包.


消息队列

这个时候就需要用到消息队列了(Message Quene),但是考虑到activeMQ相对过于庞大,查询之,用Redis来替代,实现一个简单的队列模式,这里用到了Redis对List的数据存取.
Redis提供了两种方式来作消息队列。
一个是使用生产者消费模式模式(Queue)
另一个就是发布订阅者模式(Topic)
前者会让一个或者多个客户端监听消息队列,一旦消息到达,消费者马上消费,谁先抢到算谁的,如果队列里没有消息,则消费者继续监听。
后者也是一个或多个客户端订阅消息频道,只要发布者发布消息,所有订阅者都能收到消息,订阅者都是平等的。
本文采用的是生产者消费者模式。


实现

代码中的Redis操作类使用的Spring封装的redisTemplate模版
push 推送一条打包任务,置状态为NEW

        // 从request接受打包参数
        JSONObject packJob = new JSONObject();
        packJob.put("version", empVersion);
        packJob.put("jobId", System.currentTimeMillis());
        packJob.put("platform", appPlatform);
        packJob.put("status", PackJobEnum.NEW);

        // PUSH
        // 存放队列任务
        redisTemplate.opsForList().rightPush(Constants.REDIS_PACK_LIST_KEY, packJob.toString());
        // 存放任务详情
        redisTemplate.opsForValue().set(Constants.REDIS_PACK_KEY_PREFIX + packJob.getString("jobId"), packJob.toString(), 60L, TimeUnit.MINUTES);

pop 弹出第一条任务 开始打包,置状态为RUN

        // POP
        String popJob = redisTemplate.opsForList().leftPop(Constants.REDIS_PACK_LIST_KEY );
        JSONObject jobJson = JSONObject.parseObject(popJob);
        jobJson.put("status", PackJobEnum.RUN);
        redisTemplate.opsForValue().set(Constants.REDIS_PACK_KEY_PREFIX + jobJson.getString("jobId"), jobJson.toString(), 24L, TimeUnit.HOURS);

GET 查询任务状态

 String jsonJob = redisTemplate.opsForValue().get(Constants.REDIS_PACK_KEY_PREFIX + jobId);
            Assert.notNull(jsonJob, StatusCodeEnum.PARAMETER_IS_INCORRECT, "jobId is wrong");
            request.setAttribute(Constants.RESPONSE_DATA_KEY, JSONObject.parseObject(jsonJob));

具体的代码实现,还需要根据业务来改动,但基本逻辑就是这个样子

voidm

在黑暗中支撑和平的无名者

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐