`
longgangbai
  • 浏览: 7339201 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

          在Quartz2.0中提供支持EJB2.0的服务,下面实例为Quartz2.0中EJB2.0的支持。

EJBInvokerJob的源代码如下:

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
                }
            }
        }
    }

    private InitialContext getInitialContext(JobDataMap jobDataMap)
        throws NamingException {
        Hashtable params = new Hashtable(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);
    }    
}

 

自定义EJBHome接口:

package com.easyway.app.ejb;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
/**
 * Home接口的方法
 * @author longgangbai
 *
 */
public interface HelloWorldHome extends EJBHome
{
	HelloWorldRemote create() throws RemoteException, CreateException;
}

 

EJB远程接口:

package com.easyway.app.ejb;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
/**
 * 远程接口
 * @author longgangbai
 *
 */
public interface HelloWorldRemote extends EJBObject
{
	 public String sayHello(String country,String cityName) throws RemoteException;

}

 

EJB的bean类:

package com.easyway.app.ejb;

import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
/**
 * 會話bean的实现
 * 
 * (必须有会话bean的5个状态,可以为空实现,和远程接口中要实现的方法,
 * 把实现方法写在一个类里,每次 new一个类的对象,返回一个实现方法给Bean)
 * 
 * @author longgangbai
 *
 */
public class HelloWorldBean implements SessionBean
{
	
		 /**
		 * 
		 */
		private static final long serialVersionUID = 1L;

	    public void setSessionContext(SessionContext arg0) throws EJBException, RemoteException
	    {
	        System.out.println("set session context");
	        
	    }
	    
	    public void ejbCreate() throws EJBException
	    {
	        System.out.println("ejb create");
	        
	    }

	    public void ejbRemove() throws EJBException, RemoteException
	    {
	        System.out.println("ejb remove");
	    }

	    public void ejbActivate() throws EJBException, RemoteException
	    {
	        System.out.println("ejb activate");
	    }

	    public void ejbPassivate() throws EJBException, RemoteException
	    {
	        System.out.println("ejb passivate");
	    }
        /**
         * 自定义的EJB的方法
         * @param country
         * @param cityName
         * @return
         * @throws RemoteException
         */
	    public String sayHello(String country,String cityName) throws RemoteException
	    {
	        String helloworld="your are in "+country+" on "+cityName+"Welecome to ejb2.0,HXL";
	        System.out.println("helloworld="+helloworld);
	        return helloworld;
	    }

	}

 在META-INF包下的ejb-jar.xml配置如下:

<?xml version="1.0" encoding="gb2312"?> 
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" 
"http://java.sun.com/dtd/ejb-jar_2_0.dtd">

<ejb-jar>
	<description>ejb</description>
	<display-name>quartzEJB2</display-name>
	<!-- 
	   配置会话bean的信息
	 -->
	<enterprise-beans>
		<session>
			<display-name>helloEJB</display-name>
			<ejb-name>helloEJB</ejb-name>
			<home>com.easyway.app.ejb.HelloWorldHome</home>
			<remote>
				com.easyway.app.ejb.HelloWorldRemote
			</remote>
			<ejb-class>
				com.easyway.app.ejb.HelloWorldBean
			</ejb-class>
			<session-type>Stateful</session-type>
			<transaction-type>Bean</transaction-type>
		</session>
	</enterprise-beans>
</ejb-jar>

 

jboss配置如下:

jboss.xml内容如下:

<?xml version="1.0" encoding="gb2312"?>
<!-- 
<jndi-name>元素的值必须在容器中唯一
 -->
<jboss>
	<enterprise-beans>
		<session>
			<ejb-name>helloEJB</ejb-name>
			<jndi-name>ejb/helloEJB</jndi-name>
		</session>
	</enterprise-beans>
</jboss>

 

 

 

创建触发器和相关的job调用

package com.easyway.app.ejb;

import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import java.text.ParseException;
import java.util.Date;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.jobs.ee.ejb.EJBInvokerJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * 调用EJB2.0的定时任务
 * @author longgangbai
 *
 */
public class QuartzEjb2Main {

		/**
		 * 
		 * @param args
		 * @throws SchedulerException
		 * @throws ParseException
		 */
		public static void main(String[] args) throws SchedulerException, ParseException {
	        Logger log = LoggerFactory.getLogger(QuartzEjb2Main.class);

	        log.info("------- Initializing -------------------");

	        // First we must get a reference to a scheduler
	        //创建调度任务工厂
	        SchedulerFactory sf = new StdSchedulerFactory();
	        //创建调度对象
	        Scheduler sched = sf.getScheduler();

	        log.info("------- Scheduling Jobs ----------------");

	        // jobs can be scheduled before sched.start() has been called
	        // job 1 will run every 20 seconds
	        //创建一个定时任务
	        JobDetail job = newJob(EJBInvokerJob.class)
	            .withIdentity("job1", "group1")
	            .build();
	        //创建Cron触发器
	        CronTrigger trigger = newTrigger()
	            .withIdentity("trigger1", "group1")
	            .withSchedule(cronSchedule("0/20 * * * * ?"))
	            .build();
	        
	        //创建一个初始化任务的信息
	        // pass initialization parameters into the job
	        JobDataMap jobDataMap=job.getJobDataMap();
            //设置EJB的JNDI名称
	        jobDataMap.put(EJBInvokerJob.EJB_JNDI_NAME_KEY, "ejb/helloEJB");
	        //设置ejb的调用方法名称
	        jobDataMap.put(EJBInvokerJob.EJB_METHOD_KEY, "sayHello");
	        //设置ejb输入参数的类型
	        jobDataMap.put(EJBInvokerJob.EJB_ARG_TYPES_KEY,new Class[]{ String.class,String.class});
	        //设置输入类型的参数值
	        jobDataMap.put(EJBInvokerJob.EJB_ARGS_KEY,new Object[]{ "china","shanghai"});
	        //设置EJB的初始化参数
	        jobDataMap.put(EJBInvokerJob.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
	        //jobDataMap.put(EJBInvokerJob.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");
	        //设置EBJ的uri路径
	        jobDataMap.put(EJBInvokerJob.PROVIDER_URL, "jnp://localhost:1099");
	        
	        //设置调用相关的任务和触发器信息
	        Date ft = sched.scheduleJob(job, trigger);
	        log.info(job.getKey() + " has been scheduled to run at: " + ft
	                + " and repeat based on expression: "
	                + trigger.getCronExpression());
	        //启动相关的的调度信息
	        sched.start();

	        log.info("------- Started Scheduler -----------------");

	        log.info("------- Waiting five minutes... ------------");
	        try {
	            // wait five minutes to show jobs
	            Thread.sleep(300L * 1000L);
	            // executing...
	        } catch (Exception e) {
	        }

	        log.info("------- Shutting Down ---------------------");
            //关闭相关的调度
	        sched.shutdown(true);

	        log.info("------- Shutdown Complete -----------------");
	        SchedulerMetaData metaData = sched.getMetaData();
	        log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");
		}

	}

 

分享到:
评论

相关推荐

    quartz 2.2.1 定时调度 java

    quartz 2.2.1 定时调度 java 最新版jar

    quartz动态定时调度完整代码

    Quartz是一款开源的作业调度框架,它允许开发者创建、组织和执行定时任务。在Java开发环境中,Quartz被广泛用于实现应用程序的自动化任务调度。这个压缩包“quartz动态定时调度完整代码”提供了使用Quartz进行动态...

    spring2.0 Quartz 执行每天定时任务 普通普是执行任务

    标题中的“spring2.0 Quartz 执行每天定时任务 普通普是执行任务”涉及到的是在Spring 2.0框架中使用Quartz库来创建并执行每天定时任务的场景。Quartz是一款强大的开源作业调度框架,它可以用来按计划执行各种任务,...

    SpringBoot整合Quartz任务定时调度

    本篇文章将详细探讨如何在Spring Boot项目中整合Quartz实现任务定时调度。 首先,我们需要理解Spring Boot与Quartz的整合基础。Spring Boot简化了Quartz的集成过程,我们可以通过添加相应的依赖来引入Quartz。在`...

    ASP.NET使用Quartz.NET实现定时任务调度

    结合使用Quartz.NET和TopShelf,我们可以构建一个在Windows服务中运行的定时任务调度系统。 Quartz.NET的特性包括: 1. **灵活的调度**:Quartz.NET支持多种调度模式,如简单触发器、cron触发器,可以按照精确时间...

    Quartz.net作业调度自定义定时执行任务多任务执行c#

    Quartz.NET是一个强大的开源作业调度框架,用于在.NET环境中创建和执行定时任务。它提供了高度灵活的调度功能,使得开发者可以轻松地定义和控制任务的执行时间。在"Quartz.net作业调度自定义定时执行任务多任务执行...

    quartz 定时任务调度

    在“quartz 定时任务调度”这个主题中,我们将深入探讨Quartz的主要特性、如何使用cron表达式以及在MVC版本中的应用,同时也会提及插件部署。 1. **Quartz简介** Quartz是一个开源的作业调度库,它允许开发人员将...

    quartz java定时调度代码

    Java 是一种广泛使用的编程语言,尤其在企业级应用中,而 Quartz 将 Java 的强大功能与灵活的定时任务调度相结合,为开发者提供了强大的工具。 在描述中提到的"quartz java定时调度代码"示例,它演示了如何配置和...

    quartz定时调度完整实例

    在这个"quartz定时调度完整实例"中,我们将深入理解Quartz的工作原理和如何在项目中实际应用。 1. **Quartz简介** - Quartz是Cron-like和Calendar-based作业调度的Java实现,它允许开发人员在应用程序中定义、安排...

    spring2.0 使用 Quartz 必备包

    spring2.0 使用 Quartz 必备包 里面有: quartz-all-1.5.2.jar spring-support.jar 适合:SSH框架 spring2.0 strut2.0 hibernate3.2等

    C# quartz.net 定时任务源码 可以远程控制

    【标题】"C# quartz.net 定时任务源码 可以远程控制"涉及的核心知识点主要集中在C#编程语言、Quartz.NET库以及系统服务的安装与管理。Quartz.NET是一个开源的作业调度框架,它允许开发人员在.NET环境中创建和执行...

    spring整合quartz定时任务调度

    Spring框架作为Java领域广泛使用的轻量级框架,提供了与第三方库Quartz的整合,使得开发者能够轻松地在Spring应用中实现复杂的定时任务调度。Quartz是一款开源的作业调度框架,支持丰富的调度策略,可以满足各种定时...

    C#定时调度任务服务

    在IT行业中,定时调度任务服务是不可或缺的一部分,它使得系统能够按预设的时间间隔自动执行某些任务,提高了工作效率并降低了人为操作的复杂性。本文将深入探讨如何利用C#语言,结合Quartz.NET任务调度库以及Log4...

    完美解决多应用服务器负载均衡环境下spring quartz同一定时任务重复执行问题

    Spring Quartz是一个强大的、开源的作业调度框架,允许开发者定义和执行复杂的定时任务。然而,当多个服务器实例并行运行时,如果不采取适当的策略,同一定时任务可能会在每个服务器上都执行,导致数据不一致和资源...

    spring--quartz的定时调度的maven部署

    在IT行业中,Spring框架是Java企业级应用开发的首选,而Quartz则是一个强大的任务调度库,能够帮助我们实现应用程序中的定时任务。本篇将详细探讨如何在Spring中结合Quartz进行定时调度,并通过Maven进行项目部署。 ...

    springboot2.0整合quartz

    在Spring Boot 2.0中整合Quartz,可以利用这些新特性来构建更高效、更灵活的定时任务系统。 整合Quartz与Spring Boot 2.0的方式主要是通过`spring-boot-starter-quartz`模块。这个模块提供了与Spring Boot自动配置...

    spring3+quartz2 定时调度例子,能正常运行的程序

    spring3.2.4+quartz2.2.0 定时调度例子,能正常运行的程序

    Quartz,EJB资料

    总结来说,这些资料涵盖了企业级Java开发中的关键领域:Quartz的定时任务调度,EJB的接口设计原则,以及利用iText进行PDF文档处理。学习并掌握这些技术,将有助于提升你在Java EE开发中的专业水平,使你能够构建更加...

    Quartz定时调度样例

    Quartz定时调度样例 Quartz是 Java 中的一种流行的开源作业调度框架,广泛应用于各种企业级应用系统。它提供了强大的作业调度功能,允许开发者轻松地创建和管理各种类型的作业。今天,我们将通过一个简单的示例来...

Global site tag (gtag.js) - Google Analytics