2014-11-03 13 views
0

我使用Akka actors在Play Framework中創建了一個作業隊列,我從全局對象中啓動了actor系統。 JobManager參與者(如下所示)每分鐘檢查一次數據庫,如果存在未完成的任務,它會向Worker參與者發送消息來處理它。在那之下你可以看到我的任務模型。java.lang.ClassCastException:models.Task無法轉換爲models.Task on Play框架

case class CheckDatabase() 

class JobManager extends Actor { 

    def receive = { case CheckDatabase() => CheckIt } 

    def CheckIt = { 

    val allTasks: List[Task] = new Model.Finder(classOf[String], classOf[Task]).all() 
    val taskBuffer = new ArrayBuffer[Boolean] 
    for(i <- 0 until allTasks.size){ taskBuffer += allTasks.get(i).isRunning } 
    if(taskBuffer.forall(taskIsRunning => taskIsRunning == false)){ 
     val nextTask = nextOntheLine 
     if(nextTask != null){ 
     val worker = context.system.actorOf(Props[Worker], name = nextTask.id) 
     worker ! StartWorking(nextTask) 
     } else { 
     println("Status: idle...") 
     } 
    } 
    } 

    def nextOntheLine: Task = { 

    val tasks = new Model.Finder(classOf[String], classOf[Task]) 
     .where 
     .eq("isDone", false) 
     .eq("isCancelled", false) 
     .eq("isRunning", false) 
     .orderBy("uploadDate asc") 
     .findList() 

    if(tasks.size > 0){ 
     tasks.get(0) 
    } else { 
     null 
    } 
    } 
} 

@Entity 
public class Task extends Model { 

    @Id 
    public String id; 

    public String email; 

    public boolean isDone; 

    public void setIsDone(boolean _isdone){ 
     isDone = _isdone; 
    } 

    public boolean isRunning; 

    public void setIsRunning(boolean _isrunning){ 
     isRunning = _isrunning; 
    } 

    public boolean isCancelled; 

    public void setIsCancelled(boolean _iscancelled){ 
     isCancelled = _iscancelled; 
    } 

    @Formats.DateTime(pattern="hh:mm:ss, dd/MM/yyyy") 
    public Date uploadDate = new Date(); 

} 

它開始工作完全正常,當我發送請求,它開始工作並完成他們,但工作的處理過程中(同時檢查與JobManager數據庫)我得到java.lang.ClassCastException: models.Task cannot be cast to models.Task錯誤。正如你可以看到演員是用Scala編寫的,但我的模型是用Java編寫的。這是否可以導致這種情況?

+2

這只是一個猜測,但這可能是一個類加載器的問題? – Dirk 2014-11-03 15:39:31

+0

你能再給一些解釋嗎? – zamk 2014-11-03 17:57:40

+0

這是一個經典的類加載器問題。當您使用多個類加載器時,LoaderA加載的類文件與LoaderB加載的相同類文件不同。一個人必須注意只給一個給定的班級加班一次,否則要非常小心,以避免會員之間相遇。 – 2014-11-03 21:55:23

回答

0

我在Java中創建了另一個類,並將JobManager中的所有方法重寫爲靜態方法。然後我將它們導入到Scala代碼中並解決了問題。這似乎是問題在於它是一個Java項目,模型根據這個工作。

相關問題