Verticles - Context对象

优质
小牛编辑
126浏览
2023-12-01

当Vert.x提供一个事件的处理程序或调用Verticle的开始或停止的方法,执行与Context相关联。一般Context是event-loop context 绑定特定的事件循环线程。因此,对于这方面的执行总是发生在该完全相同的事件循环线程。在worker verticles和运行内嵌阻止代码worker context的情况下将使用一个线程从worker线程池的执行关联。

若要获得context,请使用getOrCreateContext方法:

  1. Context context = vertx.getOrCreateContext();

如果当前线程具有一个与它相关联的context,它重复使用context对象。如果不创建新实例的context。您可以测试您取得的context的类型:

  1. Context context = vertx.getOrCreateContext();
  2. if (context.isEventLoopContext()) {
  3. System.out.println("Context attached to Event Loop");
  4. } else if (context.isWorkerContext()) {
  5. System.out.println("Context attached to Worker Thread");
  6. } else if (context.isMultiThreadedWorkerContext()) {
  7. System.out.println("Context attached to Worker Thread - multi threaded worker");
  8. } else if (! Context.isOnVertxThread()) {
  9. System.out.println("Context not attached to a thread managed by vert.x");
  10. }

当您取得context对象时,您可以以异步方式在此context中运行代码。换句话说,您提交相同的context,但后来将最终运行任务:

  1. vertx.getOrCreateContext().runOnContext( (v) -> {
  2. System.out.println("This will be executed asynchronously in the same context");
  3. });

当几个处理程序在相同的context中运行时,他们可能想要分享数据。context对象提供方法来存储和获取在context中共享的数据。例如,它可以让你通过一些行动runOnContext运行数据:

  1. final Context context = vertx.getOrCreateContext();
  2. context.put("data", "hello");
  3. context.runOnContext((v) -> {
  4. String hello = context.get("data");
  5. });

context对象还可让您使用的config方法访问verticle配置。