私は、Camelを使用してバイナリファイルをフォルダからMySQLデータベースにロードするためのアプローチについていくつかのガイダンスが必要です。基本的には私たちのPBXシステムからの音声ログをデータベースに保存したいのです。音声ログを含むディレクトリはリモートディレクトリになりますSQLデータベースへのバイナリファイルApache 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"/>
そして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();
}
}
[OK]を、短い説明が私は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にprepared statementを作成し、これをjdbcコンポーネントに渡すことはできますか? また、LOAD_FILE()関数を使用せずにINSERT文を作成するにはどうすればよいですか?
私はLOAD_FILE()関数を使用しなければならないので、私は今はunixとwindowsの両方のファイルパスを扱う必要があります。これは難しいことではありませんが、OS固有のコードを自分のアプリケーションに入れるというアイデアは気になりません(回避策のように感じます)。
ここまで誰も私が上記の点についていくつかのガイダンスを与えることができるキャメルを使用してMySQLデータベースにバイナリファイルをアップロードしました。私は問題を回避することができますが、私は物事を行う明確な方法が欠けていないことを確認したいだけです。
私はここを見て、ほとんどがテキストファイルを扱う人しか見つけませんでした。みんなファイルシステムにファイルを保存し、データベースにリンクする私のルートに行ってはいけません。私たちには、データベースに格納する必要性を徹底させる非常に特殊な災害復旧要件と法的要件があります。
私はラクダについては何も知らないけど、メッセージの内容をbase64の文字列でエンコーディングしてデータベースに挿入するのはあなたの仕事ですか?その後、あなたは通常の挿入を行うことができます。 – Icarus
それは確かに一つの可能性です。私はそれについていくつかの研究をしており、私はファイルのバイト[]へのアクセス権を持っているようです。私が実例を見つけることができなかったことの1つは、このバイト[]をmysqlに挿入する方法です。ほとんどの例などはJDBCプリペアドステートメントを使用していますが、これは使いやすいものですが、私はキャメルでこれをどうやって行うのか分かりません。もう1つの可能性は、JDBCコンポーネントを完全にバイパスし、単純な古いjdbcをBean内で使用することです。物事が進むにつれて実験し、報告します。 – Namphibian