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

Apache Camel-特定路由调用上的文件传输

刘狐若
2023-03-14

我正在尝试创建一个webservice,当调用它时,它会查看本地目录,从那里提取文件并上传到ftp服务器。

我可以创建一个简单的路由,从本地目录中选择文件并上传到ftp服务器,下面是代码:

<route>
        <from uri="file://D:\\FTPTest?noop=true&amp;delay=2000" />
        <to uri="ftp://user@host.in:21/public_html/EnterpriseProject?password=password123#"/>
        <to uri="bean:myBean?method=test" />
    </route>

但是,我想在通过restlet webservice调用特定路由时调用此文件传输,我尝试了以下代码,但没有成功:

<route>
        <from uri="direct:fileTransferRoute" />
            <to uri="file://D:\\FTPTest?noop=true&amp;delay=2000" />
            <to uri="ftp://user@host.in:21/public_html/EnterpriseProject?password=password123#"/>
        </route>

restlet从以下路径调用上述路径:

<route>
<from
            uri="restlet:http://0.0.0.0:9080/csitec/{serviceName}?restletMethod=post" />
        <process ref="serviceRouteProcessor" />
        <toD uri="direct:${in.header.nextRoute}" />

    </route>

以下是我的serviceRouteProcessor的代码:

public void process(Exchange exchange) throws Exception {
    String body = exchange.getIn().getBody(String.class);
    String serviceName = exchange.getIn().getHeader(Constants.SERVICE_NAME).toString();
    String nextRoute = serviceName+Constants.NEXT_ROUTE_APPENDER;
    exchange.getOut().setHeader(Constants.NEXT_ROUTE, nextRoute);
    exchange.getOut().setBody(body);
}

请帮助我,并建议需要做的改变,使它这样工作。

共有2个答案

姜景辉
2023-03-14

编辑:

您必须首先了解一件事,to是生产者而不是消费者

你能做的是,

@Autowired
private CamelContext context;// if you have more than one camel context use @Qualifier and wire by bean id


public void process(Exchange exchange) throws Exception {
    String body = exchange.getIn().getBody(String.class);
    String serviceName = exchange.getIn().getHeader(Constants.SERVICE_NAME).toString();
    context.startRoute(serviceName+Constants.NEXT_ROUTE_APPENDER);// here in nextroute you must give the routeid
}

你的路线一定像

 <route id = "<value of serviceName+Constants.NEXT_ROUTE_APPENDER>" autoStartup = "false">
                <from uri="file://D:\\FTPTest..." />
                <onCompletion onFailureOnly="true">
                  <choice>
                    <when>
                        <simple>${property.CamelBatchComplete}</simple>
                    <process ref="asyncSelfShutdownProcessor"/>
                    </when>
                  </choice>
                </onCompletion>
                <to uri="ftp://user@host.in:21..."/>
            </route>

并将asyncSelfShutdownProcessor添加到spring上下文

@Component
public class AsyncSelfShutdownProcessor implements AsyncProcessor {

    @Autowired
    private CamelContext context

     public boolean process(Exchange exchange, AsyncCallback callback){

          new Thread(() -> context.stopRoute(exchange.getFromRouteId())).start();
     }
}

##############################################################################旧版本:

好的,我理解您的需要,因为您有一个将文件从文件系统移动到ftp服务器的路由,您所需要的只是这个路由,只有当您从rest服务触发时才能执行。我会这样做,

*我将使路由autoStartup="false"并将其分配为id="fs-to-ftp"到路由

<route id = "fs-to-ftp" autoStartup = "false">
            <from uri="file://D:\\FTPTest..." />
            <onCompletion onFailureOnly="true">
                <process ref="asyncSelfShutdownProcessor"/>
            </onCompletion>
            <to uri="ftp://user@host.in:21..."/>
        </route>

**将onComplete中的自关闭异步进程添加到路由“fs到ftp”。异步处理器

asyncSelfShutdownProcessor= AsyncProcessorConverterHelper.convert(exchange -> {
            new Thread(() -> context.stopRoute("fs-to-ftp")).start();
        });

***将骆驼上下文依赖添加到rest服务,并在rest服务中通过id启动路由context.startRoute("fs-to-ftp")

赵珂
2023-03-14

您应该尝试Content-enrich的polEnrich功能

在示例部分,您可以找到有关文件的示例。

您的路由应该是这样的(我只使用camel java dsl,所以这是一段xml伪代码):

<route>
    <from uri="direct:fileTransferRoute" />
        <pollEnrich uri="file://D:\\FTPTest?fileName=data.txt....." />
        <to uri="ftp://user@host.in:21/public_html/EnterpriseProject?password=password123#"/>
    </route>
 类似资料:
  • 新反应: 我有一个 组件,我只想在用户访问特定页面时隐藏该组件。 App.JS: main.js:

  • 我需要将文件从文件夹同步到restendpoint。因此,如果文件被放置在特定文件夹中,我需要将该文件发送到接受多部分文件的RESTendpoint。我正在使用ApacheCamel来实现这一点。 RESTendpoint在Spring中编写,如下所示: 我是Camel的新手,并且已经弄清楚了如何通过构建路由并获取文件来轮询目录,但是我无法弄清楚如何使用此路由将此文件放入其余endpoint。这是

  • 问题内容: 我有一个使用httprouter和negroni的Web服务器。用户通过外部OAuth登录此系统。我们将令牌保存到表明他们是否已登录的加密会话中。我想使用中间件来验证此令牌是否存在,如果不存在,则将用户踢回到登录页面。我想从身份验证中间件中排除一些路由。negroni自述文件中有一个使用大猩猩mux进行此操作的示例,但是我无法完全理解使用httprouter进行此操作的可扩展性。类似于

  • null 在这种情况下,如果我们需要添加更多的源和目标,我们只需要更改属性文件。正如我所知,我们不能在Apache Camel中使用动态endpoint。 示例:

  • 在Flasgger中,我试图为接受上传文件的路由创建文档。然而,尽管坚持规范,我不能在Flasgger UI中显示文件选择器。 我使用的是最新的(目前为止的),运行OpenAPI3规范(如),我在Swagger-UI中看到了这个提交,它为POST文件请求启用了文件选择器。 我知道以前也有人问过类似的问题,但没有一个与OAS版本3有关。

  • 本文向大家介绍PHP文件上传之多文件上传的实现思路,包括了PHP文件上传之多文件上传的实现思路的使用技巧和注意事项,需要的朋友参考一下 多文件上传的两种情况 ①使用多个name值 a.点击提交之后接收到的数据格式 从这种格式可以看出来,每一个文件对应一个数组单元 所以使用foreach遍历数组,并对每个数组单元进行文件上传函数调用 b.点击提交后的操作 ①接收上传的文件信息 $file = $_F