Преобразование файла CSV в JSON и отправка его в очередь ActiveMQ - PullRequest
0 голосов
/ 24 марта 2020

Моя цель - прочитать файл 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 (). tokenize XML ("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... 
    }

Пожалуйста, помогите. Пожалуйста, скажите мне, где я иду не так. Нужна помощь отчаянно. Застрял в этом вопросе и не смог двигаться вперед. Любая помощь будет высоко ценится. Я очень старался, искал Google и пробовал различные варианты, но ничего не работает.

Обратите внимание: Я прокомментировал .marshal () и. json (), чтобы проверить, работает ли .unmarshal (), но демаршал также не работает, так как "emp. json" не создается.

1 Ответ

0 голосов
/ 24 марта 2020

Если при запуске маршрута ничего не происходит, то, скорее всего, это связано с относительным путем, который вы передали в файловый компонент. Возможно, каталог выполнения вашего Java процесса находится не там, где вы думаете, и файл не найден. Чтобы упростить вещи, я предлагаю вам начать с абсолютного пути. Когда все остальное заработает, определите правильный относительный путь (ваша база должна быть значением системного свойства user.dir).

Ваш вопрос о разбиении содержимого: Ответ дан в документации .

Это работает для меня (Верблюд 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.

...