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

Quartz中定时调度EJB3.0服务

 
阅读更多

        在quartz2.0中只支持EJb2.0的服务支持,但是对EJB3.0没有提供支持,所以自定义quartz相关的job类EJB3InvokerJob对EJb3.0的支持。

 

EJb3.0的接口:

package easyway.tbs.app.ejb;
/**
 * EJB服务接口类
 * @author longgangbai
 *
 */
public interface SysTimeEngine {
	
	public String helloword(String username);

}

 

EJb3.0的服务实现类:

package easyway.tbs.app.ejb;


import java.util.Date;

import javax.ejb.Remote;
import javax.ejb.Stateless;

/**
 * EJB服务接口实现类
 * @author longgangbai
 *
 */
@Stateless(name = "SysTimeEngine")
@Remote(SysTimeEngine.class)
public class SysTimeBean implements SysTimeEngine {
	
	public String helloword(String username)
	{
		return "helloworld ,"+username+new Date();
	}
}

 

 

package easyway.tbs.app.ejb;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Hashtable;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * 一个调用EJb3.0的Job类
 * @author longgangbai
 *
 */
public class EJB3InvokerJob implements Job {
	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 OBJECT_FACTORIES = "java.naming.factory.object";

	public static final String STATE_FACTORIES = "java.naming.factory.state";

	public static final String URL_PKG_PREFIXES = "java.naming.factory.url.pkgs";

	public static final String PROVIDER_URL = "java.naming.provider.url";

	public static final String DNS_URL = "java.naming.dns.url";

	public static final String AUTHORITATIVE = "java.naming.authoritative";

	public static final String BATCHSIZE = "java.naming.batchsize";

	public static final String REFERRAL = "java.naming.referral";

	public static final String SECURITY_PROTOCOL = "java.naming.security.protocol";

	public static final String SECURITY_AUTHENTICATION = "java.naming.security.authentication";

	public static final String SECURITY_PRINCIPAL = "java.naming.security.principal";

	public static final String SECURITY_CREDENTIALS = "java.naming.security.credentials";

	public static final String LANGUAGE = "java.naming.language";

	public static final String APPLET = "java.naming.applet";
	
	public EJB3InvokerJob() {
	}

	/**
	 * 
	 */
	public void execute(JobExecutionContext context)
        throws JobExecutionException
    {
       
        InitialContext jndiContext;
        //获取相关的job数据Map
        JobDataMap dataMap = context.getMergedJobDataMap();
        //获取ejb的jndi名称
        String ejb = dataMap.getString("ejb");
       //调用ejb的方法
        String method= dataMap.getString("method");
        //调用方法的输入参数
        Object[] arguments = (Object[])(Object[])dataMap.get("args");
        if(arguments == null)
            arguments = new Object[0];
        if(ejb == null)
            throw new JobExecutionException();
        //获取EJB的jndi中的Context上下文信息
        jndiContext = null;
        try
        {
            jndiContext = getInitialContext(dataMap);
        }
        catch(NamingException ne)
        {
            throw new JobExecutionException(ne);
        }
        //获取EJB的代理对象
        Object ejbobject = null;
        try
        {
            ejbobject = jndiContext.lookup(ejb);
        }
        catch(NamingException ne)
        {
            throw new JobExecutionException(ne);
        }
        //通过反射执行方法的信息
        Class ejbClass=ejbobject.getClass();
        Method methodExecute = null;
        try
        {
        	  //调用方法的输入参数类型
            Class argTypes[] = (Class[])(Class[])dataMap.get("argTypes");
            if(argTypes == null)
            {
                argTypes = new Class[arguments.length];
                for(int i = 0; i < arguments.length; i++)
                    argTypes[i] = arguments[i].getClass();

            }
            //执行EJB方法
            methodExecute = ejbClass.getMethod(method, argTypes);
        }
        catch(NoSuchMethodException nsme)
        {
            throw new JobExecutionException(nsme);
        }
        //存储EJB的执行结果
        try
        {
            Object returnObj = methodExecute.invoke(ejbobject, arguments);
            System.out.println(returnObj);
            context.setResult(returnObj);
        }
        catch(IllegalAccessException iae)
        {
            throw new JobExecutionException(iae);
        }
        catch(InvocationTargetException ite)
        {
            throw new JobExecutionException(ite);
        }
        //关闭上下文的信息
        if(jndiContext != null)
        {
        	 try
             {
                 jndiContext.close();
             }
             catch(NamingException e) { 
            	 e.printStackTrace();
             }
        }

    }
    /**
     * 创建EJB的上下文信息
     * @param jobDataMap
     * @return
     * @throws NamingException
     */
	private InitialContext getInitialContext(JobDataMap jobDataMap)
			throws NamingException {
		Hashtable<String,String> params = new Hashtable<String,String>(3);
		String initialContextFactory = jobDataMap
				.getString(InitialContext.INITIAL_CONTEXT_FACTORY);
		if (initialContextFactory != null)
			params.put(InitialContext.INITIAL_CONTEXT_FACTORY, initialContextFactory);
		String providerUrl = jobDataMap.getString(InitialContext.PROVIDER_URL);
		if (providerUrl != null)
			params.put(InitialContext.PROVIDER_URL, providerUrl);
		String urlpkgprefixes = jobDataMap
				.getString(EJB3InvokerJob.URL_PKG_PREFIXES);
		if (urlpkgprefixes != null)
			params.put(EJB3InvokerJob.URL_PKG_PREFIXES, urlpkgprefixes);
		return params.size() != 0 ? new InitialContext(params)
				: new InitialContext();
	}


}

 

创建触发器并调用相关的job任务

package easyway.tbs.app.ejb;

import static org.quartz.DateBuilder.evenMinuteDate;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;

import java.util.Date;

import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 调用EJB3.0的方法的
 * @author longgangbai
 *
 */
public class QuartzEJB {
	public static void main(String[] args) throws SchedulerException {
		Logger log = LoggerFactory.getLogger(QuartzEJB.class);

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

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

        log.info("------- Initialization Complete -----------");

        // computer a time that is on the next round minute
        Date runTime = evenMinuteDate(new Date());

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

        // define the job and tie it to our HelloJob class
        //创建job的详细信息
        JobDetail job = newJob(EJB3InvokerJob.class)
            .withIdentity("job1", "group1")
            .build();
        //设置ejb调用相关的参数信息
        JobDataMap jobDataMap=job.getJobDataMap();
        jobDataMap.put(EJB3InvokerJob.EJB_JNDI_NAME_KEY, "SysTimeEngine/remote");
        jobDataMap.put(EJB3InvokerJob.EJB_METHOD_KEY, "helloword");
        jobDataMap.put(EJB3InvokerJob.EJB_ARG_TYPES_KEY,new Class[]{ String.class});
        jobDataMap.put(EJB3InvokerJob.EJB_ARGS_KEY,new Object[]{ "wangxingchen"});
        jobDataMap.put(EJB3InvokerJob.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        jobDataMap.put(EJB3InvokerJob.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");
        jobDataMap.put(EJB3InvokerJob.PROVIDER_URL, "jnp://localhost:1099");
        
        
        log.info(job.getJobDataMap().toString());
        // Trigger the job to run on the next round minute
        //创建一个触发器的
        Trigger trigger = newTrigger()
            .withIdentity("trigger1", "group1")
            .startAt(runTime)
            .build();
        
        // Tell quartz to schedule the job using our trigger
        //设置调度相关的job和触发器
        sched.scheduleJob(job, trigger);
        log.info(job.getKey() + " will run at: " + runTime);  

        // Start up the scheduler (nothing can actually run until the 
        // scheduler has been started)
        //调度开始执行
        sched.start();

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

        // wait long enough so that the scheduler as an opportunity to 
        // run the job!
        log.info("------- Waiting 65 seconds... -------------");
        try {
            // wait 65 seconds to show job
            Thread.sleep(65L * 1000L); 
            // executing...
        } catch (Exception e) {
        }

        // shut down the scheduler
        log.info("------- Shutting Down ---------------------");
        sched.shutdown(true);
        log.info("------- Shutdown Complete -----------------");
	}

}

 

 

 

分享到:
评论

相关推荐

    quartz 2.2.1 定时调度 java

    quartz 2.2.1 定时调度 java 最新版jar

    quartz动态定时调度完整代码

    Quartz是一款开源的作业调度框架,它允许开发者创建、组织和执行定时任务。在Java开发环境中,Quartz被广泛用于实现应用程序的自动化任务调度。这个压缩包“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.net v3.0.7.0的任务调度

    总结,Quartz.NET v3.0.7.0提供了强大的任务调度功能,通过QuartzDemo项目,你可以深入理解其工作原理,并将其应用于实际项目中,实现灵活、高效的任务调度。在实践中,需要注意合理设计作业和触发器,确保任务的...

    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实现,它允许开发人员在应用程序中定义、安排...

    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进行项目部署。 ...

    Quartz3.0定时任务学习之异步调度器.zip

    Quartz3.0定时任务学习之异步调度器

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

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

    Quartz3.0.1.0调用

    在这个场景中,我们关注的是Quartz3.0.1.0版本,它提供了对Job调度的更高效和灵活的支持。"Job scheduling"是Quartz的核心功能,允许开发者定义一系列的任务(Job)并设置触发器(Trigger)来决定何时执行这些任务。...

    定时任务spring3.0

    本文将深入探讨Spring 3.0中的定时任务实现,并结合Quartz库来进一步扩展定时任务的能力。 首先,我们要了解Spring 3.0中的定时任务主要依赖于`org.springframework.scheduling`包。这个包提供了`TaskExecutor`接口...

    Spring quartz定时调度jar包

    Spring Quartz 定时调度是Java应用中广泛使用的任务调度框架,它允许开发者在Spring应用程序上下文中定义和管理定时任务。这个jar包包含了Spring与Quartz的整合,使得开发者能够利用Quartz的强大功能,同时享受...

Global site tag (gtag.js) - Google Analytics