gpt4 book ai didi

java - Camel 按长度而不是按标记拆分 InputStream

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:53:01 24 4
gpt4 key购买 nike

我有一个这样的输入文件

1234AA11BB4321BS33XY...

我想把它拆分成这样的单个消息

Message 1: 1234AA11BB
Message 2: 4321BS33XY

将记录转换为 Java 对象,使用 jaxb 将它们编码为 xml,并在传出消息中聚合大约 1000 条记录。

转换和编码没问题,但我无法拆分上面的字符串。没有定界符,只有长度。每条记录恰好有 10 个字符长。我想知道是否有像

这样的开箱即用的解决方案
split(body().tokenizeBySize(10)).streaming()

由于实际上每条记录由 300 个字符组成,并且一个文件中可能有 500.000 条记录,因此我想拆分一个 InputStream。

在其他示例中,我看到了用于拆分的自定义迭代器,但它们都是基于 token 或 xml 的。

有什么想法吗?

顺便说一句,我们绑定(bind)到 Java 6 和 camel 2.13.4

谢谢尼克

最佳答案

最简单的方法是按空字符串拆分 - .split().tokenize("", 10).streaming() - 这意味着标记器将获取每个字符 - 并将 10 个标记分组(字符)在一起,然后将它们聚合成一个组,例如

@Override
public void configure() throws Exception {
from("file:src/data?delay=3000&noop=true")
.split().tokenize("", 10).streaming()
.aggregate().constant(true) // all messages have the same correlator
.aggregationStrategy(new GroupedMessageAggregationStrategy())
.completionSize(1000)
.completionTimeout(5000) // use a timeout or a predicate
// to know when to stop
.process(new Processor() { // process the aggregate
@Override
public void process(final Exchange e) throws Exception {
final List<Message> aggregatedMessages =
(List<Message>) e.getIn().getBody();
StringBuilder builder = new StringBuilder();
for (Message message : aggregatedMessages) {
builder.append(message.getBody()).append("-");
}
e.getIn().setBody(builder.toString());
}
})
.log("Got ${body}")
.delay(2000);
}

编辑

这是我在流模式下对 100MB 文件延迟 2 秒的内存消耗:

Memory consumption in streaming mode with 2s delay for 100MB file

关于java - Camel 按长度而不是按标记拆分 InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38801712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com