0

上下文:这是一个客户端服务器应用程序。目前 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";
    }
}

这项工作正在启动其他几个线程。

在这一点上,我想增加客户中断工作的可能性。从“外部”中断线程是一件非常肮脏的事情(为此,我必须为每个操作添加更多调用到数据库),这促使我切换到 Akka 进行多线程处理。

问题:我不确定如何/是否可以将 Akka 逻辑与上述 EJB 的代码合并。如何从我的 launchJob 函数中调用我的层次结构的最高角色?(好吧,当然是一个菜鸟问题......)

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

1 回答 1

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";
   }
}
于 2013-08-27T06:34:29.597 回答