【问题标题】:Combining many camel components into one custom component将许多骆驼组件组合成一个自定义组件
【发布时间】:2017-06-10 20:42:26
【问题描述】:

我想创建一个新的骆驼组件MyComponent,它是不同组件的组合:

例如,而不是指定多个端点:

from("file:c:/in")...to...

from("ftp:...")...to...

我想要一个可以检测到正确端点的MyComponent

from("myComponent:..")...to...

以便无论文件来自from("file")from("sftp")from("stream") 等...

作为一个适配器吃器,我们有一个文件作为入口或 ftp ..

如何做到这一点?

【问题讨论】:

  • 我编辑了您的帖子(它在队列中)以稍微澄清一下,但我无法说出您在这一行中的意思:“并且作为适配器食用者,我们有一个文件entry 或 ftp .." 你能理解一下吗?
  • @gkubed 我的意思是我不想使用不同的入口点作为第一个示例: from("file") from("sftp") from("stream") 我想要那个 mu 组件完成所有工作并检测正确的入口点 from("mycomponent") 它可以是文件或流或任何东西
  • 对我来说,这看起来像 YAGNI。

标签: apache-camel


【解决方案1】:

您真的需要骆驼组件还是可以使用自定义路由构建器来实现?这里只是展示一般想法的原始示例:

自定义路由构建器类而不是组件:

import org.apache.camel.Endpoint;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.file.FileEndpoint;
import org.apache.camel.component.file.remote.FtpConfiguration;
import org.apache.camel.component.file.remote.FtpEndpoint;

class MyFileReader extends RouteBuilder {
    private String name;
    private String dir;
    private String mask;
    private String ftpHost;
    private int ftpPort;
    private String ftpUser;
    private String ftpPass;
    private boolean ftpMode;

    public MyFileReader(String name, String dir, String mask) {
        this.name = name;
        this.dir = dir;
        this.mask = mask;
        this.ftpMode = false;
    }

    public MyFileReader(String name, String dir, String mask, String ftpHost, int ftpPort, String ftpUser, String ftpPass) {
        this.name = name;
        this.dir = dir;
        this.mask = mask;
        this.ftpHost = ftpHost;
        this.ftpPort = ftpPort;
        this.ftpUser = ftpUser;
        this.ftpPass = ftpPass;
        this.ftpMode = true;
    }

    @Override
    public void configure() throws Exception {
        from(initFromEndpoint()).to("direct:" +name + "_out");
    }

    private Endpoint initFromEndpoint() {
        if (ftpMode) {
            FtpEndpoint endpoint = new FtpEndpoint();
            FtpConfiguration configuration = endpoint.getConfiguration();
            configuration.setHost(ftpHost);
            configuration.setPort(ftpPort);
            configuration.setUsername(ftpUser);
            configuration.setPassword(ftpPass);
            configuration.setDirectory(dir);
            endpoint.setInclude(mask);
            return endpoint;
        } else {
            FileEndpoint endpoint = new FileEndpoint();
            endpoint.getConfiguration().setDirectory(dir);
            endpoint.setInclude(mask);
            return endpoint;
        }
    }
}

来自 Spring xml 的使用示例:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

    <bean id="fileReader" class="MyFileReader">
        <constructor-arg name="name" value="myFileReader" />
        <constructor-arg name="dir" value="/myfiles" />
        <constructor-arg name="mask" value="*.txt" />
    </bean>


    <bean id="ftpReader" class="MyFileReader">
        <constructor-arg name="name" value="myFtpReader" />
        <constructor-arg name="dir" value="/myftpfiles" />
        <constructor-arg name="mask" value="*.txt" />
        <constructor-arg name="ftpHost" value="127.0.0.1" />
        <constructor-arg name="ftpPort" value="1234" />
        <constructor-arg name="ftpUser" value="myuser" />
        <constructor-arg name="ftpPass" value="mypass" />
    </bean>

    <camelContext xmlns="http://camel.apache.org/schema/spring" id="integration-schedule" useMDCLogging="true">
        <routeBuilder ref="fileReader" />
        <routeBuilder ref="ftpReader" />

        <route id="fileRoute">
            <from uri="direct:fileReader_out" />
            <log message="Do something with files" />
        </route>

        <route id="ftpRoute">
            <from uri="direct:ftpReader_out" />
            <log message="Do something with ftp files" />
        </route>
    </camelContext>
</beans>

【讨论】:

  • 我相信组件在那里是开销。当您需要与没有在骆驼中实现或骆驼实现不起作用的东西进行通信时需要组件。对于其他情况,例如使用一些参数指定 java 类,这些参数取决于它们将构建不同的路由,使用自定义路由构建器类要容易得多
  • 让我赞成这个答案,因为我也相信你正在反对基本的骆驼概念。你真的应该坚持使用单独的组件,即使是为了已经建立的标准。
猜你喜欢
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多