Apache Camel相关代码已经上传GitHub,需要的自取:GitHub - Apache Camel 完整Demo
如果觉得还行,麻烦点个Star
参考资料:
《Camel in Action》
Option |
Default value |
Description |
username |
null |
Provides a username to the remote host for authentication. If no username is provided, anonymous login is attempted. You can also specify the username by prefixing username@ to the hostname in the URI. 为远程主机提供用户名已进行身份验证。如果没有提供用户名,则尝试匿名登陆。 您还可以通过在URI中为主机名添加用户名来指定用户名。 |
password |
null |
Provides a password to the remote host to authenticate the user. You can also specify the password by prefixing the hostname in the URI with username:password@. 为远程主机提供密码已进行身份验证。您也可以使用username:password@在URI中为主机名添加密码。 |
binary |
false |
Specifies the transfer mode. By default, Camel will transfer in ASCII mode; set this option to true to enable binary transfer. 指定传输默认值,Camel将以ASCII模式传输,将此选项设置为true以启用二进制传输。 |
disconnect |
false |
Specifies whether Camel will disconnect from the remote host right after use. The default is to remain connected. 指定Camel在使用后是否与远程主机断开连接,默认是保持连接。 |
maximumReconnectAttempts |
3 |
Specifies the maximum number of attempts Camel will make to connect to the remote host. If all these attempts are unsuccessful, Camel will throw an exception. A value of 0 disables this feature. 指定Camel将连接到远程主机的最大尝试次数。如果这些尝试都不成功,Camel将抛出一个异常。 值为0将禁用此功能。 |
reconnectDelay |
1000 |
Specifies the delay in milliseconds between reconnection attempts. |
Option |
Default value |
Description |
delay |
500 |
Specifies the number of milliseconds between polls of the directory. 指定目录轮询间隔 |
recursive |
false |
Specifies whether or not to recursively process files in all subdirectories of this directory. 指定是否递归处理该目录的所有子目录中的文件 |
noop |
false |
Specifies file-moving behavior. By default, Camel will move files to the.camel directory after processing them. To stop this behavior and keep the original files in place, set the noop option to true. 指定文件移动行为。默认情况下,Camel会在处理文件后将文件移动到.camel目录。停止这种行为并保留原始文件,设置noop选项为true。 |
fileName |
null |
Uses an expression to set the filename used. For consumers, this acts as a filename filter; in producers, it’s used to set the name of the file being written. 使用表达式来设置使用的文件名。对于消费者来说,这起到文件名过滤的作用。在生产者中,它用于设置正在写入的文件名的名称。 |
fileExist |
Override |
Specifies what a file producer will do if the same filename already exists.Valid options are Override, Append, Fail, and Ignore. Override will cause the file to be replaced. Append adds content to the file. Fail causes an exception to be thrown. If Ignore is set, an exception won’t be thrown and the file won’t be written. 指定文件生产者,如果文件已存在将做什么选项:覆盖、追加、失败、忽略。 覆盖会导致文件被替换。 追加将内容添加到文件。 如果设置失败会导致异常被抛出。 如果设置忽略,异常将不会被抛出,文件将不会被写入。 |
delete |
false |
Specifies whether Camel will delete the file after processing. By default, Camel will not delete the file. 指定Camel在处理后是否删除文件。默认情况下,Camel不会删除文件。 |
move |
.camel |
Specifies the directory to which Camel moves files after it’s done processing them. 指定Camel在完成处理之后移动文件的目录 |
include |
null |
Specifies a regular expression. Camel will process only those files that match this expression. 指定正则表达式,Camel只处理那些匹配表达式的文件。 |
exclude |
null |
Specifies a regular expression. Camel will exclude files based on this expression. |
Working with files over FTP(通过FTP处理文件)
One of the things that make Camel easy to use is the endpoint URI. By specifying a URI, you can identify the component you want to use and how that component is configured. You can then decide to either send messages to the component configured by this URI, or to consume messages from it.
Take your first Rider Auto Parts assignment, for example. To download new orders from the FTP server, you need to do the following
使用Camel易于使用的一件事是端点URI。 通过指定URI,您可以识别您要使用的组件以及组件的配置方式。 然后,您可以决定将消息发送到由此URI配置的组件,还是从中使用消息。
例如,以您的第一个Rider Auto Parts作业为例。 要从FTP服务器下载新订单,您需要执行以下操作
1 Connect to the rider.com FTP server on the default FTP port of 21
2 Provide a username of “rider” and password of “secret”
3 Change the directory to “orders”
4 Download any new order files
As shown in figure 2.3, you can easily configure Camel to do this by using URI notation.
Camel will first look up the ftp scheme in the component registry, which will resolve to the FtpComponent. The FtpComponent then works as a factory, creating the FtpEndpoint based on the remaining context path and options.
The context path of rider.com/orders tells the FtpComponent that it should log into the FTP server at rider.com on the default FTP port and change the directory to “orders”.
Finally, the only options specified are username and password, which are used to log in to the FTP server.
1在默认FTP端口21上连接到rider.com FTP服务器
2提供“rider”的用户名和密码“secret”
3将目录更改为“orders”
4下载任何新的订单文件
如图2.3所示,您可以使用URI表示法轻松配置Camel来完成此操作。
Camel将首先查找组件注册表中的ftp方案,这将解析为FtpComponent。 然后,FtpComponent作为工厂工作,根据剩余的上下文路径和选项创建FtpEndpoint。
rider.com/orders的上下文路径告诉FtpComponent它应该在默认FTP端口上登录到rider.com上的FTP服务器并将目录改为“orders”。 最后,指定的唯一选项是用户名和密码,用于登录到FTP服务器。
Although this endpoint URI would work equally well in a consumer or producer scenario, you’ll be using it to download orders from the FTP server. To do so, you need to use it in a from node of Camel’s DSL:
尽管这个端点URI在消费者或生产者场景中同样可以工作,但是您将使用它来从FTP服务器下载订单。 要做到这一点,你需要在Camel的DSL节点中使用它:
from("ftp://rider.com/orders?username=rider&password=secret")
A Camel endpoint URI consists of three parts: a scheme, a context path, and a list of options.
Camel端点URI由三部分组成:方案,上下文路径和选项列表。
FTP路由挺简单的,一些详细的DSL参数也在上面贴出来了...
由于国内Camel使用的很少,有些参数的具体使用可能需要上Google查阅...
操作FTP目录的时候,需要注意:
每个FTP的用户名和密码都对应一个单一目录(至少在我司的服务器上是这样的...)
操作FTP目录中的文件时,一定要注意目录的操作权限问题(之前我一直以为是我代码有问题...)。
我将整理好的代码上传了...大家可以下载下来跑跑看...
Apache Camel FTP组件 代码Demo
下面将FTP路由相关的代码贴出来:
package com.camel.ftp;
import org.apache.camel.CamelContext;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.log4j.PropertyConfigurator;
/**
*
* @author CYX
* @time 2017年12月15日上午10:36:48
*/
public class FTPCamel {
public static void main(String[] args) throws Exception {
// 日志
PropertyConfigurator.configure("./conf/log4j.properties");
PropertyConfigurator.configureAndWatch("./conf/log4j.properties", 1000);
CamelContext context = new DefaultCamelContext();
// 启动route
context.start();
// 将我们编排的一个完整消息路由过程,加入到上下文中
// 本地文件上传至FTP服务器
context.addRoutes(new LocalToFTPRouteBuilder());
// 从FTP服务器上下载文件至本地.
// context.addRoutes(new FTPToLocalRouteBuilder());
// 从FTP服务器上下载文件,并根据正则表达式进行文件名过滤。
// context.addRoutes(new FTPToLocalFiterFileNameRouteBuilder());
// 通用没有具体业务意义的代码,只是为了保证主线程不退出
synchronized (FTPCamel.class) {
FTPCamel.class.wait();
}
}
}
package com.camel.ftp;
import org.apache.camel.builder.RouteBuilder;
/**
* 本地文件上传至FTP服务器.
* 注意:每个FTP用户名和密码都对应单独一个目录.
* 操作FTP目录时,需要注意FTP目录的权限问题.
*
* @author CYX
* @time 2017年12月19日下午8:08:01
*/
public class LocalToFTPRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
// 注意:10.0.227.66 IP后面的斜杠'/'代表的就是FTP用户名密码对应的那个目录
from("file:/temp?delay=30000&delete=true").to("ftp://10.0.227.66/?username=cloudsftp&password=cloudsftp");
}
}
服务器目录下什么都没有:
接着运行第一个路由
控制台打印:
本地目录和服务器目录:
从FTP服务器目录下载文件至本地
主程序 FTPCamel 和上面是一样的,修改一下注释就好了,不再重复贴出来了...
看下FTPToLocalRouteBuilder代码:
package com.camel.ftp;
import org.apache.camel.builder.RouteBuilder;
/**
* 从FTP服务器上下载文件至本地.
*
* @author CYX
* @time 2017年12月19日下午8:12:35
*/
public class FTPToLocalRouteBuilder extends RouteBuilder {
// 从FTP上下载文件
@Override
public void configure() throws Exception {
from("ftp://10.0.227.66/?username=cloudsftp&password=cloudsftp&binary=true&passiveMode=true&delete=true&delay=5000").to("file:/temp");
}
}
我们先看下本地目录和服务器目录:
我们启动程序后,看下控制台的打印:
我们看下目录:
从FTP服务器上下载文件,并根据正则表达式进行文件名过滤。
主程序 FTPCamel 和上面是一样的,修改一下注释就好了,不再重复贴出来了...
下面看FTPToLocalFiterFileNameRouteBuilder代码:
package com.camel.ftp;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
/**
* 从FTP服务器上下载文件,并根据正则表达式进行文件名过滤。
*
* @author CYX
* @time 2017年12月19日下午8:15:06
*/
public class FTPToLocalFiterFileNameRouteBuilder extends RouteBuilder {
// 从FTP上下载文件(文件后缀名过滤)
@Override
public void configure() throws Exception {
from("ftp://10.0.227.66/?username=cloudsftp&password=cloudsftp&binary=true&delete=true&delay=5000&include=.*conf").process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
// 读取文件名
// GenericFileMessage message = (GenericFileMessage)
// exchange.getIn();
// System.out.println(message);
// 读取文件中的内容
// String str = exchange.getIn().getBody(String.class);
// System.out.println(str);
}
}).to("file:/temp");
}
}
上面这段代码中,在from设置中有这样一个参数:include=.*conf,这个参数参照上面的SDL表:指定正则表达式,Camel只处理那些匹配表达式的文件
这个意思就是只处理后缀名是conf的文件。
比较有意思的是,我认为的正则表达式应该是:*.conf 这样的,但试了一下发现会报错,百度也搜不到相关的使用方法,
后来在Stack Overflow上找到了相关的提问,他们说:"正则表达式在include中,应该在星号之前有点....."
恩,试了一下,还真是....
我们先看下本地目录和服务器目录:
下面我们运行程序:
ok 没问题....