質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

1回答

336閲覧

Spring Cloud StreamでメッセージをN件まとめて取得する方法

guzzle

総合スコア43

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2019/01/19 08:25

前提・実現したいこと

Spring Cloud Streamを利用して、MQ(RabbitMQ or Kafka)に
キューイングされているメッセージをN件まとめて一気に取得したいのですが、やり方が分かっていません。
Spring Cloud Stream側の実装でできるものなのか、
ミドルウェアのMQの機能に依存するような事なのか、よく分かっていません。

該当のソースコード

以下はごくシンプルなコードで、キューイングされたメッセージを1件取得する例です。

Java

1@SpringBootApplication 2@EnableBinding(Sink.class) 3public class HelloSinkApplication { 4 5 public static void main(String[] args) { 6 SpringApplication.run(HelloSinkApplication.class, args); 7 } 8 9 @StreamListener(Sink.INPUT) 10 public void receive(String data) { 11 System.out.println("Received " + data); 12 } 13}

試したこと

MQにメッセージ送信側でList形式でデータをまとめて送信すれば、当然MQ受信側でまとめてデータを取得は可能です。

@StreamListener(Sink.INPUT) public void receive(String List<String> dataList) { }

そうではなく、MQ受信側で任意に決めた件数をまとめて一気に取得することがやりたいです。
プロパティの設定等を探してみましたが、それらしきものが見つからず。。。

また、以下のようにstaticなlistにaddして、ある件数になったら処理するみたいなことはできるのでしょうが、非常に微妙です。。。

public static List<String> dataList = new ArrayList<>(); @StreamListener(Sink.INPUT) public void receive(String data) { dataList.add(data); if(dataList.size >= 10) { } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

調べてみた限りですが、、、
根本的にConsumerからMQのBrokerに対して、複数のメッセージを取得するような事はできなさそうです。
ConsumerはBrokerとのコネクションを張っていて、メッセージを待ってるいるだけなので。

そのため、MQから送信されるメッセージをある程度まとめて処理したいようなユースケースの場合、以下のような事を行うアプリケーションを構築し、間に挟むような事が必要になってきそうです。

  1. MQメッセージを受信して外部ストレージにスタックする
  2. ある条件(指定件数、時間間隔)でポーリングして、単一メッセージN件データとして、MQにメッセージを送信する

Spring IntegrationのAggregatorに、上記のような事ができるような記述があるため、
https://docs.spring.io/spring-integration/docs/5.1.2.RELEASE/reference/html/messaging-routing-chapter.html#aggregator
このライブラリを使うか、あるいは自前で何か仕組みを実装することになると思われます。

投稿2019/02/05 11:58

guzzle

総合スコア43

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問