我有一个用例,我通过 Camel 中的队列(RabbitMQ)接收随机消息(带有 JSON 有效负载),我需要将这些 JSON 有效负载转换为 CSV 格式以存储在文件中。我所拥有的大部分都在工作,但是当我尝试将“generateHeaderColumns=true”添加到我拥有的 POJO 上的 @CsvRecord 注释中时,我会为我最终得到的每个“行”重复列标题。例如,考虑 Camel 中的以下路线:
from("rabbitmq://localhost:5672/testexchange?routingKey=create")
.unmarshal().json(JsonLibrary.Jackson, MyModel.class)
.marshal().bindy(BindyType.Csv, MyModel.class)
.to("file://c:/ftproot?fileName=export.$simple{date:now:MM.dd.yyyy}.csv&fileExist=Append")
以下是 MyModel.class POJO:
import org.apache.camel.dataformat.bindy.annotation.CsvRecord;
import org.apache.camel.dataformat.bindy.annotation.DataField;
@CsvRecord(separator=",", crlf="UNIX", generateHeaderColumns=true)
public class MyClass
{
@DataField(pos = 1, columnName="System ID")
private String identifier;
@DataField(pos = 2, columnName="Full Name")
private String name;
public void setIdentifier(String identifier)
{
this.identifier = identifier;
}
public String getIdentifier()
{
return identifier;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
}
但是,如果我将多个 JSON 有效负载发送到队列,我最终会得到以下结果:
System ID,Full Name
208557,Linus Van Pelt
System ID,Full Name
273053,Charlie Brown
System ID,Full Name
206541,Lucy Van Pelt
System ID,Full Name
279876,Sally Brown
当我查看 Bindy 的代码时,它在做什么是有道理的,因为解组步骤不知道最终结果是一个文件......但是我如何让结果文件具有解组的 CSV 记录,但只有一“行”的列标题?还有其他方法可以做到这一点吗?换句话说,我如何使用队列来接收随机消息,但让文件以这样的方式结束?
System ID,Full Name
208557,Linus Van Pelt
273053,Charlie Brown
206541,Lucy Van Pelt
279876,Sally Brown