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