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編寫的。這是否可以導致這種情況?
這只是一個猜測,但這可能是一個類加載器的問題? – Dirk 2014-11-03 15:39:31
你能再給一些解釋嗎? – zamk 2014-11-03 17:57:40
這是一個經典的類加載器問題。當您使用多個類加載器時,LoaderA加載的類文件與LoaderB加載的相同類文件不同。一個人必須注意只給一個給定的班級加班一次,否則要非常小心,以避免會員之間相遇。 – 2014-11-03 21:55:23