Skip to content
This repository was archived by the owner on Apr 23, 2019. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 0 additions & 26 deletions app/Filters.java

This file was deleted.

8 changes: 2 additions & 6 deletions app/v1/post/JPAPostRepository.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package v1.post;

import net.jodah.failsafe.*;
import net.jodah.failsafe.function.CheckedFunction;
import net.jodah.failsafe.function.CheckedRunnable;
import net.jodah.failsafe.function.ContextualCallable;
import net.jodah.failsafe.function.Predicate;
import net.jodah.failsafe.CircuitBreaker;
import net.jodah.failsafe.Failsafe;
import play.db.jpa.JPAApi;

import javax.inject.Inject;
Expand All @@ -13,7 +10,6 @@
import javax.persistence.TypedQuery;
import java.sql.SQLException;
import java.util.Optional;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionStage;
import java.util.function.Function;
import java.util.stream.Stream;
Expand Down
29 changes: 14 additions & 15 deletions app/v1/post/PostAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import com.codahale.metrics.Meter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.Timer;

import net.jodah.failsafe.FailsafeException;
import play.Logger;
import play.libs.concurrent.Futures;
Expand All @@ -15,11 +14,7 @@

import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
import java.util.concurrent.CompletionStage;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.concurrent.*;

import static com.codahale.metrics.MetricRegistry.name;
import static play.mvc.Http.Status.GATEWAY_TIMEOUT;
Expand All @@ -32,11 +27,13 @@ public class PostAction extends play.mvc.Action.Simple {
private final Meter requestsMeter;
private final Timer responsesTimer;
private final HttpExecutionContext ec;
private final Futures futures;

@Singleton
@Inject
public PostAction(MetricRegistry metrics, HttpExecutionContext ec, ActorSystem actorSystem) {
public PostAction(MetricRegistry metrics, HttpExecutionContext ec, ActorSystem actorSystem, Futures futures) {
this.ec = ec;
this.futures = futures;
this.requestsMeter = metrics.meter("requestsMeter");
this.responsesTimer = metrics.timer(name(PostAction.class, "responsesTimer"));
}
Expand All @@ -45,10 +42,19 @@ public CompletionStage<Result> call(Http.Context ctx) {
if (logger.isTraceEnabled()) {
logger.trace("call: ctx = " + ctx);
}

requestsMeter.mark();
if (ctx.request().accepts("application/json")) {
final Timer.Context time = responsesTimer.time();
return timeout(doCall(ctx), 1L, TimeUnit.SECONDS).whenComplete((r, e) -> time.close());
return futures.timeout(doCall(ctx), 1L, TimeUnit.SECONDS).handle((r, e) -> {
time.close();
if (e instanceof TimeoutException) {
logger.info("Timeout after 1 second", e);
return Results.status(GATEWAY_TIMEOUT, views.html.timeout.render());
} else {
return r;
}
});
} else {
return CompletableFuture.completedFuture(
status(NOT_ACCEPTABLE, "We only accept application/json")
Expand Down Expand Up @@ -78,11 +84,4 @@ private CompletionStage<Result> doCall(Http.Context ctx) {
}, ec.current());
}

private CompletionStage<Result> timeout(final CompletionStage<Result> stage, final long delay, final TimeUnit unit) {
final CompletionStage<Result> timeoutFuture = Futures.timeout(delay, unit).handle((v, e) -> {
return Results.status(GATEWAY_TIMEOUT, views.html.timeout.render());
});
return stage.applyToEither(timeoutFuture, Function.identity());
}

}
25 changes: 3 additions & 22 deletions app/v1/post/PostExecutionContext.java
Original file line number Diff line number Diff line change
@@ -1,36 +1,17 @@
package v1.post;

import akka.actor.ActorSystem;
import scala.concurrent.ExecutionContext;
import scala.concurrent.ExecutionContextExecutor;
import play.libs.concurrent.CustomExecutionContext;

import javax.inject.Inject;

/**
* Custom execution context wired to "post.repository" thread pool
*/
public class PostExecutionContext implements ExecutionContextExecutor {
private final ExecutionContext executionContext;

private static final String name = "post.repository";
public class PostExecutionContext extends CustomExecutionContext {

@Inject
public PostExecutionContext(ActorSystem actorSystem) {
this.executionContext = actorSystem.dispatchers().lookup(name);
}

@Override
public ExecutionContext prepare() {
return executionContext.prepare();
}

@Override
public void execute(Runnable command) {
executionContext.execute(command);
}

@Override
public void reportFailure(Throwable cause) {
executionContext.reportFailure(cause);
super(actorSystem, "post.repository");
}
}
1 change: 0 additions & 1 deletion app/v1/post/PostResourceHandler.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package v1.post;

import com.fasterxml.jackson.databind.JsonNode;
import com.palominolabs.http.url.UrlBuilder;
import play.libs.concurrent.HttpExecutionContext;
import play.mvc.Http;
Expand Down
2 changes: 1 addition & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ lazy val root = (project in file(".")).enablePlugins(PlayJava, GatlingPlugin).co
scalaSource in GatlingTest := baseDirectory.value / "/gatling/simulation"
)

scalaVersion := "2.12.2"
scalaVersion in ThisBuild := "2.11.11"

libraryDependencies += guice
libraryDependencies += javaJpa
Expand Down
23 changes: 10 additions & 13 deletions conf/application.conf
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
# This is the main configuration file for the application.
# https://www.playframework.com/documentation/latest/ConfigFile

db {
default.driver = org.h2.Driver
default.url = "jdbc:h2:mem:play"

# Provided for JPA access
default.jndiName=DefaultDS
}

# Point JPA at our database configuration
jpa.default=defaultPersistenceUnit
Expand All @@ -16,12 +9,16 @@ jpa.default=defaultPersistenceUnit
# See https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing
fixedConnectionPool = 9

# Set Hikari to fixed size
play.db {
prototype {
hikaricp.minimumIdle = ${fixedConnectionPool}
hikaricp.maximumPoolSize = ${fixedConnectionPool}
}
db.default {
driver = org.h2.Driver
url = "jdbc:h2:mem:play"

# Provided for JPA access
jndiName=DefaultDS

# Set Hikari to fixed size
hikaricp.minimumIdle = ${fixedConnectionPool}
hikaricp.maximumPoolSize = ${fixedConnectionPool}
}

# disable the built in filters
Expand Down
2 changes: 1 addition & 1 deletion project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// The Play plugin
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.0-M4")
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.0-M5")

// Load testing tool:
// http://gatling.io/docs/2.2.2/extensions/sbt_plugin.html
Expand Down
1 change: 0 additions & 1 deletion test/it/IntegrationTest.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package it;

import com.fasterxml.jackson.databind.JsonNode;
import com.google.inject.AbstractModule;
import org.junit.Test;
import play.Application;
import play.inject.guice.GuiceApplicationBuilder;
Expand Down