Мне нужно несколько советов о том, какой подход использовать для загрузки бинарных файлов из папки в базу данных MySQL с использованием Camel. По сути, я хочу хранить голосовые журналы нашей АТС в базе данных. Каталог с голосовыми журналами будет удаленным каталогом
Я разработал прототип, но я не уверен, что это действительно эффективно, он работает, но я не доволен дизайном. Позвольте мне объяснить, что я делаю. Верблюжий маршрут выглядит следующим образом:
<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"/>
А код для bean-компонента fileToSQL:
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();
}
}
Хорошо, короткое объяснение Я получаю файловый компонент для использования файлов, затем строю строку SQL, используя функцию MySQL LOAD_FILE () для загрузки файла.
Мои мысли об этом:
Функция 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>
Однако, поскольку у меня есть доступ к содержимому файлов в сообщении от потребителя файлов, у меня должна быть теоретическая возможность получить доступ к телу / содержимому строки и создать команду SQL, которая НЕ использует функцию LOAD_FILE () ,
Единственный способ, которым я знаю, как построить такую строку, - использовать подготовленный оператор JDBC. Это было бы первым призом, если бы я мог как-то создать оператор вставки с содержимым от потребителя файла.
Могу ли я создать подготовленный оператор в моем bean-компоненте fileToSQL и передать его моему компоненту jdbc?
Или как мне создать оператор INSERT без функции LOAD_FILE ()?
Поскольку я должен использовать функцию LOAD_FILE (), мне теперь придется обслуживать как UNIX, так и Windows FilePath. Хотя это не должно быть сложным, мне просто не нравится идея вставлять специфический для ОС код в мои приложения (похоже на обходной путь).
Кто-нибудь здесь загружал двоичные файлы в базу данных MySQL, используя Camel, который может дать мне несколько советов по вышеуказанным пунктам. Хотя я мог бы обойти проблемы, я просто хочу убедиться, что я не пропускаю очевидный способ делать вещи.
Я осмотрелся здесь и нашел только людей, работающих в основном с текстовыми файлами. Ребята, пожалуйста, даже не идите по пути, когда я храню файл в файловой системе и связываю его с базой данных. У нас есть очень специфические требования к аварийному восстановлению и юридические требования, которые заставляют меня хранить его в базе данных.