Vertx项目中,向EventBus中发送消息,可以用vertx.eventBus().publish() / send()方法。
那么,服务发现中的ServiceDiscovery里的discovery.publish一种MessageSource类型的消息源,它里面的消息发布和consume
与直接用eventbus发布/消费消息有什么不一样呢?
我在一个verticle中发布消息,用这两种方式消费消息,代码如下->
消息发布:
publishMessageRecord("zhihu-day-web", "spider", pubAr -> { if (pubAr.failed()) { LOG.info(" publish failed : error = " + pubAr.cause().getMessage()); } else { LOG.info(" publish success "); } }); vertx.setPeriodic(3000, id -> { // 点对点 vertx.eventBus().send("spider", new JsonObject() .put("timestamp:", System.currentTimeMillis()) .put("id", id)); // 订阅发布 // vertx.eventBus().publish("spider", // new JsonObject() // .put("timestamp:", System.currentTimeMillis()) // .put("id", id)); LOG.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); });
消息消费:
Future<MessageConsumer<JsonObject>> consumerFut = Future.future(); MessageSource.getConsumer(serviceDiscovery, new JsonObject().put("name", "zhihu-day-web"), consumerFut.completer()); consumerFut.setHandler(consumerAr -> { if (consumerAr.failed()) { LOG.info(consumerAr.cause().getMessage()); } else { LOG.info("consume message"); MessageConsumer<JsonObject> messageConsumer = consumerAr.result(); messageConsumer.handler(message -> { LOG.info("received message: " + message.body().encodePrettily()); }); } }); vertx.eventBus().<JsonObject>consumer("spider").handler(msg -> { LOG.info("ContentAnalysisVerticle:" + msg.body().encodePrettily()); });
消息发布时,只能通过vertx.eventBus()发布消息,采用订阅模式时,发现这两种消费方法都触发了消息事件。
而如果采用点对点通信(send())则只有vertx.eventBus().<JsonObject>consumer()方法获取到了事件通知,而上面的方法并没有动作。
也就是说,优先发送到了下面的方法。
还有,MessageSource是带name属性的,获取record也是靠这个name作区分的;
EventBus.consumer的参数是address,针对一个地址,相对的范围更大些。
总结:发布服务之后还是需要eventbus发布消息.