承前
ブラウザ->ウェブアプリ->ActiveMQ->ApacheCamel->AWS S3
と言うルートを考えてみましょう。
JMS(Java Message Service) と Producer と Consumer
- JMSは歴史的経緯から、とにかく複雑な仕様で、正直に向き合うと、げんなりしてしまうのですけどね…。
- まぁ、シンプルに
Producer->ActiveMQ->Consumer
で、送信元Producer
が、受信元Consumer
に向けて、オブジェクトをメッセージとして送る、オブジェクトのエンコード/デコードを簡単に(?)やってくれる、と、考えたら良いと思います。- 今回は
ウェブアプリ
がProducer
の役割ですね。
- 今回は
ウェブアプリケーションに画像アップロード
- 結局、ファイル名と拡張子を文字列で取れて、画像のデータを
byte[]
か、InputStream
で取れれば良いと思います。
画像データをActiveMQに送信する
- JMSの使用 - Quarkus
- 依存関係に Quarkus Artemis JMS Runtimeを忘れずに。
application.properties
にquarkus.artemis.***=
を記述することを忘れないように。- そうすると、
ConnectionFactory
もDI対象になりますよ。
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);
}
}