对Camel来说很新,但到目前为止很有趣。
我用它来处理FTP的fsv文件:d到特定目录,解析它们然后将数据放在相关的MySql数据库表中(所有这些都在同一主机上)。
我有一个包含4个路由的简单CamelContext,每个路由处理不同的文件类型并将解析后的数据放在其关联的表中。许多这些文件可以每15分钟出现在FTP目录中(时钟15,30 45,50分钟)。
驼峰上下文注册表只有一个条目,即dataSource(由org.mariadb.jdbc.MySQLDataSource提供的简单Mysql数据源......我们正在迁移到MaraiDb)
4条路线中的每条路线都遵循以下模式,区别仅在于“从文件”名称模式和处理器的选择:
from("file:" + FilePath + "?include=(.*)dmm_all(.*)csv.gz&" + fileAction + "&moveFailed=" + FaultyFilePath)
.routeId("myRoute")
.unmarshal().gzip()
.unmarshal().csv()
.split().body()
.process(myProcessor)
.choice()
.when(simple("${header.myResult} != 'header removed'"))
.to("sql:" + insertQuery.trim() + "?dataSource=sqlds")
.end();
每个处理器只删除文件头(列名),并使用给定的插入查询将插入体设置到关联的MySql表中。
对于传入的文件,它就像一个魅力。
但是当应用程序/ Camel进程未启动时,FTP目录可能会填满大量文件。 在这种情况下启动应用程序时会出现性能问题。
我使用某个文件ammount阈值获得以下异常:
Cause: org.springframework.jdbc.CannotGetJdbcConnectionException:
Could not get JDBC Connection;
nested exception is java.sql.SQLNonTransientConnectionException:
Could not connect to localhost:3306 : Cannot assign requested address
我尝试在每条路线上添加一个延迟,但是进展顺利,但速度很慢。
我在猜测(我可能会添加)路由线程之间存在争用(如果这是每个路由的一个线程如何工作?)和dataSource的单个数据库连接。
是不是这样,如果解决这个问题的最佳策略(连接池?或者对所有路由使用单个共享线程或......)?
我在上面使用的Camel场景中有哪些其他策略可以提高性能?
非常感谢任何意见和反馈。
欢呼声。