zhouping
5 years ago
9 changed files with 58 additions and 539 deletions
@ -1,110 +0,0 @@ |
|||||||
package com.fr.third.v2.org.quartz.jobs.ee.ejb; |
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException; |
|
||||||
|
|
||||||
import javax.naming.InitialContext; |
|
||||||
import javax.naming.NamingException; |
|
||||||
|
|
||||||
import com.fr.third.v2.org.quartz.JobDataMap; |
|
||||||
import com.fr.third.v2.org.quartz.JobExecutionContext; |
|
||||||
import com.fr.third.v2.org.quartz.JobExecutionException; |
|
||||||
|
|
||||||
/** |
|
||||||
* <p> |
|
||||||
* A <code>Job</code> that invokes a method on an EJB3. |
|
||||||
* </p> |
|
||||||
* |
|
||||||
* <p> |
|
||||||
* Expects the properties corresponding to the following keys to be in the |
|
||||||
* <code>JobDataMap</code> when it executes: |
|
||||||
* <ul> |
|
||||||
* <li><code>EJB_JNDI_NAME_KEY</code>- the JNDI name (location) of the EJB's |
|
||||||
* home interface.</li> |
|
||||||
* <li><code>EJB_METHOD_KEY</code>- the name of the method to invoke on the EJB. |
|
||||||
* </li> |
|
||||||
* <li><code>EJB_ARGS_KEY</code>- an Object[] of the args to pass to the method |
|
||||||
* (optional, if left out, there are no arguments).</li> |
|
||||||
* <li><code>EJB_ARG_TYPES_KEY</code>- an Class[] of the types of the args to |
|
||||||
* pass to the method (optional, if left out, the types will be derived by |
|
||||||
* calling getClass() on each of the arguments).</li> |
|
||||||
* </ul> |
|
||||||
* <br/> |
|
||||||
* The following keys can also be used at need: |
|
||||||
* <ul> |
|
||||||
* <li><code>INITIAL_CONTEXT_FACTORY</code> - the context factory used to build |
|
||||||
* the context.</li> |
|
||||||
* <li><code>PROVIDER_URL</code> - the name of the environment property for |
|
||||||
* specifying configuration information for the service provider to use.</li> |
|
||||||
* </ul> |
|
||||||
* </p> |
|
||||||
* |
|
||||||
* <p> |
|
||||||
* The result of the EJB method invocation will be available to |
|
||||||
* <code>Job/TriggerListener</code>s via |
|
||||||
* <code>{@link com.fr.third.v2.org.quartz.JobExecutionContext#getResult()}</code>. |
|
||||||
* </p> |
|
||||||
* |
|
||||||
* @author hhuynh |
|
||||||
* @see {@link EJBInvokerJob} |
|
||||||
*/ |
|
||||||
public class EJB3InvokerJob extends EJBInvokerJob { |
|
||||||
|
|
||||||
@Override |
|
||||||
public void execute(JobExecutionContext context) |
|
||||||
throws JobExecutionException { |
|
||||||
JobDataMap dataMap = context.getMergedJobDataMap(); |
|
||||||
|
|
||||||
String ejb = dataMap.getString(EJB_JNDI_NAME_KEY); |
|
||||||
String method = dataMap.getString(EJB_METHOD_KEY); |
|
||||||
|
|
||||||
Object[] arguments = (Object[]) dataMap.get(EJB_ARGS_KEY); |
|
||||||
if (arguments == null) { |
|
||||||
arguments = new Object[0]; |
|
||||||
} |
|
||||||
if (ejb == null) { |
|
||||||
throw new JobExecutionException("must specify EJB_JNDI_NAME_KEY"); |
|
||||||
} |
|
||||||
if (method == null) { |
|
||||||
throw new JobExecutionException("must specify EJB_METHOD_KEY"); |
|
||||||
} |
|
||||||
|
|
||||||
InitialContext jndiContext = null; |
|
||||||
Object value = null; |
|
||||||
try { |
|
||||||
try { |
|
||||||
jndiContext = getInitialContext(dataMap); |
|
||||||
value = jndiContext.lookup(ejb); |
|
||||||
} catch (NamingException ne) { |
|
||||||
throw new JobExecutionException(ne); |
|
||||||
} |
|
||||||
|
|
||||||
Class<?>[] argTypes = (Class[]) dataMap.get(EJB_ARG_TYPES_KEY); |
|
||||||
if (argTypes == null) { |
|
||||||
argTypes = new Class[arguments.length]; |
|
||||||
for (int i = 0; i < arguments.length; i++) { |
|
||||||
argTypes[i] = arguments[i].getClass(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
try { |
|
||||||
Object returnValue = value.getClass() |
|
||||||
.getMethod(method, argTypes).invoke(value, arguments); |
|
||||||
context.setResult(returnValue); |
|
||||||
} catch (IllegalAccessException iae) { |
|
||||||
throw new JobExecutionException(iae); |
|
||||||
} catch (InvocationTargetException ite) { |
|
||||||
throw new JobExecutionException(ite.getTargetException()); |
|
||||||
} catch (NoSuchMethodException nsme) { |
|
||||||
throw new JobExecutionException(nsme); |
|
||||||
} |
|
||||||
} finally { |
|
||||||
if (jndiContext != null) { |
|
||||||
try { |
|
||||||
jndiContext.close(); |
|
||||||
} catch (Exception e) { |
|
||||||
// ignored
|
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,277 +0,0 @@ |
|||||||
/* |
|
||||||
* All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved. |
|
||||||
* |
|
||||||
* 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 com.fr.third.v2.org.quartz.jobs.ee.ejb; |
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException; |
|
||||||
import java.lang.reflect.Method; |
|
||||||
import java.rmi.RemoteException; |
|
||||||
import java.util.Hashtable; |
|
||||||
|
|
||||||
import javax.ejb.EJBHome; |
|
||||||
import javax.ejb.EJBMetaData; |
|
||||||
import javax.ejb.EJBObject; |
|
||||||
import javax.naming.Context; |
|
||||||
import javax.naming.InitialContext; |
|
||||||
import javax.naming.NamingException; |
|
||||||
import javax.rmi.PortableRemoteObject; |
|
||||||
|
|
||||||
import com.fr.third.v2.org.quartz.Job; |
|
||||||
import com.fr.third.v2.org.quartz.JobDataMap; |
|
||||||
import com.fr.third.v2.org.quartz.JobExecutionContext; |
|
||||||
import com.fr.third.v2.org.quartz.JobExecutionException; |
|
||||||
|
|
||||||
/** |
|
||||||
* <p> |
|
||||||
* A <code>Job</code> that invokes a method on an EJB. |
|
||||||
* </p> |
|
||||||
* |
|
||||||
* <p> |
|
||||||
* Expects the properties corresponding to the following keys to be in the |
|
||||||
* <code>JobDataMap</code> when it executes: |
|
||||||
* <ul> |
|
||||||
* <li><code>EJB_JNDI_NAME_KEY</code>- the JNDI name (location) of the |
|
||||||
* EJB's home interface.</li> |
|
||||||
* <li><code>EJB_METHOD_KEY</code>- the name of the method to invoke on the |
|
||||||
* EJB.</li> |
|
||||||
* <li><code>EJB_ARGS_KEY</code>- an Object[] of the args to pass to the |
|
||||||
* method (optional, if left out, there are no arguments).</li> |
|
||||||
* <li><code>EJB_ARG_TYPES_KEY</code>- an Class[] of the types of the args to |
|
||||||
* pass to the method (optional, if left out, the types will be derived by |
|
||||||
* calling getClass() on each of the arguments).</li> |
|
||||||
* </ul> |
|
||||||
* <br/> |
|
||||||
* The following keys can also be used at need: |
|
||||||
* <ul> |
|
||||||
* <li><code>INITIAL_CONTEXT_FACTORY</code> - the context factory used to |
|
||||||
* build the context.</li> |
|
||||||
* <li><code>PROVIDER_URL</code> - the name of the environment property |
|
||||||
* for specifying configuration information for the service provider to use. |
|
||||||
* </li> |
|
||||||
* </ul> |
|
||||||
* </p> |
|
||||||
* |
|
||||||
* <p> |
|
||||||
* The result of the EJB method invocation will be available to |
|
||||||
* <code>Job/TriggerListener</code>s via |
|
||||||
* <code>{@link com.fr.third.v2.org.quartz.JobExecutionContext#getResult()}</code>. |
|
||||||
* </p> |
|
||||||
* |
|
||||||
* @author Andrew Collins |
|
||||||
* @author James House |
|
||||||
* @author Joel Shellman |
|
||||||
* @author <a href="mailto:bonhamcm@thirdeyeconsulting.com">Chris Bonham</a> |
|
||||||
*/ |
|
||||||
public class EJBInvokerJob implements Job { |
|
||||||
|
|
||||||
/* |
|
||||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
||||||
* |
|
||||||
* Constants. |
|
||||||
* |
|
||||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
||||||
*/ |
|
||||||
|
|
||||||
public static final String EJB_JNDI_NAME_KEY = "ejb"; |
|
||||||
|
|
||||||
public static final String EJB_METHOD_KEY = "method"; |
|
||||||
|
|
||||||
public static final String EJB_ARG_TYPES_KEY = "argTypes"; |
|
||||||
|
|
||||||
public static final String EJB_ARGS_KEY = "args"; |
|
||||||
|
|
||||||
public static final String INITIAL_CONTEXT_FACTORY = "java.naming.factory.initial"; |
|
||||||
|
|
||||||
public static final String PROVIDER_URL = "java.naming.provider.url"; |
|
||||||
|
|
||||||
public static final String PRINCIPAL = "java.naming.security.principal"; |
|
||||||
|
|
||||||
public static final String CREDENTIALS = "java.naming.security.credentials"; |
|
||||||
|
|
||||||
|
|
||||||
/* |
|
||||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
||||||
* |
|
||||||
* Constructors. |
|
||||||
* |
|
||||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
||||||
*/ |
|
||||||
|
|
||||||
public EJBInvokerJob() { |
|
||||||
// nothing
|
|
||||||
} |
|
||||||
|
|
||||||
/* |
|
||||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
||||||
* |
|
||||||
* Interface. |
|
||||||
* |
|
||||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
||||||
*/ |
|
||||||
|
|
||||||
public void execute(JobExecutionContext context) |
|
||||||
throws JobExecutionException { |
|
||||||
JobDataMap dataMap = context.getMergedJobDataMap(); |
|
||||||
|
|
||||||
String ejb = dataMap.getString(EJB_JNDI_NAME_KEY); |
|
||||||
String method = dataMap.getString(EJB_METHOD_KEY); |
|
||||||
Object[] arguments = (Object[]) dataMap.get(EJB_ARGS_KEY); |
|
||||||
if (arguments == null) { |
|
||||||
arguments = new Object[0]; |
|
||||||
} |
|
||||||
|
|
||||||
if (ejb == null) { |
|
||||||
// must specify remote home
|
|
||||||
throw new JobExecutionException(); |
|
||||||
} |
|
||||||
|
|
||||||
InitialContext jndiContext = null; |
|
||||||
|
|
||||||
// get initial context
|
|
||||||
try { |
|
||||||
jndiContext = getInitialContext(dataMap); |
|
||||||
} catch (NamingException ne) { |
|
||||||
throw new JobExecutionException(ne); |
|
||||||
} |
|
||||||
|
|
||||||
try { |
|
||||||
Object value = null; |
|
||||||
|
|
||||||
// locate home interface
|
|
||||||
try { |
|
||||||
value = jndiContext.lookup(ejb); |
|
||||||
} catch (NamingException ne) { |
|
||||||
throw new JobExecutionException(ne); |
|
||||||
} |
|
||||||
|
|
||||||
// get home interface
|
|
||||||
EJBHome ejbHome = (EJBHome) PortableRemoteObject.narrow(value, |
|
||||||
EJBHome.class); |
|
||||||
|
|
||||||
// get meta data
|
|
||||||
EJBMetaData metaData = null; |
|
||||||
|
|
||||||
try { |
|
||||||
metaData = ejbHome.getEJBMetaData(); |
|
||||||
} catch (RemoteException re) { |
|
||||||
throw new JobExecutionException(re); |
|
||||||
} |
|
||||||
|
|
||||||
// get home interface class
|
|
||||||
Class<?> homeClass = metaData.getHomeInterfaceClass(); |
|
||||||
|
|
||||||
// get remote interface class
|
|
||||||
Class<?> remoteClass = metaData.getRemoteInterfaceClass(); |
|
||||||
|
|
||||||
// get home interface
|
|
||||||
ejbHome = (EJBHome) PortableRemoteObject.narrow(ejbHome, homeClass); |
|
||||||
|
|
||||||
Method methodCreate = null; |
|
||||||
|
|
||||||
try { |
|
||||||
// create method 'create()' on home interface
|
|
||||||
methodCreate = homeClass.getMethod("create", ((Class[])null)); |
|
||||||
} catch (NoSuchMethodException nsme) { |
|
||||||
throw new JobExecutionException(nsme); |
|
||||||
} |
|
||||||
|
|
||||||
// create remote object
|
|
||||||
EJBObject remoteObj = null; |
|
||||||
|
|
||||||
try { |
|
||||||
// invoke 'create()' method on home interface
|
|
||||||
remoteObj = (EJBObject) methodCreate.invoke(ejbHome, ((Object[])null)); |
|
||||||
} catch (IllegalAccessException iae) { |
|
||||||
throw new JobExecutionException(iae); |
|
||||||
} catch (InvocationTargetException ite) { |
|
||||||
throw new JobExecutionException(ite); |
|
||||||
} |
|
||||||
|
|
||||||
// execute user-specified method on remote object
|
|
||||||
Method methodExecute = null; |
|
||||||
|
|
||||||
try { |
|
||||||
// create method signature
|
|
||||||
|
|
||||||
Class<?>[] argTypes = (Class[]) dataMap.get(EJB_ARG_TYPES_KEY); |
|
||||||
if (argTypes == null) { |
|
||||||
argTypes = new Class[arguments.length]; |
|
||||||
for (int i = 0; i < arguments.length; i++) { |
|
||||||
argTypes[i] = arguments[i].getClass(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// get method on remote object
|
|
||||||
methodExecute = remoteClass.getMethod(method, argTypes); |
|
||||||
} catch (NoSuchMethodException nsme) { |
|
||||||
throw new JobExecutionException(nsme); |
|
||||||
} |
|
||||||
|
|
||||||
try { |
|
||||||
// invoke user-specified method on remote object
|
|
||||||
Object returnObj = methodExecute.invoke(remoteObj, arguments); |
|
||||||
|
|
||||||
// Return any result in the JobExecutionContext so it will be
|
|
||||||
// available to Job/TriggerListeners
|
|
||||||
context.setResult(returnObj); |
|
||||||
} catch (IllegalAccessException iae) { |
|
||||||
throw new JobExecutionException(iae); |
|
||||||
} catch (InvocationTargetException ite) { |
|
||||||
throw new JobExecutionException(ite); |
|
||||||
} |
|
||||||
} finally { |
|
||||||
// Don't close jndiContext until after method execution because
|
|
||||||
// WebLogic requires context to be open to keep the user credentials
|
|
||||||
// available. See JIRA Issue: QUARTZ-401
|
|
||||||
if (jndiContext != null) { |
|
||||||
try { |
|
||||||
jndiContext.close(); |
|
||||||
} catch (NamingException e) { |
|
||||||
// Ignore any errors closing the initial context
|
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
protected InitialContext getInitialContext(JobDataMap jobDataMap) |
|
||||||
throws NamingException { |
|
||||||
Hashtable<String, String> params = new Hashtable<String, String>(2); |
|
||||||
|
|
||||||
String initialContextFactory = |
|
||||||
jobDataMap.getString(INITIAL_CONTEXT_FACTORY); |
|
||||||
if (initialContextFactory != null) { |
|
||||||
params.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory); |
|
||||||
} |
|
||||||
|
|
||||||
String providerUrl = jobDataMap.getString(PROVIDER_URL); |
|
||||||
if (providerUrl != null) { |
|
||||||
params.put(Context.PROVIDER_URL, providerUrl); |
|
||||||
} |
|
||||||
|
|
||||||
String principal = jobDataMap.getString(PRINCIPAL); |
|
||||||
if ( principal != null ) { |
|
||||||
params.put( Context.SECURITY_PRINCIPAL, principal ); |
|
||||||
} |
|
||||||
|
|
||||||
String credentials = jobDataMap.getString(CREDENTIALS); |
|
||||||
if ( credentials != null ) { |
|
||||||
params.put( Context.SECURITY_CREDENTIALS, credentials ); |
|
||||||
} |
|
||||||
|
|
||||||
return (params.size() == 0) ? new InitialContext() : new InitialContext(params); |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue