我希望使用quartz来安排电子邮件,但我不确定采取哪种方法:
我需要以任何方式传递消息/收件人等,而且我不确定创建大量工作是否会开始增加大量内存开销,因为很可能会安排数千封电子邮件.
更新:这些电子邮件将由用户安排,而不是我 - 所以我将在运行时以编程方式添加这些电子邮件,它们不会在任何特定时间安排.
我需要一种方法来允许管理员在Quartz.NET中删除作业.是否有JobDetail类的内置方法允许我删除作业和所有关联的触发器?
我需要以编程方式安排和取消安排石英作业.我能够安排使用它MyJob.schedule(cronExpression).有没有办法同样取消安排工作?
我正在使用0.4.2带有Grails的石英插件1.2.3
我使用的是Spring quartz Scheduler,但我没有使用XML文件.我想以编程方式创建整个配置.
我写了以下代码.
package com.eaportal.service.impl;
import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.quartz.JobDetail;
import org.springframework.scheduling.SchedulingException;
import org.springframework.scheduling.quartz.CronTriggerBean;
import org.springframework.scheduling.quartz.JobDetailBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import com.eaportal.service.intfc.AuctionWinnerService;
public class NormalAuctionWinnerServiceImpl1 implements AuctionWinnerService {
@SuppressWarnings("deprecation")
public void declareWinner(int auctionId, Map<String, Object> parameterMap) {
System.out.println("INSIDE DECLARE WINNER METHOD.");
/** STEP 1 : INSTANTIATE TASK CLASS **/
NormalAuctionWinnerTask1 runMeTask = new NormalAuctionWinnerTask1();
System.out.println("FINISHED STEP 1");
/** STEP 2 : INSTANTIATE JOB DETAIL CLASS AND SET ITS PROPERTIES **/
Map<String,Object> jobDataAsMap = new HashMap<String,Object>();
jobDataAsMap.put("runMeTask",runMeTask); …Run Code Online (Sandbox Code Playgroud) 我真正想要做的是创建一个不同时运行的Quartz作业,但也可以访问它JobExecutionContext以获得previousFireTime.这是我的目标:
// imports...
public class UtilityObject {
private SomeService someService;
@Autowired
public UtilityObject(SomeService someService) {
this.someService = someService;
}
public void execute(JobExecutionContext ctx) throws JobExecutionException {
Date prevDate = ctx.getPreviousFireTime();
// rest of the code...
}
}
Run Code Online (Sandbox Code Playgroud)
这是我如何配置我的bean:
<bean name="utilityBean" class="UtilityObject" />
<bean id="utilityJob"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetOjbect" ref="utilityBean" />
<property name="targetMethod" value="execute" />
<property name="concurrent" value="false" />
</bean>
<bean name="utilityTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="utilityJob" />
<property name="startDelay" value="5000" />
<property name="repeatInterval" value="20000" />
</bean>
Run Code Online (Sandbox Code Playgroud)
当我尝试运行它时,它在创建bean时失败了
NoSuchMethodException:UtilityJob.execute() …
这是我的困境:我有一个在本地工作的Quartz工作.当我将WAR文件部署到Tomcat服务器时,我看不到作业被触发.我知道如果在"测试"环境下它不会被触发,所以我部署了使用grails prod war.
我还需要其他可能的配置/设置吗?
服务器上是否有导致此问题的任何内容?
我没有在日志文件中看到任何错误,只是没有被触发的作业.谢谢你提供的所有帮助.
我尝试了几个小时的Quartz.com文档和谷歌搜索...但是找不到关于如何获得Next Job的一篇好文章(将来可以解雇).
我正在使用CronTrigger Expression来安排作业,使用VB.net(winforms).工作正常...但我希望我的用户看到它下一次火灾.我在我的数据库中存储CronExpression,我可以使用该Expression 向我的最终用户显示下一个Fire Date/Time吗?或者如果有其他可能的方法,请提供建议(简单明了).
谢谢
编辑
以下代码返回下一个作业将在12分钟而不是20分钟后触发
Dim exp As CronExpression = New CronExpression("0 0/20 * * * ?")
Dim nextFire As String = exp.GetNextValidTimeAfter(DateTime.Now)
MsgBox(nextFire)
Run Code Online (Sandbox Code Playgroud) 我创建了一个带有两个石英调度程序的Spring应用程序,其中第一个具有3个触发器,第二个具有一个触发器。
所有这些触发器都设置为并发操作false。
当我运行此命令时,似乎只触发了第二个调度程序中的作业触发器。triggerJobB也只需很少的时间来执行。
我的问题是,在一个spring上下文中使用两个调度程序是否会导致执行问题以及这是否是一种好习惯。
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="triggerJobA" />
<ref bean="triggerJobC" />
<ref bean="triggerJobD" />
</list>
</property>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="triggerJobB" />
</list>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud) 我有一个独特的问题,我的石英作业调度程序实现使用quartz.net代码库版本2.0.1构建,最近发现在运行和执行作业时忽略了时区和utc偏移.这是本版本的quartz.net中的继承错误,并且更新到2.1.1版现在已超出范围,因此我使用此算法编写了一种快速而肮脏的计算偏移量的方法:
(ServerTime - ClientTime) - TargetTime = New_TargetTime_With_Offset
这里的想法是客户,在纽约市说,在下午5点找工作,并希望它在下午2点运行.服务器(此应用程序和作业服务器运行的位置)当前时间是下午2:00,因此我们将客户端时间和服务器时间用于获取偏移量并将该偏移量应用于目标时间,即作业应运行的时间.
我的问题是,这感觉就像计算日期的方式一样,但似乎它会完成这项工作.有没有更好/更可靠的方法来做这个日期数学?这也似乎是边缘情况下的错误,我错过了什么?
这是实施:
/// <summary>
/// Takes three dates and returns the adjusted hour value.
/// All date data is ignored except for the hour.
/// </summary>
/// <param name="serverTime"></param>
/// <param name="clientTime"></param>
/// <param name="targetTime"></param>
/// <returns></returns>
private static DateTime OutputDate(DateTime serverTime, DateTime clientTime, DateTime targetTime)
{
DateTime? output = null;
TimeSpan? dateDiff;
if (serverTime < clientTime)
{
dateDiff = (clientTime - serverTime);
}
else
{
dateDiff = (serverTime - clientTime); …Run Code Online (Sandbox Code Playgroud) 由于各种有效的原因,作业存储中的某些作业很旧,无法再恢复。例如,当重构后Job类不再是.NET程序集的一部分时。我想知道如何在调度程序启动时很好地捕获这些问题,然后删除无法恢复的作业。
当应用启动时,我基本上会这样做(删节):
IScheduler scheduler = <create a scheduler and a jobstore object>
try{ scheduler.Start() } catch {}
try{ scheduler.Start() } catch {}
try{ scheduler.Start() } catch {}
Run Code Online (Sandbox Code Playgroud)
如果我打电话Start()三次,调度程序最终将启动。我之所以必须这样做,是因为Start() 它将为无法恢复的旧工作抛出异常。
Failure occured during job recovery. 和 Could not load type 'MyOldClassName' from assembly 'MyAssembly'.
我想优雅地删除损坏的作业并避免这些异常。在我的实际代码中,我记录了这些异常。
有一个更好的方法吗?
quartz-scheduler ×10
quartz.net ×4
spring ×3
c# ×2
grails ×2
java ×2
datetime ×1
scheduler ×1
scheduling ×1
timespan ×1
tomcat ×1
war ×1