2016-06-30 9 views
6

में एसिंक्रोनस कार्यों को शेड्यूल करना हमारे पास एक प्ले-प्रोजेक्ट है जो PlayFramework 2.5.4 और MongoDB का उपयोग करता है। हम अपने डेटाबेस को दैनिक अद्यतन करना चाहते हैं। फिलहाल जब हम दिन खत्म हो जाते हैं तो हम अनुरोध करते समय अपडेट करते हैं और अपडेट करते हैं। कि कुछ समस्याओं को जन्म देता:PlayFramework 2.5.X (जावा)

  1. मौजूदा खिलाड़ी जब तक अनुरोध
  2. यह भी हो सकता है एक दिन कोई अद्यतन है कि वहाँ खत्म एक शांत लंबे समय तक इंतजार करना पड़ता है (लेकिन हम हर रोज एक चाहते हैं, यहां तक ​​कि कुछ भी नहीं करता है, तो परिवर्तन)
  3. हमें हमारे द्वारा सम्मिलित हर अनुरोध को संशोधित करना होगा।

तो मैं पहले से ही AKKA और पुराने stackoverflowquestions (How to schedule task daily + onStart() in Play 2.0.4? की तरह) के प्रलेखन पाया। लेकिन समाधान अब और काम नहीं करते हैं।

Akka.system().scheduler() 

बहिष्कृत है

system.scheduler() 

compilingerrors देता है (from docu) और मैं एक आयात लापता या और क्या कर रहा है, तो पता न। मुझे पता है आप संस्करण 2.4 के बाद से @inject का उपयोग करना चाहिए, लेकिन मैं नहीं कर सकते कि कैसे अनुसूची के साथ इसका इस्तेमाल करने पर उचित उदाहरणों को खोजने के रूप में या कैसे afterall इसका इस्तेमाल करने

वास्तव में सभी मैं करना चाहता हूँ फोन PlayerDBHandler.newDay() हर है एक ही समय में दिन।

सहायता

उत्तर

14

के लिए धन्यवाद संकलन त्रुटि मिल रही बिना, मेरा अनुमान है कि कि system परिभाषित नहीं है। प्रलेखन से उदाहरण का विस्तार, इस तरह कुछ काम करना चाहिए।

public class SchedulingTask { 

    @Inject 
    public SchedulingTask(final ActorSystem system, 
          @Named("update-db-actor") ActorRef updateDbActor) { 
     system.scheduler().schedule(
      Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay 
      Duration.create(1, TimeUnit.DAYS),  //Frequency 
      updateDbActor, 
      "update", 
      system.dispatcher(), 
      null); 
    } 
} 

system इंजेक्ट किया जाता है, और आप भी अभिनेता के लिए एक संदर्भ इंजेक्षन कर सकते हैं। वैकल्पिक रूप से, आप system से अभिनेता रेफरी देख सकते हैं।

एक बार जब आप इसे वही करने के लिए अनुकूलित कर लेते हैं, तो मॉड्यूल में SchedulingTask घोषित करें।

package com.example; 
import com.google.inject.AbstractModule; 
import play.libs.akka.AkkaGuiceSupport; 

public class MyModule extends AbstractModule implements AkkaGuiceSupport { 
    @Override 
    protected void configure() { 
     bindActor(UpdateDbActor.class, "update-db-actor"); 
     bind(SchedulingTask.class).asEagerSingleton(); 
    } 
} 

अंत में, मॉड्यूल सक्षम करने के लिए अपने आवेदन conf अद्यतन करें।

play.modules.enabled += "com.example.MyModule"