2013-08-23 63 views
0

上下文: 這是一個客戶端服務器應用程序。目前的EJB的樣子:在Glassfish EAR中使用Akka進行多線程可能嗎?

public class ServerSideJob { 

    @WebMethod(operationName = "launchJob") 
    public String launchJob(@WebParam(name = "idUser") String idUser, @WebParam(name = "name") String name, @WebParam(name = "param") Object param) { 

     Runnable controller = new JobController(screenName, fof, mm, job); 
     new Thread(controller).start(); 
     return "job launched"; 
    } 
} 

作業已啓動其他幾個線程。

在這一點上,我想增加客戶端中斷工作的可能性。中斷從「外部」的線程是相當a dirty affair(我不得不爲每個操作添加更多的調用到一個分貝爲此),這會提示我切換到多線程Akka。

問題:我不確定如何將Akka邏輯與上面的EJB代碼合併。我如何從launchJob函數中調用層次結構的頂級演員? (好吧,當然是noob問題...)

public class ServerSideJob { 

    @WebMethod(operationName = "launchJob") 
    public String launchJob(@WebParam(name = "idUser") String idUser, @WebParam(name = "name") String name, @WebParam(name = "param") Object param) { 

//how do I call my Akka actor here? 
     return "job launched"; 
    } 
} 
+0

我不太瞭解阿卡,但我認爲阻止演員比阻止線索更容易。畢竟,演員是在線程之上實現的。 –

+0

您可以隨時向演員發送一條消息 - 傳播他們的死亡或任何您希望看到他們做的事情。 – seinecle

+0

注意:我也不太瞭解阿卡,所以我不假裝是正確的,這只是我的理解。 – seinecle

回答

0

這確實是一個noob問題。我不知道該怎麼做,因爲按照akka.io上的「hello world」示例,該應用程序在沒有ActorSystem的情況下啓動,因此我忽略了它。一個ActorSystem僅僅是你所需要的:

一類爲ActorSystem,在即將推出的應用程序啓動:

@Singleton 
@Startup 
// initialize at deployment time instead of first invocation 

public class SharedActorSystem { 

    ActorSystem system; 

    @PostConstruct 
    void loadConfiguration() { 
     system = ActorSystem.create("systemJobs"); 
    } 

    public ActorSystem getSystem() { 
     return system; 
    } 
} 

並與服務器端工作類:

public class ServerSideJob { 

    @EJB 
    SharedActorSystem sharedActorSystem; 

    @WebMethod(operationName = "launchJob") 
    public String launchJob(@WebParam(name = "idUser") String idUser) { 

    //getting the ActorSystem 
    ActorSystem system = sharedActorSystem.getSystem(); 

    final ActorRef myActor = system.actorOf(Props.create(MyActor.class)); 
    MsgLaunchActor msg = new MsgLaunchActor(idUser); 
    myActor.tell(msg, ActorRef.noSender()); 
    return "job launched"; 
    } 
} 
+0

現在你正在創建一個新的演員系統,每次啓動工作被調用時,這可能不是你正在尋找的。通常情況下,每個JVM應該有一個ActorSystem。演員也一樣。如果你這樣做,你會在每次打電話時創建一個新的演員。所以後續的調用將由不同的演員處理。 – pushy

+0

好的...我明白這是不好的。我需要創建一個在我的EAR中作爲全局變量共享的ActorSystem - 我看不到應該放在哪裏? – seinecle

+0

看起來可能是這樣的? http://stackoverflow.com/questions/16503599/how-do-i-load-and-store-global-variables-in-jersey-glassfish – seinecle