我目前有一个tomcat容器 - 在其上运行的servlet监听请求.我需要HTTP请求的结果是作业队列的提交,然后将异步处理.我希望每个"作业"在数据库中连续保存,以便在发生故障时进行跟踪和恢复.我一直在做很多阅读.这是我的选择(注意我必须使用开源的东西).
1)JMS - 使用ActiveMQ(但是在这种情况下谁是该作业的消费者另一个servlet?)
2)让我的请求在数据库中创建一行.在我的Tomcat容器中有一个始终运行的独立servlet - 它使用Quartz Scheduler或java.util.concurrent中提供的实用程序来连续处理作为作业的行(使用线程池).
我倾向于后者,因为查看JMS文档让我头疼,虽然我知道它是一个更强大的解决方案,但我需要相对快速地实现它.在任何情况下,在部署此服务器的早期我都没有预料到会产生巨大的负载.
很多人都认为Spring可能对1或2都有好处.但是我从未使用过Spring,我甚至不知道如何开始使用它来解决这个问题.任何有关如何潜入而无需重新编写整个项目的指针都会很有用.
否则,如果您可以权衡选项1或2,这也是有用的.
澄清:异步过程是屏幕抓取第三方网站,并向原始请求者发送消息通知.第三方网站有点不稳定和缓慢,这就是为什么它将作为异步进程处理(内置几次重试尝试).我还将从该站点提取文件并将其存储在S3中.
我在Web应用程序中调度作业时遇到问题.如果我们必须在Web应用程序中安排作业,我们可以使用java util Timer/TimerTask或Quartz(还有其他调度机制,但我考虑过Quartz).我正在考虑使用哪一个,当我点击网站http://oreilly.com/pub/a/java/archive/quartz.html?page=1时说使用计时器有一个不好的效果,因为它创建了一个线程在最后一行没有容器控制.其他页面讨论了Quartz及其功能,但我可以读到Quartz还使用线程和/或线程池来安排任务.我的猜测是这些线程也不受容器控制
任何人都可以向我澄清这是否可以安全地在我的Web应用程序中使用Quartz而不创建挂起线程或线程锁定问题?提前致谢
有一种情况我想在一段预定时间后调用一个方法,比如30秒或5分钟.
需要在运行时配置时间,这意味着我应该能够动态地将时间从5分钟更改为3分钟.(以编程方式将计时器重置为新的时间间隔)
我正在使用Spring框架开发一个动态Web项目.
我检查了Quartz和Timer类,但它们似乎读取了诸如delay,repeatInterval等参数的XML配置.
我怎样才能做到这一点?Spring是否为此提供任何支持?
先感谢您.
我在我的Web应用程序(Servlet Web应用程序)中使用了quartz,下面是quartz.property文件和quartz.job.xml的快照.
quartz.property
#===================================================
# Configure the Job Initialization Plugin
#===================================================
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = jobs.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 10
org.quartz.plugin.jobInitializer.wrapInUserTransaction = false
<?xml version='1.0' encoding='utf-8'?>
<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
version="1.8">
<schedule>
<job>
<name>my-very-clever-job</name>
<group>MYJOB_GROUP</group>
<description>The job description</description>
<job-class>com.acme.scheduler.job.ReportJob</job-class>
</job>
<trigger>
<cron>
<name>my-trigger</name>
<group>MYTRIGGER_GROUP</group>
<job-name>my-very-clever-job</job-name>
<job-group>MYJOB_GROUP</job-group>
<!-- trigger every night at 4:30 am -->
<cron-expression>0 30 4 * * ?</cron-expression>
</cron>
</trigger>
</schedule>
</job-scheduling-data>
Run Code Online (Sandbox Code Playgroud)
按顺序,每件事都很好.我需要允许用户按照他们想要的方式更改时间(cron表达式).我的问题是如何动态设置cron表达式.
我正在考虑将基于Spring Quartz的应用程序移植到EJB 3.1,以查看EJB是否得到了改进。我在理解故障转移如何与Schedule Timer Service一起工作时遇到问题。在Quartz中,有集群Quartz实例使用的数据库表。如果群集中的一个节点崩溃,则作业仍将在其他节点上执行。
我一直在研究Timer服务如何持久化事物,它似乎使用了创建Timer的服务器的文件系统。这是真的?我不知道这怎么可能,因为它将不支持故障转移,从而使计时器服务不可用。
所以我一定想念一些东西。谁能帮我这个忙吗?
我是Quartz调度程序的新手,我正在使用Spring ...当我尝试运行包含Quartz配置的XML文件时,我得到一个例外,说明:
Failure obtaining db row lock: No row exists in table QRTZ_LOCKS for lock named:
TRIGGER_ACCESS
Run Code Online (Sandbox Code Playgroud)
我发现QRTZ_LOCKS表包含两个字段:SCHED_NAME和LOCK_NAME,我应该在我的数据库中运行以下语句:
INSERT INTO QRTZ_LOCKS values('my sched_name', 'TRIGGER_ACCESS');
INSERT INTO QRTZ_LOCKS values('my sched_name','JOB_ACCESS');
INSERT INTO QRTZ_LOCKS values('my sched_name','CALENDAR_ACCESS');
INSERT INTO QRTZ_LOCKS values('my sched_name','STATE_ACCESS');
INSERT INTO QRTZ_LOCKS values('my sched_name','MISFIRE_ACCESS');
Run Code Online (Sandbox Code Playgroud)
但我不知道我的sched_name是什么?
任何的想法 ??
我使用DAO服务实现Quartz作业,如下所示:
public class InitialFetchFrequenceScheduleJob implements Job
{
@Autowired
private FetchFrequencyService fetchFrequencyService;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException
{
try
{
List<FetchFrequency> frequencies = this.fetchFrequencyService.findAll(FetchFrequency.class);
Run Code Online (Sandbox Code Playgroud)
问题是,当调用execute()方法时,this.fetchFrequencyService.findAll(FetchFrequency.class);将抛出NPE,因为fetchFrequenceService为null.我这里做错了什么?任何回复都非常感谢.谢谢!
P/s我使用的是Quartz 2.1.7
更新:这是FetchFrequencyServiceImpl:
@Service("fetchFrequencyService")
public class FetchFrequencyServiceImpl extends GenericDaoImpl implements FetchFrequencyService
{
}
Run Code Online (Sandbox Code Playgroud)
更新:代码实现作业:
JobDetail job = JobBuilder.newJob(InitialFetchFrequenceScheduleJob.class).build();
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, 1);
Trigger trigger = TriggerBuilder.newTrigger().forJob(job).startAt(cal.getTime()).build();
Scheduler scheduler = new StdSchedulerFactory("quartz.properties").getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
Run Code Online (Sandbox Code Playgroud) 我需要安排一个任务在java中自动运行..我需要相同的窗口调度功能.我已经做了每天,每年但是当我来到每周调度时卡住了......没有得到如何做到这一点.我正在使用java calendar.Please帮助找到一个很好的解决方案.
任何帮助或想法都会很明显
我面临着石英和失火的痛苦问题。
我的应用程序创建允许用户创建CronTrigger和SimpleTrigger作业。
可以暂停/恢复每个作业(使用Scheduler.pauseJob和Scheduler.resumeJob)
调度程序本身可以设置为待机状态。
我们想抛弃所有的失火:
如本博客文章http://www.nurkiewicz.com/2012/04/quartz-scheduler-misfire-instructions.html中所述,我已经尝试过
但是没有人可以放弃失火。
我目前在作业执行方法中使用丑陋的解决方法:
public void execute(JobExecutionContext context) throws JobExecutionException {
Date dateNow = new Date();
long diff = dateNow.getTime() - context.getScheduledFireTime().getTime();
if (diff > 500)
{
//its a misfire
return;
}
/* rest of job execution code */
Run Code Online (Sandbox Code Playgroud)
如果ScheduledFireTime比现在早500毫秒以上,则将其丢弃。
但似乎有时在生产环境中,这允许执行一些作业(据报道,重启应用程序时会发生)
那有可能吗?有什么漂亮的方法可以避免失火?
Quartz版本:2.1.7(在Spring 3.2.5应用程序中)
石英。属性
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.dataSource=psqldatasource
org.quartz.dataSource.psqldatasource.driver=${db.driver}
org.quartz.dataSource.psqldatasource.URL=${db.url}
org.quartz.dataSource.psqldatasource.user=${db.usr}
org.quartz.dataSource.psqldatasource.password=${db.pwd}
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
Run Code Online (Sandbox Code Playgroud)
对于Cron:
JobDetail job = JobBuilder.newJob(JobLauncher.class)
.withIdentity(jobIdentifierBean.getNameJob(), jobIdentifierBean.getNameGroup())
.usingJobData(...) //defining …Run Code Online (Sandbox Code Playgroud) 我试着在春天使用石英调度器.配置多个作业时,我得到以下异常
Job2中方法jobTrigger的参数0需要一个无法找到的类型为'org.quartz.JobDetail'的bean.
quartz - v2.3,Spring - v4.2.x
配置类
@Configuration
public class SchedulerConfig {
private static final Logger LOG = LoggerFactory.getLogger(SchedulerConfig.class);
@Autowired
List<Trigger> triggers;
@Bean
public JobFactory jobFactory(ApplicationContext applicationContext) {
AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
jobFactory.setApplicationContext(applicationContext);
return jobFactory;
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean(JobFactory jobFactory) throws IOException {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setAutoStartup(true);
factory.setJobFactory(jobFactory);
factory.setQuartzProperties(quartzProperties());
if (triggers != null && !triggers.isEmpty()) {
LOG.info("starting jobs... Total Triggers - " + triggers.size());
factory.setTriggers(triggers.toArray(new Trigger[triggers.size()]));
}
return factory;
}
@Bean
public Properties quartzProperties() throws …Run Code Online (Sandbox Code Playgroud) quartz-scheduler ×10
java ×6
spring ×4
asynchronous ×1
calendar ×1
ejb-3.1 ×1
jboss7.x ×1
jms ×1
quartz ×1
spring-boot ×1
spring-mvc ×1
timer ×1
tomcat ×1