You only need 1 CuratorFramework instance per ZooKeeper cluster. So, yes. 
Stylistically, though, all that static stuff should be avoided, IMO.

-JZ

From: Check Peck Check Peck
Reply: [email protected] [email protected]
Date: February 21, 2014 at 1:35:12 AM
To: user [email protected]
Subject:  Can I access CuratorFramework in static way from other class?  
Below is my `CuratorClient` class which is connecting to Zookeeper and starting 
the leader election process as well.

 

                public class CuratorClient {

                               

                                // can I make this as static?

                                private static CuratorFramework client;

                                private String latchPath;

                                private String id;

                                private LeaderLatch leaderLatch;

                 

                                public CuratorClient(String connString, String 
latchPath, String id) {

                                                client = 
CuratorFrameworkFactory.newClient(connString, new ExponentialBackoffRetry(1000, 
Integer.MAX_VALUE));

                                                this.id = id;

                                                this.latchPath = latchPath;

                                }

                 

                                public void start() throws Exception {

                                                client.start();

                                                
client.getCuratorClient().blockUntilConnectedOrTimedOut();

                                                leaderLatch = new 
LeaderLatch(client, latchPath, id);

                                                leaderLatch.start();

                                }

                 

                                public boolean isLeader() {

                                                return 
leaderLatch.hasLeadership();

                                }

                 

                                public Participant currentLeader() throws 
Exception {

                                                return leaderLatch.getLeader();

                                }

                 

                                public void close() throws IOException {

                                                leaderLatch.close();

                                                client.close();

                                }

                               

                                // can I use below method from any other class ?

                                protected static List<String> 
getChildren(String node) throws Exception {

                                                return 
client.getChildren().forPath(node);

                                }

                }

               

When my service gets started up, in the static block I am making a connection 
to Zookeeper using CuratorClient and starting the leader election process as 
well.

 

                public class TestService {

 

                    private static CuratorClient curatorClient = null;

                                static {

 

                                                try {

                                                                String 
connectionString = "some-string";

                                                                String hostname 
= "machineA";

 

                                                                curatorClient = 
new CuratorClient(connectionString, "/my/latch", hostname);

                                                                
curatorClient.start();

 

                                                } catch (Exception ex) {

                                                                // log exception

                                                }

                                }

                               

                                ....

                                ....

                               

                                // some method

                                public Map<String, String> 
installNewSoftware(String node) {

                               

                                //.. some other code

                                try {

                                                List<String> children = 
CuratorClient.getChildren("/my/example");

                                                System.out.println(children);

                                               

                                } catch (Exception e) {

                                                e.printStackTrace();

                                }

                               

                                //.. some other code

                                return null;

                                }

                }

               

Now I have some other class as well which likes to use the `getChildren` method 
of `CuratorClient` so in this class, I can directly use like this 
`CuratorClient.getChildren("/my/example");` correct?

 

                public class DifferentClass {

 

                                ....

                                ....

                               

                                // some new method

                                public Map<String, String> 
installNewSoftware(String node) {

                                try {

                                                List<String> children = 
CuratorClient.getChildren("/my/example");

                                                System.out.println(children);

 

                                } catch (Exception e) {

                                                e.printStackTrace();

                                }

 

                                //.. some other code

                                return null;

                                }

                }

               

I am trying to understand whether the way I am doing it will have any problem 
or not if I use CuratorFramework as static and provide all kind of utilities in 
CuratorClient class to get the children of a node or get the data of a node and 
call these methods in a static way from other class?



And I am assuming `CuratorFramework` will be thread safe as well?

Reply via email to