如何逐条消息向Kafka发送消息

时间:2020-02-19 14:46:51

标签: apache-kafka vert.x quarkus microprofile smallrye-reactive-messaging

我是反应式编程的新手,我尝试实现一个非常基本的方案。 我想在每次将文件拖放到特定文件夹时向kafka发送消息。 我认为我不太了解基本知识...所以请您能帮我吗?

所以我有几个问题: Smallrye反应式消息传递和Smallrye反应流操作符之间有什么区别?

我有这个简单的代码:

@Outgoing( "my-topic" )
public PublisherBuilder<Message<MessageWrapper>> generate() {
     if(Objects.isNull(currentMessage)){
          //currentMessage is an instance variable which is null when I start the application
          return ReactiveStreams.of(new MessageWrapper()).map(Message::of);
     }
     else {
          //currentMessage has been correctly set with the file information
          LOGGER.info(currentMessage);
          return ReactiveStreams.of(currentMessage).map(Message::of);
     }
}

当代码进入if语句时,一切正常,我得到了我的对象的JSON序列化将为空值的信息。但是我不明白为什么当我的代码转到else语句时,主题什么都没有?似乎if语句的.of指令破坏了数据流或类似的内容...

如何保持连续的流对新删除的文件进行“反应”? (或其他类似HTTP GET请求之类的事件)...

例如,如果我不返回PublisherBuilder的实例而是返回一个Integer,那么我的kafka主题将被非常庞大的Integer值流填充。这就是为什么示例在发送消息时使用一些时间间隔的原因...

我应该使用一些CompletationStage还是CompletableFuture? RxJAva2?使用哪个库有点令人困惑(vertx,smallrye,rxjava2,microprofile等)

之间的区别是什么?

  • ReactiveStreams.fromCompletionStage
  • ReactiveStreams.fromProcessor
  • ReactiveStreams.fromPublisher
  • ReactiveStreams.fromSubscriber

在哪种情况下使用哪个?

非常感谢您!

1 个答案:

答案 0 :(得分:0)

让我们先从小号反应消息和小号反应流操作符之间的区别开始:小号反应流操作符与小号反应消息发送方相同,但是它对{{3 }}。由于大多数响应消息提供程序在后台使用Vert.x,因此它将以事件循环样式处理您的消息,这意味着它将在单独的线程中运行。有时,您需要将一些ctx从基础线程传播到新线程中(例如:填充CDI和Tx上下文以执行某些JPA实体管理器逻辑)。 ctx传播在这里有帮助。

用于方法签名。您可以查看MicroProfile-context-propagation第3,4和5节的官方文档。每个文档都有不同的用例。您要使用哪种口味取决于您。

什么时候使用什么?如果您不在响应式上下文中运行,则可以使用以下内容发送消息。

@注入 @Channel(“我的频道”) 发射极发射器;

对于消息使用,您可以使用如下方法签名:

@Incoming(“频道2”) 公共CompletionStage doSomething(消息anEvent)

@Incoming(“频道2”) 公共无效doSomething(String anEvent)

希望有帮助。