Skip to content

Commit 9336098

Browse files
authored
explicit 500 error on exception, clean up some javadsl stuff (#84)
* explicit 500 error on exception, clean up some javadsl stuff * fix race in test * remove unneeded dep
1 parent b3cb730 commit 9336098

File tree

4 files changed

+32
-23
lines changed

4 files changed

+32
-23
lines changed

pom.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@
109109
<protobuf.version>3.4.0</protobuf.version>
110110
<reflections.version>0.9.11</reflections.version>
111111
<scala.version>2.11</scala.version>
112-
<scala.java.compat.version>0.7.0</scala.java.compat.version>
113112
<scala.library.version>2.11.7</scala.library.version>
114113
<slf4j.version>1.7.25</slf4j.version>
115114
<statsd.client.timgroup>3.0.1</statsd.client.timgroup>
@@ -577,11 +576,6 @@
577576
<artifactId>scala-library</artifactId>
578577
<version>${scala.library.version}</version>
579578
</dependency>
580-
<dependency>
581-
<groupId>org.scala-lang.modules</groupId>
582-
<artifactId>scala-java8-compat_${scala.version}</artifactId>
583-
<version>${scala.java.compat.version}</version>
584-
</dependency>
585579
<dependency>
586580
<groupId>io.vertx</groupId>
587581
<artifactId>vertx-core</artifactId>

src/main/java/com/arpnetworking/http/Routes.java

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package com.arpnetworking.http;
1717

1818
import akka.NotUsed;
19+
import akka.actor.ActorNotFound;
1920
import akka.actor.ActorRef;
2021
import akka.actor.ActorSystem;
2122
import akka.actor.PoisonPill;
@@ -31,7 +32,8 @@
3132
import akka.http.javadsl.model.ws.Message;
3233
import akka.japi.JavaPartialFunction;
3334
import akka.japi.function.Function;
34-
import akka.pattern.Patterns;
35+
import akka.japi.pf.PFBuilder;
36+
import akka.pattern.PatternsCS;
3537
import akka.stream.OverflowStrategy;
3638
import akka.stream.javadsl.Flow;
3739
import akka.stream.javadsl.Sink;
@@ -57,8 +59,6 @@
5759
import com.google.common.collect.ImmutableList;
5860
import com.google.common.io.Resources;
5961
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
60-
import scala.compat.java8.FutureConverters;
61-
import scala.concurrent.Future;
6262
import scala.concurrent.duration.FiniteDuration;
6363

6464
import java.util.Objects;
@@ -104,7 +104,11 @@ public Routes(
104104
*/
105105
public Flow<HttpRequest, HttpResponse, NotUsed> flow() {
106106
return Flow.<HttpRequest>create()
107-
.mapAsync(1, this);
107+
.mapAsync(1, this)
108+
.recover(
109+
new PFBuilder<Throwable, HttpResponse>()
110+
.match(Exception.class, e -> HttpResponse.create().withStatus(StatusCodes.INTERNAL_SERVER_ERROR))
111+
.build());
108112
}
109113

110114
@Override
@@ -204,21 +208,32 @@ private CompletionStage<HttpResponse> process(final HttpRequest request) {
204208
}
205209
}
206210

207-
return CompletableFuture.completedFuture(HttpResponse.create().withStatus(404));
211+
return CompletableFuture.completedFuture(HttpResponse.create().withStatus(StatusCodes.NOT_FOUND));
208212
}
209213

210214
private CompletionStage<HttpResponse> dispatchHttpRequest(final HttpRequest request, final String actorName) {
211-
final Future<ActorRef> refFuture = _actorSystem.actorSelection(actorName)
212-
.resolveOne(FiniteDuration.create(1, TimeUnit.SECONDS));
213-
return FutureConverters.toJava(refFuture).thenCompose(
215+
final CompletionStage<ActorRef> refFuture = _actorSystem.actorSelection(actorName)
216+
.resolveOneCS(FiniteDuration.create(1, TimeUnit.SECONDS));
217+
return refFuture.thenCompose(
214218
ref -> {
215219
final CompletableFuture<HttpResponse> response = new CompletableFuture<>();
216220
ref.tell(new RequestReply(request, response), ActorRef.noSender());
217221
return response;
218222
})
219223
// We return 404 here since actor startup is controlled by config and
220224
// the actors may not be running.
221-
.exceptionally(err -> HttpResponse.create().withStatus(404));
225+
.exceptionally(err -> {
226+
final Throwable cause = err.getCause();
227+
if (cause instanceof ActorNotFound) {
228+
return HttpResponse.create().withStatus(StatusCodes.NOT_FOUND);
229+
}
230+
LOGGER.error()
231+
.setMessage("Unhandled exception when looking up actor for http request routing")
232+
.addData("actorName", actorName)
233+
.setThrowable(cause)
234+
.log();
235+
return HttpResponse.create().withStatus(StatusCodes.INTERNAL_SERVER_ERROR);
236+
});
222237
}
223238

224239
private CompletionStage<HttpResponse> getHttpResponseForTelemetry(
@@ -258,11 +273,10 @@ public Object apply(final ActorRef telemetry, final boolean isCheck) throws Exce
258273

259274
@SuppressWarnings("unchecked")
260275
private <T> CompletionStage<T> ask(final String actorPath, final Object request, final T defaultValue) {
261-
return FutureConverters.toJava(
262-
(Future<T>) Patterns.ask(
276+
return (CompletionStage<T>) PatternsCS.ask(
263277
_actorSystem.actorSelection(actorPath),
264278
request,
265-
Timeout.apply(1, TimeUnit.SECONDS)))
279+
Timeout.apply(1, TimeUnit.SECONDS))
266280
.exceptionally(throwable -> defaultValue);
267281
}
268282

src/main/java/com/arpnetworking/metrics/mad/Main.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import akka.http.javadsl.ServerBinding;
2525
import akka.stream.ActorMaterializer;
2626
import akka.stream.Materializer;
27+
import akka.stream.javadsl.Sink;
28+
import akka.stream.javadsl.Source;
2729
import ch.qos.logback.classic.LoggerContext;
2830
import com.arpnetworking.commons.builder.Builder;
2931
import com.arpnetworking.commons.jackson.databind.ObjectMapperFactory;
@@ -225,13 +227,12 @@ private void launchActors(final Injector injector) {
225227
_configuration.getHttpStatusPath(),
226228
supplementalHttpRoutes.build());
227229
final Http http = Http.get(actorSystem);
228-
final akka.stream.javadsl.Source<IncomingConnection, CompletionStage<ServerBinding>> binding = http.bind(
230+
final Source<IncomingConnection, CompletionStage<ServerBinding>> binding = http.bind(
229231
ConnectHttp.toHost(
230232
_configuration.getHttpHost(),
231-
_configuration.getHttpPort()),
232-
materializer);
233+
_configuration.getHttpPort()));
233234
binding.to(
234-
akka.stream.javadsl.Sink.foreach(
235+
Sink.foreach(
235236
connection -> connection.handleWith(routes.flow(), materializer)))
236237
.run(materializer);
237238
}

src/test/java/com/arpnetworking/tsdcore/sinks/PeriodicStatisticsSinkTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public void testRecordProcessedAggregateData() {
104104
statisticsSink.recordAggregateData(TestBeanFactory.createPeriodicData());
105105
statisticsSink.close();
106106
Mockito.verify(_mockMetrics).incrementCounter(COUNTER_NAME, 1);
107-
Mockito.verify(_mockMetrics).close();
107+
Mockito.verify(_mockMetrics, Mockito.atLeastOnce()).close();
108108
}
109109

110110
private PeriodicStatisticsSink.Builder _statisticsSinkBuilder;

0 commit comments

Comments
 (0)