为什么我的Udp.send使用Akka.io总是超时?

时间:2014-02-24 20:59:58

标签: udp playframework-2.0 akka

执行此代码始终会导致超时错误,并且永远不会发送UDP数据包。 为什么呢?

我需要更多地写一些东西,因为stackoverflow不会让我发送问题... ;-),但我认为这个问题非常简单,所有代码都需要。

package controllers;

import akka.actor.ActorRef;
import akka.actor.Props;
import akka.actor.UntypedActor;
import akka.dispatch.Recover;
import akka.io.Tcp;
import akka.io.Udp;
import akka.io.UdpMessage;
import akka.japi.Procedure;
import akka.util.ByteString;

import java.net.InetSocketAddress;
import static akka.pattern.Patterns.ask;
import play.libs.Akka;
import play.mvc.Result;
import play.libs.F.Function;
import play.libs.F.Promise;
import play.mvc.*;

public class Application extends Controller {

    static ActorRef myActor = Akka.system().actorOf(Props.create(Listener.class));

    public static Result index() {

        return async(
                Akka.asPromise(
                //Promise.wrap(
                    ask(
                        myActor,
                        UdpMessage.send(ByteString.fromString("esto es una prueba"), new InetSocketAddress("172.80.1.81", 21001)),
                        1000
                    )
//              .recover(
//                      new Recover<Object>() {
//                          @Override
//                          public Object recover(Throwable t) throws Throwable {
//                              if( t instanceof AskTimeoutException ) {
//                                  Logger.error("Got exception: ", t);
//                                  return internalServerError("Timeout");
//                              }
//                              else {
//                                  Logger.error("Got exception: ", t);
//                                  return internalServerError("Got Exception: " + t.getMessage());
//                              }
//                          }
//                      })
                ).map(
                      new Function<Object,Result>() {
                        public Result apply(Object response) {
                          return ok(response.toString());
                        }
                      }
                    )
                  );

    }


  //http://doc.akka.io/docs/akka/2.2-M2/java/io.html
  //https://gist.github.com/kafecho/5353393
  //how to terminate actor on shutdown http://stackoverflow.com/questions/10875101/how-to-stop-an-akka-thread-on-shutdown
  public static class Listener extends UntypedActor {
    final ActorRef nextActor;

    public Listener() {
        this(null);
    }

    public Listener(ActorRef nextActor) {
        this.nextActor = nextActor;
        // request creation of a bound listen socket
        final ActorRef mgr = Udp.get(getContext().system()).getManager();
        mgr.tell(UdpMessage.bind(getSelf(), new InetSocketAddress("localhost",
                31001)), getSelf());
    }

    @Override
    public void onReceive(Object msg) {
        if (msg instanceof Udp.Bound) {
            final Udp.Bound b = (Udp.Bound) msg;
            getContext().become(ready(getSender()));
        } else
            unhandled(msg);
    }

    private Procedure<Object> ready(final ActorRef socket) {
        return new Procedure<Object>() {
            @Override
            public void apply(Object msg) throws Exception {
                if (msg instanceof Udp.Received) {
                    final Udp.Received r = (Udp.Received) msg;
                    // echo server example: send back the data
                    socket.tell(UdpMessage.send(r.data(), r.sender()),
                            getSelf());
                    // or do some processing and forward it on
                    final Object processed = new Object();//TODO parse data etc., e.g. using PipelineStage
                    if(nextActor!=null){
                        nextActor.tell(processed, getSelf());
                    }
                } else if (msg.equals(UdpMessage.unbind())) {
                    socket.tell(msg, getSelf());
                } else if (msg instanceof Udp.Unbound) {
                    getContext().stop(getSelf());
                } else if (msg instanceof Udp.Send){
                    socket.tell(msg, getSelf());
                } else
                    unhandled(msg);
            }
        };
    }
  }
 }

0 个答案:

没有答案