我已经在使用Java的Akka框架中实现了一个应用程序。我有一个主角通过使用'Ask'方法并在60秒后超时来调用子角色,一旦从主角接收消息,工作人员调用另一个Java类方法。Subactor(worker)仍然在Java Akka的主演员超时之后工作
现在的问题是,虽然我的主演员在60秒后超时,但工作人员仍然可以与java类方法进行交谈,然后该方法执行的操作不是必需的,因为主要参与者无法接收由于超时而由子角色返回的响应。
是否有反正我可以杀死工人或阻止它进一步处理,如果我的主要演员超时? 我检查了RecieveTimeOut()
,context.stop()
和poisonpill等方法,但仍然没有用。
感谢您的支持
下面的代码
public class MainActor extends UntypedActor {
ActorRef subActorRef;
final Timeout timeout = new Timeout(Duration.create(60, TimeUnit.SECONDS));
@Override
public void preStart() {
subActorRef = getContext().actorOf(
SpringExtProvider.get(actorSystem).props(
"SubActor"), "subActor");
}
@Override
public void onReceive(Object message) throws Exception {
if (message instanceof BusinessRequestVO) {
BusinessRequestVO requestVo = (BusinessRequestVO) message;
ArrayList<Future<Object>> responseFutures = new ArrayList<Future<Object>>();
// This part of code timeout after 60seconds
responseFutures.add(ask(subActorRef,requestVo, timeout));
}
}
}
SubActor类
public class SubActor extends UntypedActor {
@Resource
@Inject
ServiceAdapter serviceAdapter;
@Override
public void onReceive(Object message) throws Exception {
try{
if (message instanceof BusinessRequestVO) {
BusinessRequestVO requestVo = (BusinessRequestVO)message
// There is no time out here so it waits synchronously
// though Main actor timeouts
ServiceResponse response = serviceAdapter.getWorkOrder(requestVo);
getSender().tell(response, ActorRef.noSender());
} catch (Exception e) {
getSender().tell(new akka.actor.Status.Failure(e), getSelf());
throw e;
}
}
}
}
适配器类别
public class ServiceAdapterImpl implements ServiceAdapter{
public ServiceResponse getWorkOrder(BusinessRequestVO request){
// Some code here along with webservice calls
}
}
发布您的代码。 – Ryan 2014-12-05 23:35:00
'..从进一步处理..停顿',你的意思是你想中断'.getWorkOrder()'呼叫在飞行中? – tariksbl 2014-12-07 14:59:01
是的我想打断.getWorkOrder(),如果家长演员超时 – 2014-12-08 05:51:58