我用JMX用的並不多,多半而言就是拿來控制Logger 的Level,最多加個清Cache,其餘就沒什麼特別在意的。
控制的介面用jconsole多半還過得去,部份案子還是會使用mx4j的HttpAdaptor來建立Web的操作介面,只是在使用上,要自動帶起HttpAdaptor還是有些困擾。
先看看MX4J 的HttpAdaptor,
public void start() throws IOException {
final Logger logger = getLogger();
if (server != null) {
serverSocket = createServerSocket();
.....
} else {
if (logger.isEnabledFor(Logger.INFO)) logger.info("Start failed, no server target server has been set");
}
}
呼叫start()後,HttpAdaptor就可以提供Web的操作介面。不過HttpAdaptor一開始就會先確認MBeanServer "server" 的有無,如果沒有就會寫個Log然後結束。
而這個MBeanServer什麼時候會被加進來呢?
是依JMX規格MBeanRegistration,執行preRegister()後才會帶進來,所以如果想在Spring的設定檔裡,加個init-method="start",是無法讓這個Adaptor正常提供Web操作。
那就看看Spring MBeanExporter的原始碼是如何操作MBean的Lifecycle,看到MBeanExporterLinstener這Interface,所以我們可以透過這interface讓系統自動帶起HttpAdaptor;但實際上執行有點困難,因為Spring 2.5以後提供了一個context:mbean-server,可以直接取得系統中現有的MBeanServer或是自行建立一個,所以比較無從加入MBeanExporterLinstener到MBeanServer中。
最後想想,還是從MBeanRegistration這個介面下手,所以直接extend HttpAdaptor後override postRegister()....
public class AutostartHttpAdaptor extends HttpAdaptor {
private static final Logger logger = LoggerFactory.getLogger(AutostartHttpAdaptor.class);
@Override
public void postRegister(Boolean registrationDone) {
super.postRegister(registrationDone);
if (!registrationDone) {
logger.warn("HttpAdaptor should not be invoked start() without registration success.");
return;
}
logger.info("Post Register HttpAdaptor('"+registrationDone+"'):");
try {
this.start();
} catch (IOException e) {
logger.error("HttpAdaptor startup has been failed.", e);
}
}
@Override
public void postDeregister() {
super.postDeregister();
logger.info("Post Deregister HttpAdaptor():");
this.stop();
}
}
沒有留言:
張貼留言