在Glassfish EAR中使用Akka进行多线程处理是否可能/好主意?

时间:2013-08-23 15:39:29

标签: akka

上下文: 这是一个客户服务器应用程序。目前EJB看起来像:

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函数调用我的层次结构的顶级actor? (好吧,肯定是一个菜鸟问题......)

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";
    }
}

1 个答案:

答案 0 :(得分:0)

这确实是一个菜鸟问题。我不知道怎么做,因为在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";
   }
}