I am currently using playframework for my Http stuff and want to go to 
Akka-HTTP for the new project. However from my reading and playing with 
Akka-Http it seems that I have to stuff a ton of logic into the routes and 
I don't like that. Consider the following from the docs: 

public class JacksonExampleTest extends AllDirectives {
  private Route createRoute() {
    return route(
      get(() ->
        pathPrefix("item", () ->
          path(longSegment(), (Long id) -> {
            final CompletionStage<Optional<Item>> futureMaybeItem = 
fetchItem(id);
            return onSuccess(() -> futureMaybeItem, maybeItem ->
              maybeItem.map(item -> completeOK(item, Jackson.marshaller()))
                .orElseGet(() -> complete(StatusCodes.NOT_FOUND, "Not Found"
))
            );
          }))),
      post(() ->
        path("create-order", () ->
          entity(Jackson.unmarshaller(Order.class), order -> {
            CompletionStage<Done> futureSaved = saveOrder(order);
            return onSuccess(() -> futureSaved, done ->
              complete("order created")
            );
          })))
    );
  }
}

This is fine but I think of the size of API we are building and it 
certainly WONT be fine then. There is way too much logic in the routes 
file. I would like to keep that logic in the PRA and not the routes class 
but I cant figure out how to do  it. This is how I do it in playframework 
currently.

routes.conf
POST        /refund                                         controllers.
Application.refund


public class Application extends AbstractController {
    @UserAware
    public CompletionStage<Result> refund() {
        return RefundActor.invoke(getCurrentUserSession(), request());
    }
}

public class RefundActor extends UntypedActor {
    private final CompletableFuture<Result> future;
    private final UserSession userSession;
    private final RefundJson form;
    private RefundResultsInfo results;

    public RefundActor(final CompletableFuture<Result> future, final 
UserSession userSession, final RefundJson form) {
        super(future);
        UserActivityActor.shardRegion().tell(new UserActivityActor.
RefundBetSlip(userSession.getUserId(),
                userSession, form.getBetSlipId(), false, form.
getSubmissionTime()), getSelf());
    }

    public static CompletableFuture<Result> invoke(final UserSession 
userSession, final Http.Request request) {
        return withValidJson(RefundActor.class, request, RefundJson.class, 
form -> {
            final CompletableFuture<Result> future = new CompletableFuture
<>();
            Ruckus.getActorSystem().actorOf(Props.create(RefundActor.class, 
future, userSession, form));
            return future;
        });
    }

    @Trace(dispatcher = true)
    @Override
    public void onReceive(final Object message) throws Exception {
        try {
            if (message instanceof RefundResultsInfo) {
                final String json = JsonUtilities.asJsonString(new 
RefundResultsJson(results));
                final Result result = Results.ok(json).as("application/json; 
charset=utf-8")
                        .withHeader(CACHE_CONTROL, "public, max-age=" + 0);
                future.complete(result);
                getContext().stop(getSelf());
            } else if (message instanceof ReceiveTimeout) {
                handleReceiveTimeout();
            } else {
                unhandled(message);
            }
        } catch (final Exception ex) {
            handleException(ex);
        }
    }
}


As you can see, the Play Route calls the PRA using a static method to get a 
future (a home-cooked ASK pattern) and then returns the info back to the 
user by rendering the result in the actor body. I have had to sanitize this 
from proprietary code so excuse me if something looks odd, there are 
actually a lot of tools in the real base class and the re is a ton of logic 
being performed. 

I would like to do something similar with Akka-Http but if I could keep it 
in the actor space that would be even better. I would like to define the 
route in the PRA as well so that all the API class has to do is enumerate 
the routes. My initial efforts have failed because to get to the route DSL 
you have to extend AllDirectives and that doesn't work if you want to 
extend UntypedActor. Also I want the complete ad other methods available 
inside the PRA and preferably in the receive loop so that I don't have 
create intermediate return types just to send back to the route. 

Thanks in advance. 

Has anyone tried anything similar? Are there best practices? 

-- 
>>>>>>>>>>      Read the docs: http://akka.io/docs/
>>>>>>>>>>      Check the FAQ: 
>>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>>      Search the archives: https://groups.google.com/group/akka-user
--- 
You received this message because you are subscribed to the Google Groups "Akka 
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to akka-user+unsubscr...@googlegroups.com.
To post to this group, send email to akka-user@googlegroups.com.
Visit this group at https://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to