@Override public void encodeToWire(Buffer buffer, ReplyException body) { buffer.appendByte((byte)body.failureType().toInt()); buffer.appendInt(body.failureCode()); if (body.getMessage() == null) { buffer.appendByte((byte)0); } else { buffer.appendByte((byte)1); byte[] encoded = body.getMessage().getBytes(CharsetUtil.UTF_8); buffer.appendInt(encoded.length); buffer.appendBytes(encoded); } }
public void sendAsyncResultFailure(ReplyFailure failure, String msg) { unregister(); asyncResultHandler.handle(Future.failedFuture(new ReplyException(failure, msg))); }
@Test public void testSendWithTimeoutNoReply() { String str = TestUtils.randomUnicodeString(1000); eb.<String>consumer(ADDRESS1).handler((Message<String> msg) -> { assertEquals(str, msg.body()); }); long timeout = 1000; long start = System.currentTimeMillis(); eb.send(ADDRESS1, str, new DeliveryOptions().setSendTimeout(timeout), (AsyncResult<Message<Integer>> ar) -> { long now = System.currentTimeMillis(); assertFalse(ar.succeeded()); Throwable cause = ar.cause(); assertTrue(cause instanceof ReplyException); ReplyException re = (ReplyException) cause; assertEquals(-1, re.failureCode()); assertEquals(ReplyFailure.TIMEOUT, re.failureType()); assertTrue(now - start >= timeout); testComplete(); }); await(); }
/** * @param message example: {format: "png", categories: [shenghuo, buyi]} */ private void getGushiciFromRedis(Message<JsonObject> message) { JsonArray realCategory = new JsonArray() .add("png".equals(message.body().getString("format")) ? "img" : "json") .addAll(message.body().getJsonArray("categories")); checkAndGetKey(realCategory) .compose(key -> Future.<String>future(s -> redisClient.srandmember(key, s))) // 从 set 随机返回一个对象 .setHandler(res -> { if (res.succeeded()) { message.reply(res.result()); } else { if (res.cause() instanceof ReplyException) { ReplyException exception = (ReplyException) res.cause(); message.fail(exception.failureCode(), exception.getMessage()); } message.fail(500, res.cause().getMessage()); } }); }
protected <T> Handler<Message<T>> convertHandler(Handler<AsyncResult<Message<T>>> handler) { return reply -> { Future<Message<T>> result; if (reply.body() instanceof ReplyException) { // This is kind of clunky - but hey-ho ReplyException exception = (ReplyException) reply.body(); if (metrics != null) { metrics.replyFailure(reply.address(), exception.failureType()); } result = Future.failedFuture(exception); } else { result = Future.succeededFuture(reply); } handler.handle(result); }; }
@Test public void testFailingMethod() { proxy.failingMethod(onFailure(t -> { assertTrue(t instanceof ReplyException); ReplyException re = (ReplyException) t; assertEquals(ReplyFailure.RECIPIENT_FAILURE, re.failureType()); assertEquals("wibble", re.getMessage()); testComplete(); })); await(); }
private void returnError(RoutingContext routingContext) { JsonObject result = new JsonObject(); int errorCode = routingContext.statusCode() > 0 ? routingContext.statusCode() : 500; // 不懂 Vert.x 为什么 EventBus 和 Web 是两套异常系统 if (routingContext.failure() instanceof ReplyException) { errorCode = ((ReplyException) routingContext.failure()).failureCode(); } result.put("error-code", errorCode); if (routingContext.failure() != null) { result.put("reason", routingContext.failure().getMessage()); } setCommonHeader(routingContext.response() .setStatusCode(errorCode) .putHeader("content-type", "application/json; charset=utf-8")) .end(result.encodePrettily()); }
@Override public String toString() { String message = getMessage(); return "(" + failureType + "," + failureCode + ") " + (message != null ? message : ""); }
@Test public void testSendWithTimeoutReplyAfterTimeout() { String str = TestUtils.randomUnicodeString(1000); long timeout = 1000; eb.<String>consumer(ADDRESS1).handler((Message<String> msg) -> { assertEquals(str, msg.body()); vertx.setTimer((int)(timeout * 1.5), id -> { msg.reply("too late!"); }); }); eb.send(ADDRESS1, str, new DeliveryOptions().setSendTimeout(timeout), (AsyncResult<Message<Integer>> ar) -> { assertFalse(ar.succeeded()); Throwable cause = ar.cause(); assertTrue(cause instanceof ReplyException); ReplyException re = (ReplyException) cause; assertEquals(-1, re.failureCode()); assertEquals(ReplyFailure.TIMEOUT, re.failureType()); testComplete(); }); await(); }
private static void manageError( ReplyException cause, HttpServerResponse response) { if(isExistingHttStatusCode(cause.failureCode())) { response.setStatusCode(cause.failureCode()); if(StringUtils.isNotEmpty(cause.getMessage())) { response.setStatusMessage(cause.getMessage()); } } else { response.setStatusCode(HttpResponseStatus.INTERNAL_SERVER_ERROR.code()); } response.end(); }
@Override public void start() throws Exception { Context ctx = getVertx().getOrCreateContext(); vertices[0].eventBus().send("blah", "blah", ar -> { assertTrue(ar.failed()); if (ar.cause() instanceof ReplyException) { ReplyException cause = (ReplyException) ar.cause(); assertSame(ReplyFailure.NO_HANDLERS, cause.failureType()); } else { fail(ar.cause()); } assertSame(ctx, getVertx().getOrCreateContext()); complete(); }); } }, new DeploymentOptions().setWorker(true));
/** * Convert a throwable to an HTTP status code * @param t the throwable to convert * @return the HTTP status code */ public static int throwableToCode(Throwable t) { if (t instanceof ReplyException) { return ((ReplyException)t).failureCode(); } else if (t instanceof IllegalArgumentException) { return 400; } else if (t instanceof FileNotFoundException) { return 404; } else if (t instanceof HttpException) { return ((HttpException)t).getStatusCode(); } else if (t instanceof HTTPException) { return ((HTTPException)t).getStatusCode(); } return 500; }
@Override public String toString() { String message = getMessage(); return "(" + failureType + "," + failureCode + ") " + (message != null ? message : ""); }
@Test public void testSendWithTimeoutNoHandlers() { String str = TestUtils.randomUnicodeString(1000); long timeout = 1000; eb.send(ADDRESS1, str, new DeliveryOptions().setSendTimeout(timeout), (AsyncResult<Message<Integer>> ar) -> { assertFalse(ar.succeeded()); Throwable cause = ar.cause(); assertTrue(cause instanceof ReplyException); ReplyException re = (ReplyException) cause; assertEquals(-1, re.failureCode()); assertEquals(ReplyFailure.NO_HANDLERS, re.failureType()); assertEquals("No handlers for address " + ADDRESS1, re.getMessage()); testComplete(); }); await(); }
@Test public void testSendReplyWithTimeout() { String str = TestUtils.randomUnicodeString(1000); String reply = TestUtils.randomUnicodeString(1000); eb.<String>consumer(ADDRESS1).handler((Message<String> msg) -> { assertEquals(str, msg.body()); long start = System.currentTimeMillis(); long timeout = 1000; msg.reply(reply, new DeliveryOptions().setSendTimeout(timeout), ar -> { long now = System.currentTimeMillis(); assertFalse(ar.succeeded()); Throwable cause = ar.cause(); assertTrue(cause instanceof ReplyException); ReplyException re = (ReplyException) cause; assertEquals(-1, re.failureCode()); assertEquals(ReplyFailure.TIMEOUT, re.failureType()); assertTrue(now - start >= timeout); testComplete(); }); }); eb.send(ADDRESS1, str, onSuccess((Message<String>msg) -> { assertEquals(reply, msg.body()); // Now don't reply })); await(); }
private Handler<Message<JsonObject>> configureHandler(List<Function<Message<JsonObject>, Future<Message<JsonObject>>>> interceptors) { Handler<Message<JsonObject>> handler = this; if (interceptors != null) { for (Function<Message<JsonObject>, Future<Message<JsonObject>>> interceptor : interceptors) { Handler<Message<JsonObject>> prev = handler; handler = msg -> { Future<Message<JsonObject>> fut = interceptor.apply(msg); fut.setHandler(ar -> { if (ar.succeeded()) { prev.handle(msg); } else { ReplyException exception = (ReplyException) ar.cause(); msg.fail(exception.failureCode(), exception.getMessage()); } }); }; } } return handler; }
private void sendMsg() { if (!unregistered.get()) { getVertx().eventBus().send("whatever", "marseille"); vertx.setTimer(1, id -> { sendMsg(); }); } else { getVertx().eventBus().send("whatever", "marseille", ar -> { Throwable cause = ar.cause(); assertThat(cause, instanceOf(ReplyException.class)); ReplyException replyException = (ReplyException) cause; assertEquals(ReplyFailure.NO_HANDLERS, replyException.failureType()); testComplete(); }); } } };
private void checkResult(AsyncResult<String> res) { assertTrue(res.failed()); ReplyException t = (ReplyException) res.cause(); assertEquals(401, t.failureCode()); testComplete(); } }
@Override public void fail(int failureCode, String message) { if (replyAddress != null) { sendReply(bus.createMessage(true, replyAddress, null, new ReplyException(ReplyFailure.RECIPIENT_FAILURE, failureCode, message), null), null, null); } }
@Test public void testSendWithTimeoutRecipientFailure() { String str = TestUtils.randomUnicodeString(1000); String failureMsg = TestUtils.randomUnicodeString(1000); int failureCode = 123; eb.<String>consumer(ADDRESS1).handler((Message<String> msg) -> { assertEquals(str, msg.body()); msg.fail(failureCode, failureMsg); }); long timeout = 1000; eb.send(ADDRESS1, str, new DeliveryOptions().setSendTimeout(timeout), (AsyncResult<Message<Integer>> ar) -> { assertFalse(ar.succeeded()); Throwable cause = ar.cause(); assertTrue(cause instanceof ReplyException); ReplyException re = (ReplyException) cause; assertEquals(failureCode, re.failureCode()); assertEquals(failureMsg, re.getMessage()); assertEquals(ReplyFailure.RECIPIENT_FAILURE, re.failureType()); testComplete(); }); await(); }