IJob 是否有一种简单的方法可以从 Job 中发布数据。我有一个运行导入过程的作业,但想通过查找作业并请求它来检索进度。
我以为我可以使用 JobDetails,但似乎没有反映在 Job 中所做的更改?
在 Glassfish 中部署/取消部署/重新部署 JEE5 应用程序时,如何自动触发 Java 功能以停止 Quartz 调度程序作业。
我从数据库中获取诸如开始时间和生效日期之类的工作详细信息,并根据工作详细信息创建工作,但是如果我有新工作的另一个条目或者已更改计划工作的开始时间该怎么办? ,因此如何在作业计划程序中添加新作业或在计划程序中更改新的开始时间。
我正在使用C#.net。
我以这种方式动态调度作业:
JobClass.schedule(Long interval, Integer repeatCount, Map params )
稍后我想停止运行,然后根据用户操作再次重启它们.
我怎么能阻止这个触发器?
实际上阻止它的唯一方法是JobClass.removeJob(),但我不能;以后能够再次启动它,所以我需要别的东西.
谢谢!
我必须将企业应用程序转换为 spring。到目前为止,我已经一切正常。但是我仍然需要替换我的 2 个 bean 上的 @Startup 注释。
是否有弹簧等价物,或者您将如何在春季做到这一点?
提前致谢!
我打算使用 Quartz cron 调度程序来调度作业。我的调度模式可能需要多个作业(比如 A、B、C)才能同时运行(比如 A 和 B 应该每 10 分钟并行运行一次)。现在,在我看来 Quartz 似乎限制了这个功能。我使用 Spring 框架。
问题 - 使用Quartz Cron创建/实现的调度能否在同一执行时间运行多个作业?
谢谢!
我创建了一个 ASP.NET MVC 网站。然后我创建了一个名为 Site.Scheduler 的类库,我想在其中放置我所有的触发器和作业。
我为测试目的创建了一个简单的工作
public class CurrencyRatesJob : IJob
{
private readonly IBudgetsRepository budgetsRepository;
public CurrencyRatesJob(IBudgetsRepository budgetsRepository)
{
this.budgetsRepository = budgetsRepository;
}
public void Execute(IJobExecutionContext context)
{
try
{
var budgets = new BudgetsDTO();
var user = new UserDTO();
budgets.Sum = 1;
budgets.Name = "Quartz";
user.Email = "email@g.com";
budgetsRepository.InsertBudget(budgets, user);
}
catch (Exception ex)
{
throw new Quartz.JobExecutionException(ex);
}
}
}
Run Code Online (Sandbox Code Playgroud)
和作业调度程序
public class CurrencyRatesJobScheduler
{
public static void GetCurrencyRates()
{
try
{
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); …Run Code Online (Sandbox Code Playgroud) 请考虑这个例子。
一个示例Web应用程序要求scheduler.start()其启动。调度程序配置为将其作业存储在DB中。
该应用程序被复制到六个Web服务器上。
因此,如果启动六个Web服务器,则在单个DB上将有六个具有相同名称的调度程序。如https://quartz-scheduler.org/documentation/quartz-2.1.x/cookbook/MultipleSchedulers中所述:
切勿针对运行(start()ed)具有相同调度程序名称的任何其他实例的同一组数据库表启动(scheduler.start())非集群实例。您可能会遇到严重的数据损坏,并且肯定会遇到不稳定的行为。
因此,这将失败。
我的问题是,如果我确定我所有的工作@DisallowConcurrentExecution都会胜任工作,否则仍然失败?
如果@DisallowConcurrentExecution没有帮助,我应该手动将一台服务器配置为某些主机
public class StartUp implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
if(THIS_IS_MASTER_TOMCAT){
scheduler.start()
}
}
Run Code Online (Sandbox Code Playgroud)
有更好的方法吗?
我正在使用 Quartz .NET 进行作业调度。所以我创建了一个工作类(实现 IJob)。
public class TransferData : IJob
{
public Task Execute(IJobExecutionContext context){
string tableName = context.JobDetail.JobDataMap.Get("table");
// Transfer the table here.
}
}
Run Code Online (Sandbox Code Playgroud)
所以我想转移不同的和多个表。为此,我正在做这样的事情:
foreach (Table table in tables)
{
IJobDetail job = JobBuilder.Create<TransferData>()
.WithIdentity(new JobKey(table.Name, "table_transfer"))
.UsingJobData("table", table.Name)
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity(new TriggerKey("trigger_" + table.Name, "table_trigger"))
.WithCronSchedule("*/5 * * * *")
.ForJob(job)
.Build();
await this.scheduler.ScheduleJob(job, trigger);
}
Run Code Online (Sandbox Code Playgroud)
所以每张桌子应该每5分钟转移一次。为了实现这一点,我创建了几个具有不同作业名称的作业。问题是:如何防止相同jobName的并行作业执行?(例如,一张桌子的前一次运行需要更长的时间,所以我不想为同一张桌子开始下一次传输。)
我知道@DisallowConcurrentExecution 属性,但这用于防止同一作业类的并行执行。我不想为每个表编写一个额外的 Job 类,因为传输的“主要”代码总是相同的,唯一的区别是表名。所以我想为此使用相同的工作类别。
我想在月底的晚上 11:10 运行 cron 表达式。我正在尝试通过以下链接编写Cron 表达式指南,但我无法编写。示例代码如下,这将正常工作。
@Scheduled(cron = "0 10 23 L * ? *")
public void scheduleTaskWithCronExpression() {
System.out.println("Cron Task");
}
Run Code Online (Sandbox Code Playgroud) quartz-scheduler ×10
java ×5
c# ×3
cron ×3
quartz.net ×3
spring ×2
glassfish ×1
grails ×1
spring-boot ×1
tomcat ×1