используя верблюда apache, smooks и flatpack - PullRequest
3 голосов
/ 19 января 2012

Я пишу маршрут, используя верблюда и smooks, с производителем в качестве репозитория JPA, который создает список объектов JPA, которые мне нужно отправить на сервер sftp в виде файла фиксированной ширины.

Вот то, что, я думаю, требуется для того, чтобы это произошло

  1. Репозиторий, который использует JPA для создания списка объектов (у меня есть это)
  2. A smooksчтобы упаковать отображение, которое берет xml-версию списка, упомянутого выше, и преобразует его в файл фиксированной ширины
  3. верблюжий маршрут, который начинается с хранилища и заканчивается отправкой файла через sftp:

Вот код, который у меня есть для этого:

public class RetirementRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        onException(Throwable.class)
                .maximumRedeliveries(3)
                .useExponentialBackOff()
                .backOffMultiplier(4)
                .logRetryAttempted(true)
                .handled(true)
                .log(LoggingLevel.ERROR, "Error transmitting file to miliman")
                .to("log:org.fuwt?level=ERROR&showAll=true");

        //define the fixed width mapping
        FlatpackDataFormat df = new FlatpackDataFormat();
        df.setDefinition(new ClassPathResource("META-INF/smooks/fuintegration/retirement-fixed-width-mapping.xml"));
        df.setFixed(true);
        df.setIgnoreFirstRecord(false);

        from("bean:retirementRepository?method=getRetirementMembers")
                .to("log:org.fuwt?level=INFO")
                .transacted("CRM_PROPAGATION_REQUIRED")
                .routeId("retirement_member_exchange")
                .aggregate(property("CamelCreatedTimestamp"), new RetirementAggregationStrategy()).completionFromBatchConsumer()
                .marshal(df).log("log:org.fuwt?level=ERROR&showAll=true")
                .to("file://Users/smohamed/tests/?fileName=marshal.test.txt");
    }
}

Однако, когда я запускаю модульный тест, я получаю следующую ошибку:

ArrayList cannot be converted to RetirementMember

, которую я думаюозначает, что flatpack не знает, что делать со списком, и ему нужно работать над объектом для каждого объекта.

Следовательно, мне нужно сопоставление smooks, подобное шаблону freemaker, но вместо этогошаблона freemaker, я хочу использовать определения столбцов flatpack:

<?xml version='1.0'?>  
<!DOCTYPE PZMAP SYSTEM "flatpack.dtd" >  
<PZMAP>  
    <COLUMN name="ssn" length="11" />  
    <COLUMN name="lastName" length="20" />  
    <COLUMN name="firstName" length="15" />  
</PZMAP>

Как лучше всего это сделать?Не так много доступной документации, и я искал недели

спасибо

Сэм

1 Ответ

2 голосов
/ 23 января 2012

Оказывается, что для формата данных Flatpack требуется не объект Java ArrayList, а объект List>, где Map содержит имя определения каждого столбца в файле отображения ZMAP-XML и объект, который он обозначает, поэтому например, имя поля должно быть на карте как map.put("firstname","Sam").

Я узнал об этом, скачав исходный код Apache Camel и посмотрев на модульные тесты для Flatpack, после чего смог найти свой маршрут на работу.

...