272.5. 从 Camel 获取数据

要订阅来自 Camel 路由的数据流,交换应重定向到指定的流,如下代码片段:

from("timer:clock")
.setBody().header(Exchange.TIMER_COUNTER)
.to("reactive-streams:numbers");

也可以使用 XML DSL 编写路由。

在示例中,未绑定的数字流与名称 编号 相关联。使用 CamelReactiveStreams 实用程序类可以访问该流。

CamelReactiveStreamsService camel = CamelReactiveStreams.get(context);

// Getting a stream of exchanges
Publisher<Exchange> exchanges = camel.fromStream("numbers");

// Getting a stream of Integers (using Camel standard conversion system)
Publisher<Integer> numbers = camel.fromStream("numbers", Integer.class);

该流可轻松与任何 reactive stream 兼容库一起使用。以下是如何将它与 RxJava 2 搭配使用的示例(尽管任何被动框架可用于处理事件)。

Flowable.fromPublisher(integers)
    .doOnNext(System.out::println)
    .subscribe();

示例将 Camel 生成的所有数字打印到 System.out 中。

272.5.1. 使用直接 API 从 Camel 获取数据

对于短的 Camel 路由,而对于更喜欢使用被动框架的功能结构定义整个处理流的用户(无需使用 Camel DSL),也可以使用 Camel URI 定义流。

CamelReactiveStreamsService camel = CamelReactiveStreams.get(context);

// Get a stream from all the files in a directory
Publisher<String> files = camel.from("file:folder", String.class);

// Use the stream in RxJava2
Flowable.fromPublisher(files)
    .doOnNext(System.out::println)
    .subscribe();