搜索

75.4. 使用 Java DSL

download PDF

下一步实例化与此记录类型关联的 DataFormat 绑定 类,并提供类作为参数。

例如,以下命令使用类 BindyCsvDataFormat (对应于与 CSV 记录类型关联的类),该类配置了 com.acme.model.MyModel.class 来初始化此软件包中配置的模型对象。

DataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class);

75.4.1. 设置区域设置

bindy 支持在 dataformat 中配置区域设置,例如

BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class);

bindy.setLocale("us");

或者,使用平台默认区域设置,然后使用 "default" 作为区域设置名称。

BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class);

bindy.setLocale("default");

75.4.2. Unmarshaling

from("file://inbox")
  .unmarshal(bindy)
  .to("direct:handleOrders");

另外,您可以使用对数据格式的命名引用,然后在 Registry 中定义,例如 Spring XML 文件:

from("file://inbox")
  .unmarshal("myBindyDataFormat")
  .to("direct:handleOrders");

Camel 路由将提取 inbox 目录中的文件,将不marshall CSV 记录到模型对象的集合中,并将 collection
发送到 handleOrders 引用的路由。

返回的集合是 Map 对象的列表。列表中的每个映射都包含 CSV 每行的模型对象。其后面的原因是 每行可以对应多个对象。当您只期望每行返回一个对象时,这可能会混淆。

每个对象都可以使用其类名称来检索。

List<Map<String, Object>> unmarshaledModels = (List<Map<String, Object>>) exchange.getIn().getBody();

int modelCount = 0;
for (Map<String, Object> model : unmarshaledModels) {
  for (String className : model.keySet()) {
     Object obj = model.get(className);
     LOG.info("Count : " + modelCount + ", " + obj.toString());
  }
 modelCount++;
}

LOG.info("Total CSV records received by the csv bean : " + modelCount);

假设您要从此映射中提取单个 Order 对象来处理路由,您可以按如下方式使用 Splitter 和 Processor 的组合:

from("file://inbox")
    .unmarshal(bindy)
    .split(body())
        .process(new Processor() {
            public void process(Exchange exchange) throws Exception {
                Message in = exchange.getIn();
                Map<String, Object> modelMap = (Map<String, Object>) in.getBody();
                in.setBody(modelMap.get(Order.class.getCanonicalName()));
            }
        })
        .to("direct:handleSingleOrder")
    .end();

请注意,Bindy 使用 CHARSET_NAME 属性或 CHARSET_NAME 标头(如 Exchange 接口中定义的 CHARSET_NAME 标头)进行为 unmarshalling 接收的输入流的字符集转换。在某些制作者(如 file-endpoint)中,您可以定义字符集。字符集转换可能已经由这个制作者完成。有时,您需要将此属性或标头从交换中删除,然后再将其发送到 unmarshal。如果您没有删除它,则可能会进行转换两次,这可能会导致不必要的结果。

from("file://inbox?charset=Cp922")
  .removeProperty(Exchange.CHARSET_NAME)
  .unmarshal("myBindyDataFormat")
  .to("direct:handleOrders");

75.4.3. marshaling

要从模型对象集合中生成 CSV 记录,您可以创建以下路由:

from("direct:handleOrders")
   .marshal(bindy)
   .to("file://outbox")
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.