Apache Camel - 什么时候可以重命名文件?

时间:2015-11-03 12:10:54

标签: apache-camel

我找到了类似这样的示例代码:

from("file:/opt/input").multicast().parallelprocessing().to("direct:process-with-bindy","direct:move-to-out").end();

from("direct:move-to-out").setHeader(Exchange.FILE_NAME,simple(rename using current time)). to("file:/opt/done").end();

是否意味着在绑定处理期间将重命名相同的文件,并且重命名不会影响绑定路由?

由于

1 个答案:

答案 0 :(得分:0)

这意味着文件将同时发送到bindy和move-to-out,基本上将执行分成2个线程,它们将同时发生,并且不会在bindy处理中重命名该文件(除非它是“process-with-bindy”的路线的一部分)。

Sending the same message to multiple endpoints解释了这与将其发送到一个端点然后使用第一个端点的结果作为第二个端点的输入有何不同。

编辑: 当camel选择一个文件时,它会从中创建一个交换,这是由bindy操纵和处理的交换。绑定处理线程不知道交换已被复制,并且在其他地方被写为新文件,因此不存在冲突。

这很容易测试:

public class FileSplitTest extends CamelTestSupport {

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("file:target/todo")
                        .multicast()
                        .parallelProcessing()
                        .to("direct:process", "direct:file-out").end();

                from("direct:process")
                        .delayer(500)
                        .process(new Processor() {
                            public void process(Exchange exchange) throws Exception {
                                assertTrue("Hello World".equals(exchange.getIn().getBody(String.class)));
                            }
                        })
                        .to("file:target/done");

                from("direct:file-out")
                        .setHeader(Exchange.FILE_NAME, simple("new name"))
                        .to("file:target/done");
            }
        };
    }

    @Override
    public String isMockEndpoints() {
        return "file:target/done";
    }

    @Test
    public void testFileSplit() throws InterruptedException {
        template.sendBodyAndHeader("file:target/todo", "Hello world", Exchange.FILE_NAME, "todo.txt");

        MockEndpoint mockEndpoint = getMockEndpoint("mock:file:target/done");
        mockEndpoint.setExpectedMessageCount(2);

        assertMockEndpointsSatisfied();
    }
}