সার্লেট ভিত্তিক ওয়েব অ্যাপ্লিকেশনটিতে কীভাবে একটি পটভূমি টাস্ক চালানো যায়?


97

আমি জাভা ব্যবহার করছি এবং আমি আমার অ্যাপ্লিকেশনটিতে ক্রমাগত একটি সার্লেট চালিয়ে যেতে চাই, তবে আমি কীভাবে এটি করব তা পাচ্ছি না। আমার সার্লেটের একটি পদ্ধতি রয়েছে যা একটি ডাটাবেস থেকে প্রতিদিনের ভিত্তিতে পুরো ডাটাবেস থেকে ব্যবহারকারীদের মোট গণনা দেয় the সুতরাং আমি সার্লেটটি এটির জন্য অবিচ্ছিন্নভাবে চালিয়ে যেতে চাই।


"ক্রমাগত চলমান" মানে কী?
স্কাফম্যান

4
ধারাবাহিকভাবে দৌড়ানোর অর্থ কী? এটি আপনার অ্যাপ্লিকেশন সার্ভার যতক্ষণ চলবে ততক্ষণ চলবে
fmucar

4
আমি বুঝতে পারছি না কেন এটি অবিচ্ছিন্নভাবে চালাতে হবে ... যদি কেউ 'ব্যবহারকারী গণনা' চায় তবে তারা আপনার সার্ভলেট পদ্ধতিটি কল করে এবং আপনি তাদের তা দিয়ে দেন?
ট্রজানফয়ে

@ ট্রোজানফো প্রকৃতপক্ষে আমি দৈনিক ভিত্তিতে ব্যবহারকারীর অ্যাকাউন্ট চাই, সুতরাং এর জন্য আমাকে প্রতিদিন নিজেই সার্লেটটি চালাতে হবে তাই না করে আমি সার্লেটলেটটি চালিয়ে যেতে চাই cont
pritsag

4
@ প্রিটসাগ: ব্যাচ কাজ চালানোর জন্য নয়, ব্যবহারকারীর অনুরোধগুলি সরবরাহ করার জন্য একটি সার্লেট রয়েছে।
স্কাফম্যান

উত্তর:


217

আপনার সমস্যাটি হ'ল আপনি সার্লেটের উদ্দেশ্যটি ভুল বুঝে । এটি এইচটিটিপি অনুরোধগুলিতে কাজ করার উদ্দেশ্যে, আরও কিছু নয়। আপনি কেবল একটি ব্যাকগ্রাউন্ড টাস্ক চান যা প্রতিদিনের ভিত্তিতে একবার চালিত হয়।

ইজেবি পাওয়া যায়? ব্যবহার@Schedule

যদি আপনার পরিবেশটি ইজেবি সমর্থন করে (যেমন একটি বাস্তব জাভা ইই সার্ভার যেমন ওয়াইল্ডফ্লাই, জবস, টমইই, পেয়ারা, গ্লাস ফিশ ইত্যাদি), তবে তার @Scheduleপরিবর্তে ব্যবহার করুন। এখানে কিছু উদাহরন:

@Singleton
public class BackgroundJobManager {

    @Schedule(hour="0", minute="0", second="0", persistent=false)
    public void someDailyJob() {
        // Do your job here which should run every start of day.
    }

    @Schedule(hour="*/1", minute="0", second="0", persistent=false)
    public void someHourlyJob() {
        // Do your job here which should run every hour of day.
    }

    @Schedule(hour="*", minute="*/15", second="0", persistent=false)
    public void someQuarterlyJob() {
        // Do your job here which should run every 15 minute of hour.
    }

    @Schedule(hour="*", minute="*", second="*/5", persistent=false)
    public void someFiveSecondelyJob() {
        // Do your job here which should run every 5 seconds.
    }

} 

হ্যাঁ, সত্যিই এটাই। ধারকটি স্বয়ংক্রিয়ভাবে এটি পিকআপ এবং পরিচালনা করবে।

ইজেবি অনুপলব্ধ? ব্যবহার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() {
        // Do your daily job here.
    }

}
public class SomeHourlyJob implements Runnable {

    @Override
    public void run() {
        // Do your hourly job here.
    }

}
public class SomeQuarterlyJob implements Runnable {

    @Override
    public void run() {
        // Do your quarterly job here.
    }

}
public class SomeFiveSecondelyJob implements Runnable {

    @Override
    public void run() {
        // Do your quarterly job here.
    }

}

কি ব্যবহার সম্পর্কে মনে করি না java.util.Timer/ java.lang.Threadএকটি জাভা EE / সার্ভলেট ভিত্তিক পরিবেশে

সর্বশেষে তবে অন্তত নয়, জাভা ইইতে সরাসরি এবং কখনও ব্যবহার করবেন না । এটি ঝামেলার রেসিপি। একই প্রশ্নের জেএসএফ-সম্পর্কিত উত্তরে একটি বিস্তৃত ব্যাখ্যা পাওয়া যাবে: টাইমার ব্যবহার করে তফসিলযুক্ত কাজের জন্য জেএসএফ পরিচালিত শিমের থ্রেড স্প্যানিংjava.util.Timerjava.lang.Thread


9
@ বালুকস স্যার আপনাকে ধন্যবাদ স্যার, আপনার সমাধানটি আমাকে সহায়তা করেছে এবং আমি শিডিউডএক্সেকিউটারসেবা সম্পর্কে জেনেছি যা জাভাতে আমার পক্ষে নতুন ছিল you আপনাকে আবারও ধন্যবাদ।
pritsag

@ বালুসসি: ওয়েব.এক্সএমএল-এ ক্লাস আপডেট অ্যাকাউন্টগুলি কোথায় রাখা উচিত?
আশ্বিন

4
@ আশ্বিন ওয়েব.এক্সএমএল একটি ডিপ্লোয়মেন্ট ডেস্ক্রিপ্টর । ক্লাস আপডেটকাউন্টটি স্থাপনার সাথে সম্পর্কিত নয়, সুতরাং এটি ওয়েব.এক্সএমএল
তথ্যসূত্র

12
এর সাথে একটি গুরুত্বপূর্ণ সমস্যা ScheduledExecutorService: আপনার নির্বাহকের সমস্ত ব্যতিক্রম ক্যাপচার করতে ভুলবেন না । যদি কোনও ব্যতিক্রম আপনার runপদ্ধতি থেকে অব্যাহতি দেয় , তবে নির্বাহক নিঃশব্দে সম্পাদন বন্ধ করে দেন। এটি একটি বৈশিষ্ট্য, না একটি বাগ সংশোধন করা হয়. ডকটি পড়ুন এবং কিছু গুগলিংয়ের সাথে অধ্যয়ন করুন।
তুলসী বাউরক

4
@ অজি: scheduler.shutdownNow()উদাহরণ হিসাবে সঠিকভাবে না চাওয়া হলে তা ঘটবে । যদি এটি না চাওয়া হয় তবে তফসিলের থ্রেডটি সত্যই চলতে থাকবে।
বালাসসি

4

আমি নিয়মিত বিরতিতে টাস্কটি চালানোর জন্য কোয়ার্টজের মতো লাইব্রেরি ব্যবহার করার পরামর্শ দেব। সার্লেটটি আসলে কী করে? এটি আপনাকে একটি প্রতিবেদন পাঠায়?


হ্যাঁ, এটি আমাকে প্রতিদিন তৈরি করা ব্যবহারকারীর গণনা এবং আমার ডাটাবেসে মোট ব্যবহারকারীর গণনা দেয়।
pritsag

4
হুউ? আপনি কি আপনার সিস্টেমের সম্পূর্ণ আর্কিটেকচার বর্ণনা করতে পারেন? আমি শেষ.
টুইস্টার

@ টুইটারে ইমা জাভাতে নতুন এবং পর্ব স্যার শেখার ক্ষেত্রে নতুন এবং সার্লেটগুলি সম্পর্কে খুব বেশি কিছু জানেন না।
pritsag

সমস্যা সার্লেট সম্পর্কে নয়। আপনি যে অ্যাপ্লিকেশনটির কথা বলছেন তা কী? (পিএস: আপনার মন্তব্যগুলি মুছে ফেলা খারাপ ধারণা, বিশেষত আমি যে মন্তব্যে উত্তর দিয়েছি)
টুইস্টার

@ ব্যবহারকারী যখন অ্যাপ্লিকেশনটিকে হিট করবেন, তখন তিনি ব্যবহারকারীদের কতটা তৈরি করা হয়েছে, এখন পর্যন্ত কতজন ব্যবহারকারীকে ক্রেট করা হয়েছে ইত্যাদি সমস্ত বিবরণ পাবেন এবং আমি পটভূমিতে সার্ভারলেট রানটি সংক্ষেপে চালাতে চাই যাতে ব্যবহারকারী আপডেটগুলি পেতে পারে : .আমি kno এই সঠিক explation নয় (আমি জানি এটা যে জন্য একটি খারাপ idea.sorry ছিল PS।)।
pritsag

3

দুটি ক্লাস বাস্তবায়ন এবং কল startTask()মধ্যে main

public void startTask()
{
    // Create a Runnable
    Runnable task = new Runnable() {
        public void run() {
            while (true) {
                runTask();
            }
        }
    };

    // Run the task in a background thread
    Thread backgroundThread = new Thread(task);
    // Terminate the running thread if the application exits
    backgroundThread.setDaemon(true);
    // Start the thread
    backgroundThread.start();
}

public void runTask()
{
    try {
        // do something...         
        Thread.sleep(1000);

    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

4
এটি কোনও ওয়েব অ্যাপ্লিকেশনে এটি করার উপায়টি অবশ্যই নয় - পরিবর্তে @ বালাসকির উপরের উত্তরটি দেখুন - তিনি এখানে সঠিক এবং আমি বলব আপনি তার সমস্ত উত্তর বিশ্বাস করতে পারেন।
Yoshiya


0

এমন একটি প্রোডাকশন সিস্টেমে একাধিক নন-জি পাত্রে চলতে পারে। কোয়ার্টজ শিডিয়ুলারের মতো অ্যান্ট এন্টারপ্রাইজ শিডিয়ুলার ব্যবহার করুন যা টাস্ক ম্যামজেমেটের জন্য একটি ডাটাবেস ব্যবহার করতে কনফিগার করা যেতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.