0

akka-camel を使用して rabbitmq 交換にサブスクライブしています。これらのアクターはいくつか作成されます... 要求ごとに 1 つroutingKeyです。交換とキューは変更されません。新しいものが要求されるたびroutingKeyに、新しいアクターを作成します。新しいチャネルが作成される代わりに、まったく新しい接続が作成されますが、これは望ましくありません。Consumer アクターが作成されるたびに新しい接続が作成される理由がよくわかりません。

アクター コードは次のとおりです。

class CommandConsumer(routingKey: String)
  extends Consumer with ActorLogging {

  override def endpointUri = s"rabbitmq://localhost/hub_commands?exchangeType=topic&queue=test&autoDelete=false&routingKey=$routingKey"

  override def receive: Receive = {
    case msg: CamelMessage => {
      log.debug(s"received {}", msg.bodyAs[String])
      sender ! msg.bodyAs[String]
    }
  }
}

私はこのようなアクターを作成しています:

context.actorOf(CommandConsumer.props("my.routing.key", sender))

アップデート

これがまさに私が達成する必要があるものです:

クライアント接続が受け入れられたときに、バックエンド アーキテクチャ内の他のコンポーネントからメッセージを受信する必要がある TCP/IP サーバーを作成しています。これを行うには、RabbitMQ を使用したいと思います。サーバーへの接続が成功すると、クライアントは ID を送信します。これは、ルーティング キーの一部として使用されます (例: command.<id>)。最初のクライアントが接続すると、RabbitMQ 接続とキューが作成され、ルーティング キーは次のようになりますcommand.first_id。次のクライアントが接続するときに、RabbitMQ への新しい接続を作成せずに、既に受け入れられているルーティング キーのリストにルーティング キーを追加 したいと考えています。command.second_d

4

1 に答える 1

1

私はそれが期待されていると信じています。各 Akka Camel アクターは、他から独立した独自の Camel コンテキストを持ちます。つまり、作成する新しいアクターごとに、新しい RabbitMQ 接続と新しいチャネルを保持する新しい RabbitMQ エンドポイントを持つ新しい camel コンテキストを作成することになります。

あなたのシナリオで、キューとエクスチェンジが変更されず、ルーティング キーだけが変更される場合、1 つの Akka Camel アクターがキューから消費し、別のアクターがバインディングを管理しないのはなぜですか。消費する必要がある新しいルーティング キーがあるたびに、このアクターは新しいルーティング キーを使用して、rabbitmq 接続、チャネル、および呼び出しを作成しqueueBind()ます。また、同じアクターに不要なルーティング キーのバインドを解除させることもできます。

于 2015-05-15T16:56:45.370 に答える