ทริกเกอร์ควอตซ์ขึ้นอยู่กับการมีอยู่ของไฟล์?

ฉันยังใหม่มากกับการใช้ Quartz และมีคำถามเกี่ยวกับตัวกระตุ้น เป็นไปได้ไหมที่จะทริกเกอร์ตามการมีอยู่ของไฟล์? ฉันต้องการให้ Quartz รันงานจนกว่าจะพบไฟล์บางไฟล์ จากนั้นหยุดรันงานนั้นและอาจย้ายไปที่งานอื่น

ตัวอย่างเช่น ฉันต้องการทำสิ่งนี้:

(1) Job1 ตรวจสอบว่า File.txt มีอยู่ในไดเร็กทอรีที่กำหนดทุกๆ 60 วินาทีหรือไม่

(2) หากพบ File.txt ให้ทริกเกอร์ Job2 เพื่อเริ่มต้น Job1 หยุดตรวจสอบการมีอยู่ของไฟล์

ตอนนี้ฉันมี:

// Job definitions
var Job1 = JobBuilder.Create<TestEmail>().WithIdentity("job1", "group1").Build();
var Job2 = JobBuilder.Create<TestFileTrigger>().WithIdentity("job2", "group2").Build();

// Triggers
ITrigger trigger1 = TriggerBuilder.Create()
      .WithIdentity("trigger1", "group1").StartNow()
      .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
      .Build();

ITrigger trigger2 = TriggerBuilder.Create()
      .WithIdentity("trigger2", "group2").StartNow()
      .Build();

// Schedule jobs
scheduler.ScheduleJob(Job1, trigger1);
if (TestFileTrigger.fileExistence == true) 
{
     scheduler.ScheduleJob(Job2, trigger2);
}

แต่ดูเหมือนว่า Job2 จะไม่เริ่มเลย

TestEmail และ TestFileTrigger เพียงพิมพ์ไปที่คอนโซลในขณะนี้ Boolean TestFileTrigger.fileExistence มาจากการตรวจสอบว่ามีไฟล์อยู่ในตำแหน่งที่กำหนดหรือไม่ (ซึ่งเป็นเช่นนั้น)

แก้ไข: TestFileTrigger.fileExistence เป็นบูลีน เพิ่มคำจำกัดความของ Job1/Job2 หากสามารถช่วยได้

แก้ไข: ฉันพบว่าหากฉันใส่ Thread.Sleep(TimeSpan.FromSeconds(x)); ก่อนคำสั่ง if คำสั่ง if จะทำงานหากตรงตามเงื่อนไข (โดยที่ x คือจำนวนวินาที) เหตุใดจึงใช้งานได้ในกรณีนี้ แต่ไม่ใช่อย่างอื่น ฉันไม่สามารถรู้ได้เสมอไปว่าจะต้องใช้เวลากี่วินาทีจึงจะเป็นไปตามเงื่อนไข


person user2424607    schedule 30.06.2014    source แหล่งที่มา
comment
getnextfiretimeพูดว่าอะไร? quartz-scheduler.org/ api/2.0.0/org/quartz/   -  person SpaceBison    schedule 01.07.2014
comment
ฉันพบว่าถ้าฉันใส่ Thread.Sleep(TimeSpan.FromSeconds(x)); หลังจากบรรทัดแรก มันจะดำเนินต่อไปยังลูป if (โดยที่ x คือจำนวนวินาที) getnextfiretime ส่งคืนเวลาการยิงถัดไปที่ถูกต้องสำหรับทริกเกอร์   -  person user2424607    schedule 01.07.2014


คำตอบ (2)


ดูเหมือนว่าคุณจะไม่เข้าใจการทำงานพร้อมกันและเธรดที่เกี่ยวข้องที่นี่

ประเด็นมีดังนี้

เธรด MAIN ของคุณดำเนินการดังต่อไปนี้

  1. สร้างงานสองงาน
  2. ให้แต่ละงานเป็นตัวกระตุ้น
  3. กำหนดเวลา Job1 เพื่อเริ่มต้น
  4. ตรวจสอบ TestFileTrigger.fileExistence และหากเป็นจริง ให้เริ่ม Job2 (เป็นเท็จ จึงไม่ทำงาน)

จากนั้นเธรดพูลจะเริ่ม Job1 การตั้งค่าที่เป็นไปได้มากที่สุด TestFileTrigger.fileExistence = true แต่เธรดหลักได้ดำเนินการเสร็จสิ้นแล้ว

ครีบ.

คุณจะกลับไปตรวจสอบว่า TestFileTrigger.fileExistence เป็นจริงหรือไม่ ผลลัพธ์ของมันจึงไม่เกี่ยวข้อง คุณกำลังตรวจสอบผลลัพธ์ก่อนที่คุณจะได้รับผลลัพธ์

ด้วยการเพิ่ม Thread.Sleep คุณให้ job1 มีเวลาเพียงพอในการดำเนินการให้เสร็จสิ้น และให้ผลลัพธ์แก่คุณ (job1 ทำงานแบบอะซิงโครนัสและพร้อมกัน และชัดเจนว่าคุณคาดหวังให้งานทำงานพร้อมกัน) ลองนึกภาพ เช่น คุณบอกเฟรดให้เพื่อนไปที่ร้านเพื่อซื้อพิซซ่าแล้ววางพิซซ่าไว้บนโต๊ะ (ไม่พร้อมกัน) จากนั้นหันกลับไปทันทีและสงสัยว่าทำไมไม่มีพิซซ่าอยู่บนโต๊ะ

คงจะเป็นแบบซิงโครนัสหากคุณไปที่ร้าน ซื้อพิซซ่าแล้วนำกลับบ้านมาวางไว้บนโต๊ะ จากนั้นจึงรับประทานพิซซ่าจากโต๊ะ

JobScheduler.ScheduleJob(job1, trigger1); ทำงานแบบอะซิงโครนัส

คุณควรสร้างงานเพื่อสรุปขั้นตอนที่ 4 และกำหนดเวลาให้ทำงานเป็นระยะ หรือคุณใช้ FileScanJob ในตัวแทน

person Aron    schedule 02.07.2014
comment
ฉันเห็น. มีวิธีหยุดงานเมื่อตรงตามเงื่อนไขหรือไม่? ตัวอย่างเช่น ฉันมี: Job1 ตรวจสอบว่ามีไฟล์อยู่หรือไม่ หากเป็นเช่นนั้น ให้ตั้งค่า fileExistence == true Job2 ตรวจสอบว่า fileExistence == true หรือไม่ ถ้าเป็นเช่นนั้นทำอะไรบางอย่าง มีวิธีทำให้งานหยุดเมื่อมีไฟล์อยู่หรือไม่? มี scheduler.DeleteJob แต่ฉันไม่แน่ใจว่าจะใส่ไว้ที่ไหน ภายใน Job1 และ Job2? ข้างในหลัก? หากฉันเข้าใจการทำงานพร้อมกันอย่างถูกต้อง ฉันจะไม่สามารถใส่ if loop หลังจากกำหนดเวลางานได้ เว้นแต่ฉันจะใช้ Thread.Sleep แต่ฉันไม่รู้ว่าจะต้องใช้เวลานานเท่าใดกว่าไฟล์จะมาถึงและเป็นไปตามเงื่อนไขการหยุด - person user2424607; 02.07.2014
comment
ฉันอดไม่ได้ที่จะคิดว่า Quartz เป็นวิธีที่ผิดในการทำเช่นนี้ คุณกำลังพยายามทริกเกอร์เหตุการณ์ ไม่ใช่กำหนดการ ควอตซ์เป็นตัวกำหนดตารางเวลา และด้วยเหตุนี้การปรับให้เข้ากับความต้องการของคุณจึงค่อนข้างยาก โดยส่วนตัวแล้วฉันจะใช้ FileSystemWatcher - person Aron; 02.07.2014
comment
ใช่ฉันเห็นด้วย. ขอขอบคุณที่แนะนำ FileSystemWatcher ดูเหมือนว่าจะเป็นวิธีที่ดีกว่ามากในการทำเช่นนี้! ฉันจะลองใช้มันอย่างแน่นอน อีกประการหนึ่ง JobChaining จะเป็นทางเลือกที่เป็นไปได้หรือไม่ - person user2424607; 02.07.2014

นี่เป็นแอปพลิเคชัน ประเภท ใด

ตัวอย่างเช่น หากนี่คือบริการของ Windows เพื่อรักษาตัวกำหนดตารางเวลาให้คงอยู่และวนเวียนเพื่อดำเนินงานตามทริกเกอร์ของคุณ คุณจะต้องดำเนินการดังนี้:

ThreadStart start = SetupSchedules()
var thread = new Thread(start) { Name = "mysvc" }
thread.Start();

.. นี่จะเข้าสู่วิธี override void OnStart(string[] args) ของบริการ Windows

เมธอด SetupSchedules จะเป็นสิ่งที่เชื่อมโยงกับงาน Quartz และจะเป็นดังนี้ (โค้ดที่คุณเขียนด้านบนใน OP จะเป็นการเริ่มต้นที่ดี):

ISchedulerFactory factory = new StdSchedulerFactory();
JobScheduler = factory.GetScheduler();
JobScheduler.ScheduleJob(job1, trigger1);

สิ่งนี้ควรทำให้มันคงอยู่เพื่อที่จะรันงานได้ ฉันได้ละเว้นสิ่งต่างๆ มากมายที่นี่ แต่หวังว่านี่น่าจะเป็นคำแนะนำเล็กๆ น้อยๆ แก่คุณเพื่อช่วยสานต่อลงในแอปของคุณ

คุณจะต้องมีสิ่งนี้:

private void ManageThread()
{
   var _thread = Thread.CurrentThread;
   while (!_threadMustStop) // false by default, set this to true in a 'shutdown' process
   {
       Thread.Sleep(10000);
   }
}

...ซึ่งคุณโทรจากวิธี SetupSchedules ของคุณ

person SpaceBison    schedule 02.07.2014