2012-06-19 14 views
2

您好我有一個阿卡演員:更改預定時間上的阿卡任務

public class StatusActor extends UntypedActor { 
public static ActorRef instance = Akka.system().actorOf(
     new Props(StatusActor.class)); 

public void onReceive(Object message) { 
    Logger.info("Message received"); 
} 

}

而且我創建了一個時間表它曾經5分鐘:

Akka.system().scheduler().schedule(
     Duration.create(60, TimeUnit.SECONDS), 
     Duration.create(5, TimeUnit.MINUTES), StatusActor.instance, null); 

問題我有,我想動態地改變這個時間?有什麼辦法可以做到這一點?我找不到任何方法來阻止它。那麼我可以重新開始。

我想到的唯一的方法就是在onReceive的最後,讓它調用akka計劃重新開始,並將所有值更改爲運行一次,並在StatusActor中爲該頻率設置一個靜態變量。

如果有人能告訴我如何阻止演員/獲得訪問將是非常有益的。

回答

2

如果您看看計劃的返回值,無論是在IDE中還是在documentation中,您都會看到它返回一個可取消對象,因此您可以取消先前計劃並計劃一個新對象。

希望有幫助!

乾杯, √

+0

謝謝你應該這樣做。現在我需要把它放在好的地方,因爲我在啓動時運行計劃,所以我不會從其他類訪問此類。 – user1434177

1

幾個步驟,你需要做的:

1你需要有一個全球性的鍵值變量。這裏我使用ConcurrentHashMap,因爲普通的HashMap在多線程環境中不安全。

var schedulerIDs = new ConcurrentHashMap[String, Cancellable]().asScala 

2每次創建調度程序時,都需要將其存儲到鍵值變量。您需要設計您的密鑰,在這裏我使用調度程序的創建時間和創建此調度程序的用戶作爲密鑰(僅僅因爲它是獨特的,並且我很容易恢復它)。其價值是其可取消的變量。 (記住,你不能讀取其內容,因爲它僅僅是取消類型。)

val schedulerID = system.scheduler.schedule(initialDelay, interval, myActor, subMessage) 

val schedulerKey = startTime + userName 
val filterOption = schedulerIDs.get(schedulerKey) 
filterOption match { 
    case None => 
    schedulerIDs += schedulerKey -> schedulerID 
    case _ => 
} 

3當要修改一個調度程序,您需要獲取從鍵值變量的信息,以獲取其取消變量。然後使用這個可取消變量先取消該調度程序,並從此鍵值變量中刪除此調度程序。

def removeScheduler(createTime: String, userName: String) { 
    val schedulerKey = createTime + userName 
    val filterOption = schedulerIDs.get(schedulerKey) 
    filterOption match { 
    case None => 
    case Some(value) => 
     value.cancel() 
     schedulerIDs.remove(schedulerKey) 
    } 
} 

4最後一步是創建一個新的調度將步驟2和重返第一步儲存。

該解決方案使用全局變量來存儲調度程序信息。它的好處是快速的,但缺點是當服務器關閉時,所有這些信息都將消失。因爲服務器關閉時全局變量將會消失。

因此,通常我會將調度程序信息存儲到數據庫中,一起根據其調度程序信息(如init時間,間隔等)恢復一切。完全像創建新的調度程序。但用戶或前端不會注意到它。