জাভাতে পর্যায়ক্রমিক টাস্ক কীভাবে নির্ধারণ করবেন?


183

সময় নির্ধারিত বিরতিতে চালানোর জন্য আমার একটি কাজ শিডিউল করা দরকার। দীর্ঘ বিরতির সমর্থন সহ আমি কীভাবে এটি করতে পারি (উদাহরণস্বরূপ প্রতি 8 ঘন্টা)?

আমি বর্তমানে ব্যবহার করছি java.util.Timer.scheduleAtFixedRate। কি java.util.Timer.scheduleAtFixedRateসমর্থন দীর্ঘ সময় অন্তর?

উত্তর:


260

একটি নির্ধারিতএক্সিকিউটর পরিষেবা ব্যবহার করুন :

 private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
 scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, TimeUnit.HOURS);

1
আপনি যদি প্রতিদিন এটি একটি নির্দিষ্ট সময়ে চালনা করতে চান তবে এটি করার দুর্দান্ত উপায় নেই, কারণ এটি TimeUnitউভয় initialDelayএবং এর ক্ষেত্রেই প্রযোজ্য period। প্রতি 24 ঘন্টা চলমান শেষ হবে বন্ধ নিক্ষিপ্ত হওয়ার যখন, কিন্তু একটি মধ্যে ডিএসটি কিক TimeUnitএর DAYSআপনি যদি একটি সূক্ষ্মাতিসূক্ষ্ম উল্লেখ যাক না initialDelay। (আমি মনে করি অভ্যন্তরীণ DAYSশিডিউডএকসিকিউটারস সার্ভিস বাস্তবায়ন যাইহোক ন্যানোসেকেন্ডে রূপান্তরিত হয়)।
স্যাম বার্নুম

46

আপনার কোয়ার্টজকে একবার দেখে নেওয়া উচিত এটি জাভা ফ্রেমওয়ার্ক যা ইই এবং এসই সংস্করণগুলির সাথে কাজ করে এবং নির্দিষ্ট সময় নির্বাহের জন্য কাজের সংজ্ঞা দেয়


23

এইভাবে চেষ্টা করুন ->

প্রথমে একটি ক্লাস টাইম টাস্ক তৈরি করুন যা আপনার কাজটি চালায়, দেখে মনে হয়:

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));
}

6
কোডটি আরও পঠনযোগ্য করার জন্য আপনি টাইমউনিতকে কল করার সময়সূচীতে চূড়ান্ত যুক্তিটি পরিবর্তন করতে পারেন OUR HOURS.to মিলিস (8)
ডারেনএমসি

টাইমারের জন্য ডকুমেন্টেশন পরিবর্তে এক্সিকিউটার ফ্রেমওয়ার্ক ব্যবহার করার পরামর্শ দেয়।
করণ খান্না

14

গুগু পেয়ারা 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();
   }

}

যদি আপনার মতো আরও পরিষেবা থাকে তবে সার্ভিস ম্যানেজারে সমস্ত পরিষেবাদি নিবন্ধকরণ করা ভাল হবে কারণ সমস্ত পরিষেবা একসাথে শুরু করা এবং বন্ধ করা যেতে পারে। সার্ভিস ম্যানেজার সম্পর্কে আরও জানতে এখানে পড়ুন ।


9

আপনি যদি আটকে থাকতে চান java.util.Timer, আপনি এটি বড় সময়ের ব্যবধানে সময়সূচী করতে ব্যবহার করতে পারেন। আপনি যে সময়টির জন্য শুটিং করছেন আপনি কেবল সেই সময়টি পার করেন। ডকুমেন্টেশন এখানে পরীক্ষা করুন


5

পর্যায়ক্রমিক কার্য নির্ধারণের জন্য এই দুটি শ্রেণি একসাথে কাজ করতে পারে:

নির্ধারিত কাজ করার

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/


এখন অবধি সর্বোত্তম সমাধান, আরও পরিচ্ছন্ন এবং কার্যকর করা সহজ
সালভাদোর ভিগো

4

যদি আপনার অ্যাপ্লিকেশনটি ইতিমধ্যে স্প্রিং ফ্রেমওয়ার্ক ব্যবহার করছে তবে আপনার মধ্যে শিডিউলটি অন্তর্নির্মিত হবে


4

প্রতি সেকেন্ডে কিছু করুন

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        //code
    }
}, 0, 1000);

1
টাইমারের জন্য ডকুমেন্টেশনগুলির পরিবর্তে এক্সিকিউটার কাঠামোটি ব্যবহারের পরামর্শ দেওয়া হয়েছে
করণ খান্না

3

আমি স্প্রিং ফ্রেমওয়ার্কের বৈশিষ্ট্যটি ব্যবহার করি। ( বসন্ত-প্রসঙ্গে জার বা মাভেন নির্ভরতা)।

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();
    }

}

শিড্যুলড টাস্কটিআমার নিজস্ব কাস্টম পদ্ধতির এক্সিকিউটের সাথে আমার নিজস্ব ইন্টারফেস, যা আমি আমার নির্ধারিত টাস্ক বলে।


2

আপনি কি টীকা ব্যবহার করে স্প্রিং শিডিয়ুলার চেষ্টা করেছেন ?

@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>

0

আমার সার্লেলে একটি কোড হিসাবে এটি রয়েছে কীভাবে কোনও ব্যবহারকারী প্রেসগুলি গ্রহণ করে তা শিডিয়ুলারে রাখবেন

if(bt.equals("accept")) {
    ScheduledExecutorService scheduler=Executors.newScheduledThreadPool(1);
    String lat=request.getParameter("latlocation");
    String lng=request.getParameter("lnglocation");
    requestingclass.updatelocation(lat,lng);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.