我需要一些关于使用 Camel 将二进制文件从文件夹加载到 MySQL 数据库的方法的指导。基本上我想将 PBX 系统中的语音日志存储到数据库中。包含语音日志的目录将是远程目录
我设计了一个原型,但我不确定这是否真的有效,它有效,但我对设计不满意。让我解释一下我在做什么。骆驼路线如下:
<camelContext xmlns="http://camel.apache.org/schema/spring">
<package>com.hia.camelone</package>
<route>
<from uri="file://c:/CTest/Inbox?noop=true&recursive=true&delay=3000"/>
<to uri="bean://fileToSQL"/>
<to uri="jdbc://timlogdb"/>
</route>
</camelContext>
<bean id="timlogdb" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value=" com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/TimLog" />
<property name="username" value="root" />
<property name="password" value="blahblah" />
</bean>
<bean id="fileToSQL" class="com.hia.camelone.fileToSQL"/>
fileToSQL bean 的代码是:
public class fileToSQL {
public String toString(@Headers Map<String,Object> header, @Body Object body){
StringBuilder sb = new StringBuilder();
String filename =(String)header.get("CamelFileNameOnly");
String escapedFileName = StringEscapeUtils.escapeJava(filename).replace("\'", "");
String filePath = StringEscapeUtils.escapeJava((String)header.get("CamelFilePath"));
sb.append("insert into FileLog ");
sb.append("(FileName,FileData) values (");
sb.append("'").append(escapedFileName).append("',").append("LOAD_FILE(\"").append(filePath).append("\")");
sb.append(")");
System.out.println(sb.toString());
System.out.println(body);
System.out.println(header.toString());
return sb.toString();
}
}
好吧,简短的解释是,我让文件组件使用文件,然后使用 MySQL LOAD_FILE() 函数构建 SQL 字符串来加载文件。
我对此的想法:
LOAD_FILE 函数仅适用于本地计算机,因此此路由仅适用于本地计算机上的文件。我可以使用文件生成器将文件从某个远程目录复制到本地目录,然后使用该路由。那么我的路线将是这样的:
<route>
<from uri="file://c:/CTest/Inbox?noop=true&recursive=true&delay=3000"/>
<to uri="file://c:/outbox"/>
<to uri="bean://fileToSQL"/>
<to uri="jdbc://timlogdb"/>
</route>
然而,由于我可以访问来自文件使用者的消息中的文件内容,理论上我应该能够访问字符串的主体/内容并构建不使用 LOAD_FILE() 函数的 SQL 命令。
我知道如何构建这样的字符串的唯一方法是使用 JDBC 的准备语句。如果我能以某种方式使用文件使用者的内容构建插入语句,这将是一等奖。
我可以在 fileToSQL bean 中创建准备好的语句并将其传递给我的 jdbc 组件吗?
或者如何在没有 LOAD_FILE() 函数的情况下构建 INSERT 语句?
由于我必须使用 LOAD_FILE() 函数,所以我现在必须同时满足 UNIX 和 Windows 文件路径的要求。虽然这应该不难,但我只是不喜欢将操作系统特定代码放入我的应用程序中的想法(感觉像是一种解决方法)。
这里的任何人都曾经使用 Camel 将二进制文件上传到 MySQL 数据库,他们可以就上述几点给我一些指导。虽然我可以解决这些问题,但我只是想确保我不会错过明显的做事方式。
我环顾四周,只发现人们主要使用文本文件。伙计们,请不要走我将文件存储在文件系统上并将其链接到数据库的路线。我们有一些非常具体的灾难恢复要求和法律要求,强制要求我将其存储在数据库中。