【问题标题】:Converting CSV file to JSON and send it to ActiveMQ queue将 CSV 文件转换为 JSON 并将其发送到 ActiveMQ 队列
【发布时间】:2020-03-24 05:31:50
【问题描述】:

我的目标是读取一个 CSV 文件,将其转换为 JSON,并将生成的 JSON 一个一个发送到 ActiveMQ 队列。我的代码如下:

final BindyCsvDataFormat bindy=new BindyCsvDataFormat(camelproject.EquityFeeds.class);
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        CamelContext _ctx = new DefaultCamelContext(); 
        _ctx.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
        _ctx.addRoutes(new RouteBuilder() {

            public void configure() throws Exception {
                from("file:src/main/resources?fileName=data-sample.csv")
                .unmarshal(bindy)
                .marshal()
                .json(JsonLibrary.Jackson).log("${body}")
                .to("file:src/main/resources/?fileName=emp.json");
            }

        });

EquityFeeds 是我上面代码中的 POJO 类。

问题:

  1. 不产生任何输出。 “emp.json”文件不会在给定位置生成。
  2. 另外,我如何将生成的 JSON 拆分为单独的 JSON 并将其发送到 ActiveMQ 队列,就像我为 XML 所做的那样:

    .split(body().tokenizeXML("equityFeeds", null)).streaming().to("jms:queue:xml.upstream.queue");

EquityFeeds (POJO):

    @CsvRecord(separator = ",",skipFirstLine = true)
    public class EquityFeeds {

    @DataField(pos = 1) 
    private String externalTransactionId;

    @DataField(pos = 2)
    private String clientId;

    @DataField(pos = 3)
    private String securityId;

    @DataField(pos = 4)
    private String transactionType;

    @DataField(pos = 5)
    private Date transactionDate;

    @DataField(pos = 6)
    private float marketValue; 

    @DataField(pos = 7)
    private String priorityFlag;

        // getters and setters... 
    }

请帮忙。请告诉我哪里出错了。迫切需要帮助。卡在这个问题上,无法继续前进。任何帮助将不胜感激。我真的很努力,搜索了谷歌并尝试了各种选项,但没有任何效果。

请注意: 我评论了 .marshal() 和 .json() 以检查 .unmarshal() 是否正常工作,但 unmarshal 也不能作为“emp.json”工作" 没有被创建。

【问题讨论】:

    标签: json csv apache-camel activemq


    【解决方案1】:

    如果在启动路由时根本没有发生任何事情,那么很可能是由于您传递给文件组件的相对路径。可能您的 Java 进程的执行目录不在您认为的位置,并且找不到该文件。为了简化事情,我建议您从绝对路径开始。一旦一切正常,找出正确的相对路径(你的基础应该是user.dir系统属性的值)。

    关于拆分内容的问题:documentation 已回答。

    这对我有用(Camel 3.1):

    public class CsvRouteBuilder extends EndpointRouteBuilder {
        @Override
        public void configure() {
            DataFormat bindy = new BindyCsvDataFormat(BindyModel.class);
    
            from(file("/tmp?fileName=simpsons.csv"))
                .unmarshal(bindy)
                .split(body())
                .log("Unmarshalled model: ${body}")
                .marshal().json()
                .log("Marshalled to JSON: ${body}")
                // Unique file name for the JSON output
                .setHeader(Exchange.FILE_NAME, () -> UUID.randomUUID().toString() + ".json")
                .to(file("/tmp"));
        }
    }
    
    // Use lombok to generate all the boilerplate stuff
    @ToString
    @Getter
    @Setter
    @NoArgsConstructor
    // Bindy record definition
    @CsvRecord(separator = ";", skipFirstLine = true, crlf = "UNIX")
    public static class BindyModel {
    
        @DataField(pos = 1)
        private String firstName;
        @DataField(pos = 2)
        private String middleName;
        @DataField(pos = 3)
        private String lastName;
    
    }
    

    鉴于/tmp/simpsons.csv中的此输入

    firstname;middlename;lastname
    Homer;Jay;Simpson
    Marge;Jacqueline;Simpson
    

    日志输出如下所示

    Unmarshalled model: RestRouteBuilder.BindyModel(firstName=Homer, middleName=Jay, lastName=Simpson)
    Marshalled to JSON: {"firstName":"Homer","middleName":"Jay","lastName":"Simpson"}
    Unmarshalled model: RestRouteBuilder.BindyModel(firstName=Marge, middleName=Jacqueline, lastName=Simpson)
    Marshalled to JSON: {"firstName":"Marge","middleName":"Jacqueline","lastName":"Simpson"}
    

    两个json文件写在/tmp中。

    【讨论】:

    • 感谢它的工作。我的“emp.json”文件被创建了,它把所有的 JSON 作为一个列表。 2个紧迫的问题出现了。 1) 日期在我的 JSON 中以整数形式出现,如下所示:"transactionDate":1385145000000。我的 POJO 类中的日期字段是 @DataField(pos = 5, pattern = "dd/MM/yy") private Date transactionDate; 2) 我将 JSON 拆分为 .split().tokenize("},"),因此当我收到 JSON 时,每个单独的 JSON 都缺少 }。如何解决这些问题。请帮忙。
    • 如果有帮助,请支持和/或接受答案。像我在上面的示例中那样进行拆分将解决 JSON 列表问题。您可以使用模型类上的 Jackson 注释控制的日期格式。
    • 拆分问题已解决。为此非常感谢。我的日期问题仍然存在。我已经为日期添加了注释@DataField(pos = 5, pattern = "dd/MM/yy") private Date transactionDate;,但问题仍然存在。还没有解决。
    • @DataField 是一个 Bindy 注释。要使用 Jackson 编组,您需要添加 @JsonFormat 注释,其中包含在解组为 JSON 时要使用的日期模式。
    • 如果我仅将 @JsonFormat 用于日期字段 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yy") private Date transactionDate;@DataField 用于其他字段,则程序无法正常工作。我们对Bindy注释本身的日期字段没有一些解决方案吗?
    猜你喜欢
    • 2020-07-06
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2018-05-11
    • 2014-11-23
    • 2015-10-18
    • 1970-01-01
    相关资源
    最近更新 更多