当前位置: 首页 > 知识库问答 >
问题:

Vertx事件总线拦截器阻止请求调用

相诚
2023-03-14

我试图通过事件总线发送数据,当从客户端接到呼叫并响应回客户端。

一切正常,直到我在事件总线上添加拦截器...

以下是代码:-

public class TestVerticle extends AbstractVerticle {

    @Override
    public void start(Promise<Void> promise) {

        Router router = Router.router(vertx);

        vertx.exceptionHandler(globalExceptionHandler -> {
            System.out.println("Exception not handled in application  : " + globalExceptionHandler.getCause());
        });

        vertx.eventBus().consumer("test", handler -> {
            System.out.println("Message receive form event bus : " + handler.body().toString());
            handler.reply(handler.body().toString());
        });

        router.get().handler(this::rootHandler);
        vertx.createHttpServer().requestHandler(router).listen(8080, resultHandler -> {
            if (resultHandler.succeeded()) {
                promise.complete();
            } else {
                promise.fail(resultHandler.cause());
            }
        });

        vertx.eventBus().addOutboundInterceptor(handler -> {
            System.out.println("Outbound data : "+handler.body().toString());
        });

//        vertx.eventBus().addInboundInterceptor(handler -> {
//            System.out.println("Inbound data : " + handler.body().toString());
//        });
    }

    private void rootHandler(RoutingContext routingContext) {
        JsonObject msg = new JsonObject().put("path", routingContext.request().path());
        vertx.eventBus().request("test","Hello from Application",reply -> this.replyHandler(routingContext,reply));
    }

    private void replyHandler(RoutingContext ctx, AsyncResult<Message<Object>> reply) {
        HttpServerResponse response = ctx.response()
                .putHeader("Content-Type", "application/json");
        System.out.println("Reply from event bus : " +reply.result().body().toString());
        if (reply.succeeded()) {
            response.setStatusCode(200)
                    .setStatusMessage("OK")
                    .end(reply.result().body().toString());
        } else {
            response.setStatusCode(500)
                    .setStatusMessage("Server Error")
                    .end(new JsonObject().put("error", reply.cause().getLocalizedMessage()).encodePrettily());
        }
    }

    public static void main(String[] args) {
        Vertx.vertx().deployVerticle(new TestVerticle(), deploymenHandler -> {
            if (deploymenHandler.succeeded()) {
                System.out.println("verticle deplyed");
            } else {
                System.out.println("failed");
            }
        });

    }

    @Override
    public void stop(Promise<Void> promise) {
        System.out.println("Exiting verticle");
        promise.complete()
    }
}

还有一个疑问是,当我从IDE停止应用程序时,不会调用stop方法,但是如果我从另一个正常工作的垂直程序中取消部署这个垂直程序。

共有1个答案

陶鹏
2023-03-14

当您使用eventbus拦截器时,必须调用处理程序中的next()方法,否则您会被卡住。

vertx.eventBus().addOutboundInterceptor(handler -> {
  System.out.println("Outbound data : "+handler.body().toString());
  handler.next();
});

vertx.eventBus().addInboundInterceptor(handler -> {
  System.out.println("Inbound data : "+handler.body().toString());
  handler.next();
});
 类似资料:
  • 一、拦截请求 mitmproxy的强大功能是拦截请求。拦截的请求将暂停,以便用户可以在将请求发送到服务器之前修改(或丢弃)该请求。mitmproxy的set intercept命令配置拦截。i默认情况下,该命令绑定到快捷方式。 通常不希望拦截所有请求,因为它会不断中断您的浏览。因此,mitmproxy希望将流过滤器表达式作为set intercept选择性拦截请求的第一个参数。在下面的教程中,我们

  • 配置拦截器 declarations: [ AppComponent ], HttpClientModule ], providers: [ [ { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true } ] bootstrap:

  • 在 imi 中更加推荐使用 AOP 来拦截请求。 不要忘记把 Aspect 类加入 beanScan! Demo <?php namespace ImiApp\ApiServer\Aop; use Imi\RequestContext; use Imi\Aop\Annotation\Around; use Imi\Aop\Annotation\Aspect; use Imi\Aop\Annota

  • 问题内容: 我有一个注册为HID设备的RFID USB设备(一个或多个USB键盘)。 我正在寻找一种捕获此输入的方法,并在它击中普通键盘事件处理程序之前对其进行阻止/过滤(并将10位RFID代码输出到控制台)。 我当然必须专门捕获该设备,而不必留下真正的键盘输入(或传递它)。 我最初的想法是在UDEV中阻止该设备(因此usbhid / event / kbd内核模块未绑定到该设备)并为该设备编写我

  • 我是一些API的客户端,需要在每个请求中发送令牌,为了获得这个令牌,我需要访问发送用户名和密码,并考虑使用请求拦截器来解决这个问题。但是每个请求的用户名和密码是不同的,有一些方法可以在假请求拦截器中使用动态值,或者在每次API调用之前,我需要使用普通的假客户端调用? 我有一个来访问此令牌API 我不确定在构建假客户端以设置每个请求的用户时如何添加这个拦截器

  • Spring的处理器映射机制包含了处理器拦截器。拦截器在你需要为特定类型的请求应用一些功能时可能很有用,比如,检查用户身份等。 处理器映射处理过程配置的拦截器,必须实现 org.springframework.web.servlet包下的 HandlerInterceptor接口。这个接口定义了三个方法: preHandle(..),它在处理器实际执行 之前 会被执行; postHandle(..