উত্তর:
একটি নির্ধারিতএক্সিকিউটর পরিষেবা ব্যবহার করুন :
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, TimeUnit.HOURS);
আপনার কোয়ার্টজকে একবার দেখে নেওয়া উচিত এটি জাভা ফ্রেমওয়ার্ক যা ইই এবং এসই সংস্করণগুলির সাথে কাজ করে এবং নির্দিষ্ট সময় নির্বাহের জন্য কাজের সংজ্ঞা দেয়
এইভাবে চেষ্টা করুন ->
প্রথমে একটি ক্লাস টাইম টাস্ক তৈরি করুন যা আপনার কাজটি চালায়, দেখে মনে হয়:
public class CustomTask extends TimerTask {
public CustomTask(){
//Constructor
}
public void run() {
try {
// Your task process
} catch (Exception ex) {
System.out.println("error running thread " + ex.getMessage());
}
}
}
তারপরে মূল শ্রেণিতে আপনি কাজটি তাত্ক্ষণিকভাবে চালান এবং নির্দিষ্ট সময় দ্বারা এটি পর্যায়ক্রমে শুরু করে:
public void runTask() {
Calendar calendar = Calendar.getInstance();
calendar.set(
Calendar.DAY_OF_WEEK,
Calendar.MONDAY
);
calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 40);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Timer time = new Timer(); // Instantiate Timer Object
// Start running the task on Monday at 15:40:00, period is set to 8 hours
// if you want to run the task immediately, set the 2nd parameter to 0
time.schedule(new CustomTask(), calendar.getTime(), TimeUnit.HOURS.toMillis(8));
}
গুগু পেয়ারা AbstractScheduledService
নীচে দেওয়া হিসাবে ব্যবহার করুন :
public class ScheduledExecutor extends AbstractScheduledService
{
@Override
protected void runOneIteration() throws Exception
{
System.out.println("Executing....");
}
@Override
protected Scheduler scheduler()
{
return Scheduler.newFixedRateSchedule(0, 3, TimeUnit.SECONDS);
}
@Override
protected void startUp()
{
System.out.println("StartUp Activity....");
}
@Override
protected void shutDown()
{
System.out.println("Shutdown Activity...");
}
public static void main(String[] args) throws InterruptedException
{
ScheduledExecutor se = new ScheduledExecutor();
se.startAsync();
Thread.sleep(15000);
se.stopAsync();
}
}
যদি আপনার মতো আরও পরিষেবা থাকে তবে সার্ভিস ম্যানেজারে সমস্ত পরিষেবাদি নিবন্ধকরণ করা ভাল হবে কারণ সমস্ত পরিষেবা একসাথে শুরু করা এবং বন্ধ করা যেতে পারে। সার্ভিস ম্যানেজার সম্পর্কে আরও জানতে এখানে পড়ুন ।
পর্যায়ক্রমিক কার্য নির্ধারণের জন্য এই দুটি শ্রেণি একসাথে কাজ করতে পারে:
import java.util.TimerTask;
import java.util.Date;
// Create a class extending TimerTask
public class ScheduledTask extends TimerTask {
Date now;
public void run() {
// Write code here that you want to execute periodically.
now = new Date(); // initialize date
System.out.println("Time is :" + now); // Display current time
}
}
import java.util.Timer;
public class SchedulerMain {
public static void main(String args[]) throws InterruptedException {
Timer time = new Timer(); // Instantiate Timer Object
ScheduledTask st = new ScheduledTask(); // Instantiate SheduledTask class
time.schedule(st, 0, 1000); // Create task repeating every 1 sec
//for demo only.
for (int i = 0; i <= 5; i++) {
System.out.println("Execution in Main Thread...." + i);
Thread.sleep(2000);
if (i == 5) {
System.out.println("Application Terminates");
System.exit(0);
}
}
}
}
রেফারেন্স https://www.mkyong.com/java/how-to-run-a-task-periodically-in-java/
প্রতি সেকেন্ডে কিছু করুন
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
//code
}
}, 0, 1000);
আমি স্প্রিং ফ্রেমওয়ার্কের বৈশিষ্ট্যটি ব্যবহার করি। ( বসন্ত-প্রসঙ্গে জার বা মাভেন নির্ভরতা)।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTaskRunner {
@Autowired
@Qualifier("TempFilesCleanerExecution")
private ScheduledTask tempDataCleanerExecution;
@Scheduled(fixedDelay = TempFilesCleanerExecution.INTERVAL_TO_RUN_TMP_CLEAN_MS /* 1000 */)
public void performCleanTempData() {
tempDataCleanerExecution.execute();
}
}
শিড্যুলড টাস্কটিআমার নিজস্ব কাস্টম পদ্ধতির এক্সিকিউটের সাথে আমার নিজস্ব ইন্টারফেস, যা আমি আমার নির্ধারিত টাস্ক বলে।
আপনি কি টীকা ব্যবহার করে স্প্রিং শিডিয়ুলার চেষ্টা করেছেন ?
@Scheduled(cron = "0 0 0/8 ? * * *")
public void scheduledMethodNoReturnValue(){
//body can be another method call which returns some value.
}
আপনি এক্সএমএল দিয়ে এটি করতে পারেন।
<task:scheduled-tasks>
<task:scheduled ref = "reference" method = "methodName" cron = "<cron expression here> -or- ${<cron expression from property files>}"
<task:scheduled-tasks>
আমার সার্লেলে একটি কোড হিসাবে এটি রয়েছে কীভাবে কোনও ব্যবহারকারী প্রেসগুলি গ্রহণ করে তা শিডিয়ুলারে রাখবেন
if(bt.equals("accept")) {
ScheduledExecutorService scheduler=Executors.newScheduledThreadPool(1);
String lat=request.getParameter("latlocation");
String lng=request.getParameter("lnglocation");
requestingclass.updatelocation(lat,lng);
}
TimeUnit
উভয়initialDelay
এবং এর ক্ষেত্রেই প্রযোজ্যperiod
। প্রতি 24 ঘন্টা চলমান শেষ হবে বন্ধ নিক্ষিপ্ত হওয়ার যখন, কিন্তু একটি মধ্যে ডিএসটি কিকTimeUnit
এরDAYS
আপনি যদি একটি সূক্ষ্মাতিসূক্ষ্ম উল্লেখ যাক নাinitialDelay
। (আমি মনে করি অভ্যন্তরীণDAYS
শিডিউডএকসিকিউটারস সার্ভিস বাস্তবায়ন যাইহোক ন্যানোসেকেন্ডে রূপান্তরিত হয়)।