我正在尝试利用Infinispan的分布式任务故障转移,我似乎无法让它发挥作用。关于我想做什么的一点背景:
我在群集中有两个服务器节点。这两个节点共享分布式缓存,缓存包含用于运行任务的信息。我正在尝试在它们上实现故障转移功能,这样如果任务在服务器#1上运行并且它发生故障,服务器#2将能够接收任务并完成它。
1)我首先创建一个DistributedCallable对象:
(MyJob) MyJob myJob = new MyJob(param1, param2);
2)然后我创建一个DistributedExecutorService和一个DistributedTaskBuilder,并使用提供的Infinispan随机节点故障转移策略对其进行配置:
DistributedExecutorService execService =
new DefaultExecutorService(cacheManager.getCache());
DistributedTaskBuilder<Boolean> taskBuilder =
execService.createDistributedTaskBuilder(myJob);
taskBuilder = taskBuilder.failoverPolicy(DefaultExecutorService.RANDOM_NODE_FAILOVER);
3)我构建了distributedtask,然后使用DistributedExecutorService运行它:
DistributedTask<Boolean> distTask = taskBuilder.build();
execService.submit(distTask);
在我的测试中,我确实看到DistributedTask被发送到服务器#1或服务器#2,并且两个服务器正在正确地更新分布式缓存。但是,当我尝试测试故障转移时,它似乎不起作用。
例如: 当任务在服务器#1上运行时(我将任务设置为休眠约20秒),我会杀死服务器#1,但我没有看到任务被服务器#2重新运行或接收。反之亦然。
我不确定我是否遗漏了任何内容,我已根据Infinispan 7.0.x用户指南完成此操作。为了使故障转移工作,我需要使用提供的服务器模块之一(Hot Rod / Memcached / REST Server / WebSocket Server)吗?我在其嵌入模式(在实际应用程序中)使用Infinispan,文档使得使用分布式执行框架看起来应该提供故障转移。
任何帮助将不胜感激!
答案 0 :(得分:2)
似乎为了应用故障转移策略,您需要等待此类任务的结果:
DistributedTask distTask = taskBuilder.build();
Future future = execService.submit(distTask);
Object ignoredReturnValue = future.get();
缺点是,如果发起方节点(您调用此代码的位置)崩溃,则无法应用故障转移策略。