Как я могу разделить обмен, который содержит список файлов в Apache Camel и записать каждый файл в файловой системе - PullRequest
0 голосов
/ 11 мая 2018

Как говорится в вопросе, я пытаюсь записать кучу файлов (в данном случае 3) в файловую систему после их объединения и последующего разделения.

Как я могу сделать это на верблюде?Я использую 2.16.5, так как это верблюжий вариант проекта, над которым я проснулся.

Это код, который, по моему мнению, должен делать это:

// reads 
public class StringRoute extends RouteBuilder {
    public void configure() throws Exception {
        from("direct:readStrings")
            .split(body())
            .to("file:input?fileExist=Append&fileName=${body}.txt"); 
    // appending each message to diff file
}


import org.apache.camel.builder.RouteBuilder;

import org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategy;

public class AggregatorRoute extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("file:input")
            .aggregate(new GroupedExchangeAggregationStrategy())
            .constant(true)
            .completionSize(3)
            .to("direct:splitFiles");

        from("direct:splitFiles")
            .split(body())
            .to("direct:writeFiles");
    }
}

public class FileWriter extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("direct:writeFiles")
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    System.out.println("In FileWriter: " + exchange.getIn().getBody());
                }
            })
            .to("file:output?fileName=${body}.txt");
    }
}

    // Main
import routes.AggregatorRoute;
import routes.FileWriter;
import routes.StringRoute;
import org.apache.camel.CamelContext;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.impl.DefaultCamelContext;

import java.util.ArrayList;
import java.util.List;

public class Main {
public static void main(String[] args) {
    CamelContext camelContext = new DefaultCamelContext();
    try {
        camelContext.addRoutes(new StringRoute());
        camelContext.start();
        ProducerTemplate producerTemplate = camelContext.createProducerTemplate();
        List<String> list = new ArrayList<String>();
        String a = "abc";
        String b = "cdb";
        String c = "efg";
        list.add(a); list.add(b); list.add(c);
        producerTemplate.sendBody("direct:readStrings", list);
        camelContext.addRoutes(new AggregatorRoute());
        camelContext.addRoutes(new FileWriter());
        Thread.sleep(10000);
        camelContext.stop();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Как видите, в выходном каталоге нет файлов.

result.png

1 Ответ

0 голосов
/ 11 мая 2018

Вы должны получить исключение. Нет доступных конечных точек: конечная точка [direct: // splitFiles] , так как определение direct: splitFiles было фактически ниже, к которому был получен доступ в файле : input .

Итак, я перенес определение в качестве первого шага.

import java.util.ArrayList;
import java.util.List;

import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.processor.aggregate.AggregationStrategy;

public class AggregatorRoute extends RouteBuilder {
        @Override
        public void configure() throws Exception {
            from("direct:splitFiles")
                .split(body())
                .convertBodyTo(String.class)
                .to("direct:writeFiles")
            ;

            from("file:input")
                .convertBodyTo(String.class)
                .log("current message:: ${body}")
                .aggregate(new AggregationStrategy() {
                    @Override
                    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
                        String newMessage=newExchange.getIn().getBody(String.class);
                        List<String> messageList=null;
                        if(oldExchange == null) {
                            messageList=new ArrayList<String>();
                        }
                        if(oldExchange != null && newExchange!=null) {
                            messageList=oldExchange.getIn().getBody(List.class);
                        }
                        messageList.add(newMessage);
                        newExchange.getOut().setBody(messageList);
                        return newExchange;
                    }

                })
                .constant(true)
                .completionSize(3)
                .log("current message:: ${body}")
                .to("direct:splitFiles")
           ;

        }
    }

Вы должны использовать GroupedMessageAggregationStrategy вместо GroupedExchangeAggregationStrategy , если вы просто хотите агрегировать сообщение.

Наконец-то в Main.java также перевернули ордер, чтобы избавиться от Нет потребителей Исключение для прямой: writeFiles

camelContext.addRoutes(new FileWriter());    
camelContext.addRoutes(new AggregatorRoute());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...