ブラウザ->ウェブアプリ->ActiveMQ->ApacheCamel->AWS S3
と言うルートを考えてみましょう。
- ウェブアプリでEXIF情報を消去したり、画像縮小を行ってS3にアップロードするには、少々重たい処理ですね。
- ウェブアプリはDockerで建てているのだから、
ActiveMQ
も Consumerである Apache Camel
もDockerでインスタンス作って、メッセージ送信/受信したらいいよね。
- …と、思ったら、意外と大変だった、と言う感じです。
JMS(Java Message Service) と Producer と Consumer
- JMSは歴史的経緯から、とにかく複雑な仕様で、正直に向き合うと、げんなりしてしまうのですけどね…。
- まぁ、シンプルに
Producer->ActiveMQ->Consumer
で、送信元Producer
が、受信元Consumer
に向けて、オブジェクトをメッセージとして送る、オブジェクトのエンコード/デコードを簡単に(?)やってくれる、と、考えたら良いと思います。
- 今回は
ウェブアプリ
がProducer
の役割ですね。
- 結局、ファイル名と拡張子を文字列で取れて、画像のデータを
byte[]
か、InputStream
で取れれば良いと思います。
public void uploadImage(String fileName, InputStream file) {
try (JMSContext context = this.connectionFactory.createContext(JMSContext.AUTO_ACKNOWLEDGE);
ByteArrayOutputStream out = new ByteArrayOutputStream()) {
// ファイル読み込み
file.transferTo(out);
out.flush();
// メッセージ作成
BytesMessage message = context.createBytesMessage();
message.setStringProperty("fileName", fileName);
message.writeBytes(out.toByteArray());
// トピックを送信
context.createProducer().send(context.createTopic("upload.image"), message);
} catch (IOException | JMSException e) {
throw new RuntimeException(e);
}
}