سؤال

أرغب في تشغيل عملية الخلفية بالتوازي مع تطبيق الويب الخاص بـ Spring-MVC. أحتاج إلى وسيلة للبدء تلقائيًا في تحميل السياق. عملية الخلفية هي فئة تنفذها Runnable. هل لدى Spring-MVC بعض المرافق لذلك؟

هل كانت مفيدة؟

المحلول

الربيع لديه إطار شامل لتنفيذ المهام. انظر الجزء ذي الصلة من المستندات.

أقترح أن يكون لديك حبة زنبركية في سياقك ، والتي ، عند تهيئتها ، تقدم خلفيتك Runnable إلى SimpleAsyncTaskExecutor فاصوليا. هذا هو أبسط نهج ، يمكنك جعله أكثر تعقيدًا وقدرًا كما تراه مناسبًا.

نصائح أخرى

أود أن أمضي قدمًا وألقي نظرة على وثائق جدولة المهام المرتبطة بواسطة Skaffman ، ولكن هناك أيضًا طريقة أبسط إذا كان كل ما تريد فعله حقًا هو إطلاق سلسلة خلفية في وقت تهيئة السياق.

<bean id="myRunnableThingy">
  ...
</bean>

<bean id="thingyThread" class="java.lang.Thread" init-method="start">
  <constructor-arg ref="myRunnableThingy"/>
</bean>

كخيار آخر ، يمكن للمرء الآن استخدام قدرات جدولة Spring. مع ربيع 3 أو أعلى ، يحتوي على كرون مثل التعليق التوضيحي الذي يتيح لك جدولة المهام لتشغيل مع شرح بسيط للطريقة. كما أنها ودية مع AutowIring.

يحدد هذا المثال مهمة لكل دقيقتين مع انتظار أولي (عند بدء التشغيل) من 30 ثانية. سيتم تشغيل المهمة التالية بعد دقيقتين من اكتمال الطريقة! إذا كنت تريد تشغيله كل دقيقتين بالضبط ، فاستخدم ثابتًا بدلاً من ذلك.

@Service
public class Cron {
private static Logger log = LoggerFactory.getLogger(Cron.class);

@Autowired
private PageService pageService;

@Scheduled(initialDelay = 30000, fixedDelay=120000)  // 2 minutes
public void cacheRefresh() {
    log.info("Running cache invalidation task");
    try {

        pageService.evict();
    } catch (Exception e) {
        log.error("cacheRefresh failed: " + e.getMessage());
    }
}

}

تأكد أيضًا من إضافة enableAsync enablesCheduling إلى فئة التطبيق الخاصة بك لتمكين هذه الميزة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top