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