当前位置: 首页 > 知识库问答 >
问题:

Java&Apache-Camel:从直接endpoint到文件endpoint

闾丘朗
2023-03-14
from(direct:start)
  .to(direct:doStuff)
  .to(direct:readDirectory)
  .to(file://destination-folder)
@Component
public class Route extends AbstractRouteBuilder {
  @Override
  public void configure() throws Exception {
      from("direct:start")
        .bean(lookup(ReadDirectory.class))
        .split(body())
          .setHeader("FILENAME", method(lookup(CreateFilename.class)))
          .to("file:///path/to/my/output/directory/?fileName=${header.FILENAME}");
  }
@Component
public class ReadDirectory implements CamelProcessorBean {
  @Handler
  public ImmutableList<File> apply(@Header("SOURCE_DIR") final String sourceDir) {
    final File directory = new File(sourceDir);
    final File[] files = directory.listFiles();
    if (files == null) {
      return ImmutableList.copyOf(Lists.<File>newArrayList());
    }
    return ImmutableList.copyOf(files);
  }
}

我可以通过使用以下伪测试启动路由(关键是我可以通过producer.sendbodyandheader(..))手动启动路由)

public class RouteIT extends StandardIT {
  @Produce
  private ProducerTemplate producer;

  @Test
  public void testRoute() throws Exception {
    final String uri = "direct:start";
    producer.sendBodyAndHeaders(uri, InOut, null, header());
  }

  private Map<String, Object> header() {
    final Map<String, Object> header = Maps.newHashMap();
    header.put("SOURCE_DIR", "/path/to/my/input/directory/");
    return header;
  }
}
  • AbstracTrouteBuilder扩展SpringRouteBuilder
  • CamelProcessorBean只是一个标记接口
  • StandardIt加载SpringContext和stuft

问题是,我必须设置文件名。我读过一些camel设置headercamelFileNameProducted的东西(在文件endpoint期间)。它是一个带有时间戳的通用字符串,如果我不设置文件名-写入的文件将获得这个通用字符串作为文件名。

共有1个答案

白镜
2023-03-14

您可以在使用producer模板发送时设置文件名,只要在路由之间的路由过程中传播头部就可以了,而Camel在默认情况下是这样做的。

例如

  @Test
  public void testRoute() throws Exception {
    final String uri = "direct:start";
    Map headers = ...
    headers.put(Exchange.FILE_NAME, "myfile.txt");
    producer.sendBodyAndHeaders(uri, InOut, null, headers);
  }

文件组件更多地讨论如何控制文件名

    null
 类似资料:
  • 我需要在调用SFTPendpoint之前调用特定逻辑。考虑中的逻辑将在exchange中注入一些标头。当SFTP路由启动时,将使用这些标头。 因此,我试图在第一次计时时调用我的初始设置逻辑。它只会运行一次。某些标头将设置在exchange对象内。然后,在完成此操作后,应调用文件endpoint。标头应流经在这些endpoint之间传递的exchange对象。 我试着探索这个的直接组件。我试过这样的

  • 我是Apache Camel和Java DSL的新手。我想通过使用图像处理工具将一个图像文件分割到不同的endpoint。什么是所有的组件我需要使用来实现这一点,我还需要发送分割图像到一个更多的endpoint。

  • 我对骆驼路线和它的两个终点有点困惑:直接和SEDA。假设我有一条这样的路线: 在此基础上,我有一个rest web服务,它接收几个请求,进行一些处理,然后将消息交给这条路由,以获得来自第三方服务器的响应。我通过Spring框架这样实例化了Camel上下文: 现在的问题是,在一个瞬间,我发送多个不同的消息到这条路由。现在,Camel文档说直接组件是在单线程中调用的,并且是同步的。那么所有的消息是并发

  • 在中,我正在填充和。现在,我需要定义一个新的路由,它使用来自上传队列的消息,并复制一个本地文件夹(基于在上一个路由中生成的Id),并将其上传到目标文件夹,该文件夹是一个ftp服务器(这也在上一个路由中填充) 那么,如何设计一条新的路线,其中从和到终点都是动态的,如下所示?

  • 我目前正在开发一个基于Camel的测试工具应用程序,它处理来自多个文件夹的文件组,并与本地存储库中的文件进行比较。 有没有办法从骆驼路由中的终点动态更改文件夹位置?我想使用一条路由来轮询来自多个文件夹的文件。