我有一个用例,我通过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的代码时,它有什么意义,因为unmarshal步骤不知道最终结果是文件...但是如何让生成的文件具有CSV记录是否已解组,但只有一行“标题”列?还有其他方法可以做到这一点吗?换句话说,我如何使用队列接收随机消息,但文件最终会像这样结束?
System ID,Full Name
208557,Linus Van Pelt
273053,Charlie Brown
206541,Lucy Van Pelt
279876,Sally Brown