/*
* Copyright 2001-2009 Terracotta, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package org.quartz.ee.jmx.jboss;
import org.quartz.SchedulerException;
import org.quartz.impl.RemoteMBeanScheduler;
import javax.management.AttributeList;
import javax.management.MBeanServerConnection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Arrays;
import java.util.Properties;
/**
* <p>
* An implementation of the <code>Scheduler</code> interface that remotely
* proxies all method calls to the equivalent call on a given <code>QuartzScheduler</code>
* instance, via JBoss's JMX RMIAdaptor.
* </p>
*
* <p>
* Set the <b>providerURL</b> property to your MBean server URL.
* This defaults to: <i>jnp://localhost:1099</i>
* </p>
*
* @see org.quartz.Scheduler
* @see org.quartz.core.QuartzScheduler
*/
public class JBoss4RMIRemoteMBeanScheduler extends RemoteMBeanScheduler {
private static final String DEFAULT_PROVIDER_URL = "jnp://localhost:1099";
private static final String RMI_ADAPTOR_JNDI_NAME = "jmx/rmi/RMIAdaptor";
private MBeanServerConnection server = null;
private String providerURL = DEFAULT_PROVIDER_URL;
public JBoss4RMIRemoteMBeanScheduler() throws SchedulerException {
}
/**
* Set the remote MBean server URL.
*
* Defaults to: <i>jnp://localhost:1099</i>
*/
public void setProviderURL(String providerURL) {
this.providerURL = providerURL;
}
/**
* Initialize this remote MBean scheduler, getting the JBoss
* RMIAdaptor for communication.
*/
@Override
public void initialize() throws SchedulerException {
InitialContext ctx = null;
try {
ctx = new InitialContext(getContextProperties());
server = (MBeanServerConnection)ctx.lookup(RMI_ADAPTOR_JNDI_NAME);
} catch (Exception e) {
throw new SchedulerException("Failed to lookup JBoss JMX RMI Adaptor.", e);
} finally {
if (ctx != null) {
try {
ctx.close();
} catch (NamingException ignore) {
}
}
}
}
/**
* Get the properties to use when creating a JNDI InitialContext.
*
* <p>
* This method is broken out so it can be extended to pass credentials
* or other properties not currently supported.
* </p>
*/
protected Properties getContextProperties() {
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
props.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
props.put(Context.PROVIDER_URL, providerURL);
return props;
}
@Override
protected Object getAttribute(String attribute) throws SchedulerException {
try {
return server.getAttribute(getSchedulerObjectName(), attribute);
} catch (Exception e) {
throw new SchedulerException("Failed to get Scheduler MBean attribute: " + attribute, e);
}
}
@Override
protected AttributeList getAttributes(String[] attributes) throws SchedulerException {
try {
return server.getAttributes(getSchedulerObjectName(), attributes);
} catch (Exception e) {
throw new SchedulerException("Failed to get Scheduler MBean attributes: " + Arrays.asList(attributes), e);
}
}
@Override
protected Object invoke(String operationName, Object[] params,
String[] signature) throws SchedulerException {
try {
return server.invoke(getSchedulerObjectName(), operationName, params, signature);
} catch (Exception e) {
throw new SchedulerException(
"Failed to invoke Scheduler MBean operation: " + operationName, e);
}
}
}