我正在尝试利用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)我构建分布式任务,然后使用DistributedExecutorService运行它:
DistributedTask<Boolean> distTask = taskBuilder.build();
execService.submit(distTask);在我的测试中,我确实看到DistributedTask被发送到服务器#1或服务器#2,并且这两个服务器都正确地更新了分布式缓存。但是,当我尝试测试故障转移时,它似乎不起作用。
例如:当任务在服务器#1上运行时(我将任务设置为休眠大约20秒),我终止了服务器#1,但我看不到任务正在重新运行或被服务器#2接收,反之亦然。
我不确定我是否遗漏了什么,我已经根据Infinispan7.0.x用户指南这样做了。为了使故障转移正常工作,我是否需要使用所提供的服务器模块之一(热棒/Memcached/REST服务器/WebSocket服务器)?我在嵌入式模式下(在实际的应用程序中)使用Infinispan,文档说明使用分布式执行框架应该提供故障转移。
任何帮助都将不胜感激!
发布于 2014-11-28 17:18:42
看来,为了应用故障转移策略,您需要等待此类任务的结果:
DistributedTask distTask = taskBuilder.build();
Future future = execService.submit(distTask);
Object ignoredReturnValue = future.get();缺点是,如果发起方节点(您调用此代码的位置)崩溃,则无法应用故障转移策略。
https://stackoverflow.com/questions/27161786
复制相似问题