আপনার সমস্যাটি হ'ল আপনি সার্লেটের উদ্দেশ্যটি ভুল বুঝে । এটি এইচটিটিপি অনুরোধগুলিতে কাজ করার উদ্দেশ্যে, আরও কিছু নয়। আপনি কেবল একটি ব্যাকগ্রাউন্ড টাস্ক চান যা প্রতিদিনের ভিত্তিতে একবার চালিত হয়।
ইজেবি পাওয়া যায়? ব্যবহার@Schedule
যদি আপনার পরিবেশটি ইজেবি সমর্থন করে (যেমন একটি বাস্তব জাভা ইই সার্ভার যেমন ওয়াইল্ডফ্লাই, জবস, টমইই, পেয়ারা, গ্লাস ফিশ ইত্যাদি), তবে তার @Schedule
পরিবর্তে ব্যবহার করুন। এখানে কিছু উদাহরন:
@Singleton
public class BackgroundJobManager {
@Schedule(hour="0", minute="0", second="0", persistent=false)
public void someDailyJob() {
}
@Schedule(hour="*/1", minute="0", second="0", persistent=false)
public void someHourlyJob() {
}
@Schedule(hour="*", minute="*/15", second="0", persistent=false)
public void someQuarterlyJob() {
}
@Schedule(hour="*", minute="*", second="*/5", persistent=false)
public void someFiveSecondelyJob() {
}
}
হ্যাঁ, সত্যিই এটাই। ধারকটি স্বয়ংক্রিয়ভাবে এটি পিকআপ এবং পরিচালনা করবে।
ইজেবি অনুপলব্ধ? ব্যবহারScheduledExecutorService
যদি আপনার পরিবেশ EJB সমর্থন করে না (যেমন আপনি আসল জাভা EE সার্ভারটি ব্যবহার করছেন না, তবে টমক্যাট, জেটি, ইত্যাদির মতো একটি নগ্নবোন সার্লেটকন্টিনিয়ার) তবে ব্যবহার করুন ScheduledExecutorService
। এটি একটি দ্বারা সূচনা করা যেতে পারে ServletContextListener
। এখানে একটি কিক অফ উদাহরণ:
@WebListener
public class BackgroundJobManager implements ServletContextListener {
private ScheduledExecutorService scheduler;
@Override
public void contextInitialized(ServletContextEvent event) {
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new SomeDailyJob(), 0, 1, TimeUnit.DAYS);
scheduler.scheduleAtFixedRate(new SomeHourlyJob(), 0, 1, TimeUnit.HOURS);
scheduler.scheduleAtFixedRate(new SomeQuarterlyJob(), 0, 15, TimeUnit.MINUTES);
scheduler.scheduleAtFixedRate(new SomeFiveSecondelyJob(), 0, 5, TimeUnit.SECONDS);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
scheduler.shutdownNow();
}
}
যেখানে চাকরীর ক্লাসগুলি এইরকম দেখাচ্ছে:
public class SomeDailyJob implements Runnable {
@Override
public void run() {
}
}
public class SomeHourlyJob implements Runnable {
@Override
public void run() {
}
}
public class SomeQuarterlyJob implements Runnable {
@Override
public void run() {
}
}
public class SomeFiveSecondelyJob implements Runnable {
@Override
public void run() {
}
}
কি ব্যবহার সম্পর্কে মনে করি না java.util.Timer
/ java.lang.Thread
একটি জাভা EE / সার্ভলেট ভিত্তিক পরিবেশে
সর্বশেষে তবে অন্তত নয়, জাভা ইইতে সরাসরি এবং কখনও ব্যবহার করবেন না । এটি ঝামেলার রেসিপি। একই প্রশ্নের জেএসএফ-সম্পর্কিত উত্তরে একটি বিস্তৃত ব্যাখ্যা পাওয়া যাবে: টাইমার ব্যবহার করে তফসিলযুক্ত কাজের জন্য জেএসএফ পরিচালিত শিমের থ্রেড স্প্যানিং ।java.util.Timer
java.lang.Thread