1 package org.jgroups.demos;
2 
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.StringTokenizer;
6 import java.util.concurrent.TimeUnit;
7 import java.util.concurrent.locks.Lock;
8 
9 import org.jgroups.JChannel;
10 import org.jgroups.blocks.locking.LockNotification;
11 import org.jgroups.blocks.locking.LockService;
12 import org.jgroups.blocks.locking.Owner;
13 import org.jgroups.jmx.JmxConfigurator;
14 import org.jgroups.util.Util;
15 
16 /**
17  * Demos the LockService
18  */
19 public class LockServiceDemo implements LockNotification {
20     protected String props;
21     protected JChannel ch;
22     protected LockService lock_service;
23     protected String name;
24 
LockServiceDemo(String props, String name)25     public LockServiceDemo(String props, String name) {
26         this.props=props;
27         this.name=name;
28     }
29 
start()30     public void start() throws Exception {
31         ch=new JChannel(props);
32         if(name != null)
33             ch.setName(name);
34         lock_service=new LockService(ch);
35         lock_service.addLockListener(this);
36         ch.connect("lock-cluster");
37         JmxConfigurator.registerChannel(ch, Util.getMBeanServer(), "lock-service", ch.getClusterName(), true);
38 
39         try {
40             loop();
41         }
42         catch(Exception e) {
43             e.printStackTrace();
44         }
45         finally {
46             Util.close(ch);
47         }
48     }
49 
lockCreated(String name)50     public void lockCreated(String name) {
51     }
52 
lockDeleted(String name)53     public void lockDeleted(String name) {
54     }
55 
locked(String lock_name, Owner owner)56     public void locked(String lock_name, Owner owner) {
57         System.out.println("\"" + lock_name + "\" locked by " + owner);
58     }
59 
unlocked(String lock_name, Owner owner)60     public void unlocked(String lock_name, Owner owner) {
61         System.out.println("\"" + lock_name + "\" unlocked by " + owner);
62     }
63 
awaiting(String lock_name, Owner owner)64     public void awaiting(String lock_name, Owner owner) {
65         System.out.println("awaiting \"" + lock_name + "\" by " + owner);
66     }
67 
awaited(String lock_name, Owner owner)68     public void awaited(String lock_name, Owner owner) {
69         System.out.println("awaited \"" + lock_name + "\" by " + owner);
70     }
71 
loop()72     protected void loop() throws Exception {
73         List<String> lock_names;
74         while(ch.isConnected()) {
75             String line=Util.readStringFromStdin(": ");
76             if(line.startsWith("quit") || line.startsWith("exit"))
77                 break;
78 
79             if(line.startsWith("lock")) {
80                 lock_names=parseLockNames(line.substring("lock".length()).trim());
81                 for(String lock_name: lock_names) {
82                     Lock lock=lock_service.getLock(lock_name);
83                     lock.lock();
84                 }
85             }
86             else  if(line.startsWith("trylock")) {
87                 lock_names=parseLockNames(line.substring("trylock".length()).trim());
88 
89                 String tmp=lock_names.get(lock_names.size() -1);
90                 Long timeout=new Long(-1);
91                 try {
92                     timeout=Long.parseLong(tmp);
93                     lock_names.remove(lock_names.size() -1);
94                 }
95                 catch(NumberFormatException e) {
96                 }
97 
98                 for(String lock_name: lock_names) {
99                     Lock lock=lock_service.getLock(lock_name);
100                     boolean rc;
101                     if(timeout.longValue() < 0)
102                         rc=lock.tryLock();
103                     else
104                         rc=lock.tryLock(timeout.longValue(), TimeUnit.MILLISECONDS);
105                     if(!rc)
106                         System.err.println("Failed locking \"" + lock_name + "\"");
107                 }
108             }
109             else if(line.startsWith("unlock")) {
110                 lock_names=parseLockNames(line.substring("unlock".length()).trim());
111                 for(String lock_name: lock_names) {
112                     if(lock_name.equalsIgnoreCase("all")) {
113                         lock_service.unlockAll();
114                         break;
115                     }
116                     else {
117                         Lock lock=lock_service.getLock(lock_name);
118                         if(lock != null)
119                             lock.unlock();
120                     }
121                 }
122             }
123             else if(line.startsWith("view"))
124                 System.out.println("View: " + ch.getView());
125             else if(line.startsWith("help"))
126                 help();
127             printLocks();
128         }
129     }
130 
parseLockNames(String line)131     protected static List<String> parseLockNames(String line) {
132         List<String> lock_names=new ArrayList<String>();
133         if(line == null || line.length() == 0)
134             return lock_names;
135         StringTokenizer tokenizer=new StringTokenizer(line);
136         while(tokenizer.hasMoreTokens())
137             lock_names.add(tokenizer.nextToken());
138         return lock_names;
139     }
140 
printLocks()141     protected void printLocks() {
142         System.out.println("\n" + lock_service.printLocks());
143     }
144 
145 
146 
main(String[] args)147     public static void main(String[] args) throws Exception {
148         String props=null;
149         String name=null;
150 
151         for(int i=0; i < args.length; i++) {
152             if(args[i].equals("-props")) {
153                 props=args[++i];
154                 continue;
155             }
156             if(args[i].equals("-name")) {
157                 name=args[++i];
158                 continue;
159             }
160 
161             help();
162             return;
163         }
164 
165         LockServiceDemo demo=new LockServiceDemo(props, name);
166         demo.start();
167     }
168 
help()169     protected static void help() {
170         System.out.println("\nLockServiceDemo [-props properties] [-name name]\n" +
171                              "Valid commands:\n\n" +
172                              "lock (<lock name>)+\n" +
173                              "unlock (<lock name> | \"ALL\")+\n" +
174                              "trylock (<lock name>)+ [<timeout>]\n");
175         System.out.println("Example:\nlock lock lock2 lock3\nunlock all\ntrylock bela michelle 300");
176     }
177 
178 }
179