001 package org.shiftone.jrat.core.jmx;
002
003
004 import org.shiftone.jrat.util.log.Logger;
005
006 import java.util.ArrayList;
007 import java.util.List;
008
009
010 /**
011 * @author jeff@shiftone.org (Jeff Drost)
012 */
013 public class WaitingJmxRegistry implements JmxRegistry, Runnable {
014
015 private static final Logger LOG = Logger.getLogger(WaitingJmxRegistry.class);
016 private List waitList = new ArrayList();
017 private final JmxRegistry registry;
018 private final Thread waitThread;
019
020 public WaitingJmxRegistry(JmxRegistry registry) {
021
022 this.registry = registry;
023 this.waitThread = new Thread(this);
024
025 this.waitThread.setDaemon(true);
026 this.waitThread.setName("JRat-JMX-Poller");
027 this.waitThread.setPriority(Thread.MIN_PRIORITY);
028 this.waitThread.start();
029 }
030
031
032 public boolean isReady() {
033 return true;
034 }
035
036
037 public void registerMBean(Object object, String name) {
038
039 synchronized (this) {
040 waitList.add(new WaitingRegisterRequest(object, name));
041 }
042 }
043
044
045 private void registerNow() {
046
047 List currentList = null;
048
049 synchronized (this) {
050 if (!waitList.isEmpty()) {
051
052 // if there are waiting mbeans, then "copy" the list
053 currentList = waitList;
054 this.waitList = new ArrayList();
055 }
056 }
057
058 if (currentList != null) {
059 LOG.info("registering " + currentList.size() + " mbean(s)");
060
061 for (int i = 0; i < currentList.size(); i++) {
062 WaitingRegisterRequest request = (WaitingRegisterRequest) currentList.get(i);
063
064 registry.registerMBean(request.object, request.name);
065 }
066 }
067 }
068
069
070 public void run() {
071
072 int sleep = 10000;
073
074 while (true) {
075 try {
076 LOG.debug("polling MBeanServer...");
077
078 if (registry.isReady()) {
079 registerNow();
080
081 return;
082 }
083
084 Thread.sleep(sleep);
085 }
086 catch (Throwable e) {
087 LOG.warn("JMX poller thread encountered an error", e);
088 }
089 }
090 }
091
092
093 private class WaitingRegisterRequest {
094
095 private Object object;
096 private String name;
097
098 public WaitingRegisterRequest(Object object, String name) {
099 this.object = object;
100 this.name = name;
101 }
102 }
103 }