使用 Producer Template 调用骆驼路线

Calling a camel route using Producer Template

我的用例基于其余控制器输入,我需要从不同的源系统获取文件或将文件移动到目标系统。

路线:-

@Component
public class MoveFile extends RouteBuilder {
@override
public void configure() throws Exception {

from("file:tmp/${header.inPath}")
    .to("file:/tmp${header.outPath}?fileName=${header.fileName}")
    .setBody().constant("File - ${header.inPath}/${header.fileName} Moved Succesfully")

}
}

我的休息控制器将沿 getMapping 传递 jobName 以调用此特定路由 inPath、outPath 和文件名

@Resource(name=RouteProperties)
private Prosperties props;

@GetMapping("/runJob/{jobToInvoke}")
public String runJob (@PathVariable final String jobToInvoke){
String inPath=props.getProperty("inPath"+jobToInvoke)
String outPath=props.getProperty("outPath"+jobToInvoke)
String fileName=props.getProperty("fileName"+jobToInvoke)

String jobStatus = ProducerTemplate.withHeader("inPath",inPath)
                   .   
                   .
                   .to(??)
                   .request(String.class)
}

我需要帮助来使用 Producer Template 来传递属性吗? 我在 google 上尝试了一些搜索,但在 youtube (link) 中有一个示例可用,但在该视频中它正在调用 uri ,(Direct:sendMessage) 并且从路线中也有. 在这种情况下如何处理? 提前致谢

我不知道 from 中的这些动态文件 URI 是否有效,但至少 Camel File documentation 状态

Also, the starting directory must not contain dynamic expressions with ${ } placeholders. Again use the fileName option to specify the dynamic part of the filename.

因此文档建议更改

from("file:tmp/${header.inPath}")

进入

from("file:tmp?fileName=${header.inPath}")

fileName 选项可以是相对路径(不仅仅是文件名)。

如果该更改对您有用,那么您的问题就会过时,因为路由 URI 不再是动态的。

.withHeader("inPath",inPath)
.to("file:tmp")

direct: endpoint can be invoked programmatically from Java code. In the route, the pollEnrich 组件开头的路由调用消费者端点来读取文件并将交换消息正文替换为文件内容。

from("direct:start")
    .pollEnrich().simple("file:/tmp?fileName=${header.inPath}")
    .toD("file:/tmp?fileName=${header.outPath}")
    .setBody().simple("File - ${header.inPath} Moved Successfully");

从 Java 代码调用路由:

String jobStatus = producerTemplate.withHeader("inPath", inPath)
    .withHeader("outPath", outPath)
    .to("direct:start")
    .request(String.class);