我有一个订阅JMS主题的应用程序(Scala 2.10.3,Akka 2.3.1,Camel 2.13.0),并在特定文件可供下载时通过JMS消息通知。每个JMS消息都包含可通过SFTP收集的文件的名称+路径。
然后我希望能够通过SFTP获取文件,但只获取我们收到JMS消息的文件(以避免我们可能获取正在进行的文件的问题被写的。)
我想要一个适合Akka Camel和Consumer模型的解决方案。我已经阅读了用于SFTP端点的file2和ftp2的Camel选项,但我需要帮助:
如何通过& filter = ...参数定义可以在endpointUri字符串中引用的类/对象?我希望能够更新过滤器对象,以便每次消费者轮询一个文件列表时,都会应用更新的过滤器列表。
如何定义自定义的IdempotentRepository,以允许缓存大小超过默认值1000?
我的SFTP Consumer Actor目前看起来像这样(有一些值被编辑......):
class SftpConsumer extends Actor with ActorLogging with Consumer {
val host = ...
val username = ...
val keyFile = ...
def endpointUri: String = s"sftp://${host}?username=${username}&privateKeyFile=${keyFile}&idempotent=true"
答案 0 :(得分:3)
过滤器和 idempotentRepository 参数需要在注册表中引用对象(按名称)。
对于过滤器,您需要创建一个扩展 org.apache.camel.component.file.GenericFileFilter 的类的对象。
对于过滤器和/或 idempotentRepository ,您需要创建一个注册表,将注册表分配给Camel上下文,并将这些对象注册到注册表,例如
// define a class which extends GenericFileFilter[T], and which
// filters for files which are explicitly allowed via include()
class MyFileFilter extends GenericFileFilter[File] {
var include = Set[String]()
def accept(file: GenericFile[File]) = include.contains(file.getFileName)
def include(filename: String) = include = include + filename
def exclude(filename: String) = include = include - filename
}
// Create a filter and a registry, add a mapping for the file filter to
// the registry, and assign the registry to the camel context
val myFileFilter = new MyFileFilter()
val simpleRegistry = new SimpleRegistry()
simpleRegistry.put("myFilter", myFileFilter )
camel.context.setRegistry(simpleRegistry);
// create a memory-based idempotent repository with a custom cache size
val cacheSize = 2500
val myRepository = MemoryIdempotentRepository.memoryIdempotentRepository(cacheSize)
simpleRegistry.put("myRepository", myRepository)
// adjust the endpointUri to include the &filter= and &idempotentRepository= parameters
def endpointUri: String = s"sftp://${host}?username=${username}...&idempotent=true&idempotentRepository=#myRepository&filter=#myFilter"