2014-02-18 29 views
4

你如何停止和關閉一個hazelcast集羣?我對測試的觀察是,無論何時通過HazelcastInstance#shutdown()停止節點,集羣都會嘗試重新平衡或備份數據。我如何首先「停止」羣集然後關閉它? (或者是我的觀察錯了嗎?)如何停止和關閉整個hazelcast羣集?

+0

任何消息?任何答案? – lolo

回答

0

測試時我經常使用Hazelcast.shutdownAll()

這將殺死所有的實例。

+1

來自javadoc:「關閉在此JVM上運行的所有Hazelcast實例,它不會關閉羣集中的所有成員,而只是關閉在此JVM上運行的所有成員。」所以它明確不會做我所需要的。 – Jan

+0

好的,所以你有不同的JVM。我認爲所有成員都是同一個JVM的一部分。 你可以做的一件事就是將一個可運行的程序提交給分佈式執行程序並在所有成員上執行它。這個runnable可以做一個System.exit。 這是純粹爲了測試目的還是你想終止生產中的成員? – pveentjer

+0

(對於非常遲的回覆,抱歉)我想優雅地關閉整個生產羣集。 – Jan

0

試試這個。

HazelcastInstance.getLifecycleService().shutdown(); 
4

您可以在下面的例子使用isClusterSafe爲:

public class ShutdownCluster { 

public static void main(String[] args) throws Exception { 

    HazelcastInstance member1 = Hazelcast.newHazelcastInstance(); 
    HazelcastInstance member2 = Hazelcast.newHazelcastInstance(); 
    HazelcastInstance member3 = Hazelcast.newHazelcastInstance(); 

    if(member1.getPartitionService().isClusterSafe()) { 
     IExecutorService executorService = member1.getExecutorService(ShutdownCluster.class.getName()); 
     executorService.executeOnAllMembers(new ShutdownMember()); 
    } 
} 

private static class ShutdownMember implements Runnable, HazelcastInstanceAware, Serializable { 

    private HazelcastInstance node; 

    @Override 
    public void run() { 
     node.getLifecycleService().shutdown(); 
    } 

    @Override 
    public void setHazelcastInstance(HazelcastInstance node) { 
     this.node = node; 
    } 
} 
}