我正在开发一个应用程序,它包含一个基于Quartz的整体调度程序和使用CronTriggers运行的"CycledJob".该应用程序的目的是根据源国家处理来自不同电子邮件收件箱的输入.
根据它所来自的国家(即美国,英国,法国国家联盟等),该应用程序触发一个作业线程来运行每个国家的处理周期,因此将有一个英国工人线程,一个用于美国,法国等.将输出格式化为log4j时,我正在使用thread参数,因此它会发出[ApplicationName_Worker-1],[ApplicationName_Worker-2]等.尽可能尝试,我找不到一种方法来命名线程,因为它们'重新退出Quartz的Thread Pools.虽然我可能会扩展Quartz,但我想制定一个不同的解决方案,而不是搞乱标准库.
问题在于:当使用log4j时,我希望将来自US线程输出的所有日志项输出到仅限US的文件,同样适用于每个国家/地区线程.我不在乎他们是否留在一个统一的ConsoleAppender中,FileAppender拆分就是我在这里所说的.我已经知道如何指定多个文件追加器等等,我的问题是我无法根据国家区分.应用程序中有20多个类可以在执行链上,其中很少我想通过每个方法传递额外的"上下文"参数的知识负担...我已经考虑了扩展一个策略模式log4j包装类,但除非我能让链中的每个类都知道它所在的哪个线程参数化记录器调用,这似乎是不可能的.
所以这里有一个问题:在一个应用程序中允许许多从属类的建议方法是什么,每个用于每个不同的线程来处理输入,知道它们在记录时是否在特定国家线程的上下文中?
祝你好运,请提出澄清问题!我希望有人能够帮助我找到解决这个问题的好方法.欢迎所有建议.
我需要安排一个触发器来触发每一分钟,下一分钟如果作业仍然在运行,触发器不应该触发并且应该等待另一分钟来检查,如果作业已经完成触发器应该激发谢谢
一个简单的场景,但让我头撞墙,因为我无法理解这个'没有Hibernate会话绑定到当前线程'.
用例实现:
def records = SomeDomain.list()
//split records into equal size chunks.
def chunks = [][] // <- add records to chunks
//now process each chunk in a different thread
chunks.each { aChunk ->
Thread.start {
singletonInjectedService # processs(aChunk)
}
}
Run Code Online (Sandbox Code Playgroud)
如何在grails中实现这一目标?无论容器是什么,Quartz Job想要处理多个线程中的'记录',或者想要在多个线程中处理'记录'的服务,它只是失败了'没有hibernate会话绑定到当前线程'.
一个合法的用例,但可惜它根本不适合我.
我在生产中关闭Grails应用程序时遇到问题.
从IntelliJ运行时它会干净地关闭.但是在一个独立的Tomcat 7上,关闭会让它进入一个僵尸状态,其中java进程仍然存在,但HTTP请求挂起.我必须杀死java进程(使用kill).
我正在使用Tomcat的标准bin/startup.sh和shutdown.sh.在Tomcat停止后,我将.war放入Tomcat的/ webapps目录然后启动.
我怀疑它可能是Quartz作业调度程序插件,但是我在grails-app/jobs中部署了一个没有作业的版本,它仍然挂起.
以前有人碰过这个吗?谢谢!
我在GRAILS中有一个使用Quartz2插件的简单应用程序.在作业文件中我有:
static triggers = {
simple repeatCount: 0 // execute job once in 5 seconds
cron cronExpression: '0 15 2 * * ?'
}
def execute() {
if (Environment.current == Environment.PRODUCTION)
do something...
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下一切正常,如果它不在生产中,则忽略触发器.现在问题很简单,如果我在生产中启动应用程序,一旦grails启动就会启动作业.我希望避免在应用程序启动时运行作业,但只有在cronExpression中正确设置时才会运行.
任何的想法?
更新:最后我把这行放在config.groovy中:
environments {
development {
grails.logging.jul.usebridge = true
grails.plugin.quartz2.autoStartup = false
}
production {
grails.logging.jul.usebridge = false
}
}
Run Code Online (Sandbox Code Playgroud)
现在似乎没有从引导开始我必须做更多的测试,我告诉你.
谢谢
UPDATE2:好了,现在计划根本没有开始,我期待它开始但不执行预定的作业,但是等待合适的时间来触发它.有帮助吗?
非常感谢
UPDATE3:抱歉,我觉得很蠢,在启动时添加简单的repeatCount:0 fire,所以删除它完美,再次对不起.
是否可以使用Quartz .NET程序集生成cron表达式?我看到CronScheduleBuilder班上有一个私人会员cronExpression,基本上就是我要找的.有没有其他方法可以获得cron表达式?
我在Spring项目中创建了两个作业,这两个作业在两个不同的时间相互独立运行.
public class JobA extends QuartzJobBean
{
@Override
protected void executeInternal(JobExecutionContext arg0)throws JobExecutionException
{
// my actual work
}
}
Run Code Online (Sandbox Code Playgroud)
和
public class JobB extends QuartzJobBean
{
@Override
protected void executeInternal(JobExecutionContext arg0)throws JobExecutionException
{
// my actual work
}
}
Run Code Online (Sandbox Code Playgroud)
两者都在给定的时间运行正常,但我需要提供一些监视功能,通过它我们可以检查作业是否正在运行.
我遇到了JobListener并且已经看到了其他资源,但在实施时却感到困惑.我没有准确地知道如何在Spring Controller中使用这个监听器,这样我就可以在我的jsp中监视这两个工作.
更新:我使用的是Quartz 1.8.如何检查是否有任何工作停止?我们有什么方法可以重新开始任何暂停或破坏的工作?
上下文
我正在尝试使用jdbc在集群模式下使用quartz调度程序.
问题
在我开始使用集群模式的jdbc之前,我刚刚通过RAM存储测试了调度程序.这没有问题,我能够重启调度程序(主类),没有任何错误.我现在的问题是,当我停止执行(ctrl + c)然后重新启动它时,我总是收到错误消息:
org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'MyTestJob', because one already exists with this identification.
Run Code Online (Sandbox Code Playgroud)
我不明白这里发生了什么.quartz不支持重新启动调度程序吗?我的意思是,如果发生崩溃并且调度程序在恢复后重新启动会发生什么?那么从石英数据库中删除作业的唯一选择是什么?也许还有另外一种我错过的方法或东西.使用不能应对重启的库感觉不太舒服.
另一个奇怪的事情是,当更改为jdbc时,我的工作不再被触发,我只看到DB中的状态WAITING.这可能是什么?作业(cron-schedule)在RAM模式下没有问题.
我对文档的水平和我遇到的这个简单任务遇到的问题感到有些惊讶,因为我已经听说了石英调度程序多年,但从未使用它.古德尔建议我不是唯一有这个问题的人.我希望这只是我和我的问题有一个简单的解决方案,否则在2.2.x版本中第一次尝试这个库并且已经不得不寻找其他东西会非常令人失望.
这是我的配置:
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.skipUpdateCheck = true
org.quartz.scheduler.instanceName = Test-Scheduler
org.quartz.scheduler.instanceId = AUTO
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 25
org.quartz.threadPool.threadPriority = 5
#============================================================================
# Configure JobStore
#============================================================================
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties = true
org.quartz.jobStore.dataSource = quartzDS
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = true …Run Code Online (Sandbox Code Playgroud) Quartz 2.x 文档说
所以cron表达式可以这么简单:****?*或更复杂,如:0/5 14,18,3-39,52*?JAN,MAR,SEP MON-FRI 2002-2010
但是,如果我尝试
System.out.println(org.quartz.CronExpression.isValidExpression("* * * * ? * *"));
Run Code Online (Sandbox Code Playgroud)
它说
false
Run Code Online (Sandbox Code Playgroud)
为什么?
isValidExpression的Javadoc是http://quartz-scheduler.org/api/2.2.1/org/quartz/CronExpression.html
PS.这个问题不是重复验证cron表达式在Java中是否有效
如何告诉我的spring计划方法使用特定执行程序运行?
例如,这是我的弹簧调度方法之一,
@Scheduled(fixedRate=1000)
public void scheduleJobs(){
doThese();
}
Run Code Online (Sandbox Code Playgroud)
这里是我的java配置中定义的2个执行器,
@Bean
public Executor taskScheduler() {
ThreadPoolTaskScheduler t = new ThreadPoolTaskScheduler();
t.setPoolSize(2);
t.setThreadNamePrefix("taskScheduler - ");
t.initialize();
return t;
}
@Bean
public Executor newTaskScheduler() {
ThreadPoolTaskScheduler t = new ThreadPoolTaskScheduler();
t.setPoolSize(2);
t.setThreadNamePrefix("newTaskScheduler - ");
t.initialize();
return t;
}
Run Code Online (Sandbox Code Playgroud)
当调度方法运行时,我可以看到它正在使用taskScheduler执行器.如何告诉它使用newTaskScheduler执行器运行?
quartz-scheduler ×10
java ×5
grails ×3
quartz.net ×2
spring ×2
.net ×1
c# ×1
cron ×1
deployment ×1
groovy ×1
hibernate ×1
log4j ×1
scheduler ×1
service ×1
session ×1
spring-boot ×1
spring-mvc ×1
tomcat ×1