Hazelcast Jet中如何将IList转为普通列表并返回REST响应
Hazelcast Jet IList转普通List最佳实现方案
核心问题根因
你遇到的问题本质是Jet作业是异步提交执行的,没有等待作业计算完成就读取IList,自然拿到的是空或者上一次请求的残留数据;直接返回IList引用看似可用,是因为返回后执行的job.join()等作业跑完,序列化阶段才拉取IList的实际数据,属于巧合实现,风险极高。
最佳实现步骤
- 第一步:隔离不同请求的分布式列表,不要固定用"abc"作为列表名称,使用请求唯一标识/UUID作为列表名,避免并发请求的数据互相污染
- 第二步:作业提交后立刻在方法内执行
join()等待作业执行完成,再读取列表数据 - 第三步:将IList转换为本地ArrayList后,立刻销毁分布式列表释放集群资源,避免内存泄漏
- 第四步:返回本地ArrayList作为响应数据,完全脱离分布式集合的依赖
修正后代码示例
public ResponseMessage<?> runProcess(Pipeline pl) { // 生成唯一列表名,避免并发冲突 String resultListName = "result-" + UUID.randomUUID(); Map<String, BatchStage<Object>> allBatch = new HashMap<>(); allBatch.put(z.get("id").toString(), new SomeCalulation().readSource(pipeline)); BatchStage<Object> h = allBatch.values().iterator().next(); h.writeTo(Sinks.list(resultListName)); // 提交作业并等待执行完成 Job job = jetInstance.newJob(pl); job.join(); // 作业完成后读取数据转换为本地List IList<Object> abc = jetInstance.getList(resultListName); List<Object> result = new ArrayList<>(abc); // 用完立刻销毁分布式列表 abc.destroy(); return ResponseMessage.withResponseData(result); }
补充说明
如果业务场景允许单次请求失败重试,也可以选择直接使用Jet的Job.getResults()方法获取计算结果,无需额外写入分布式IList,进一步简化代码。
内容的提问来源于stack exchange,提问作者user3458271
相关产品推荐
相关产品推荐

