2016-07-12 17 views
0

https://github.com/php-amqplib/RabbitMqBundleとSymfony2フレームワークでRabbitMQを実装しようとしています。Oldsound rabbitmq bundle複数の消費者設定

私は、1人のプロデューサーと1人のコンシューマーで問題なく動作させることができましたが、問題は複数のコンシューマーを使用する場合です。

これは私の設定です:

old_sound_rabbit_mq: 
    connections: 
     default: 
      host:  'localhost' 
      port:  5672 
      user:  'guest' 
      password: 'guest' 
      vhost: '/' 
      lazy:  false 
      connection_timeout: 3 
      read_write_timeout: 3 

      # requires php-amqplib v2.4.1+ and PHP5.4+ 
      keepalive: false 

      # requires php-amqplib v2.4.1+ 
      heartbeat: 0 

      #requires php_sockets.dll 
#   use_socket: true # default false 
    producers: 
     soccer_team_stat: 
      connection:  default 
      exchange_options: {name: 'soccer_team_stat_ex', type: direct} 
      queue_options: {name: 'soccer_team_stat_qu'} 
     soccer_team_stat_form: 
      connection: default 
      exchange_options: {name: 'soccer_team_stat_ex', type: direct} 
      queue_options: {name: 'soccer_team_stat_form_qu'} 
    consumers: 
     soccer_team_stat: 
      connection:  default 
      exchange_options: {name: 'soccer_team_stat_ex', type: direct} 
      queue_options: {name: 'soccer_team_stat_qu'} 
      callback:   myapp.soccer_team_stat.consume 
     soccer_team_stat_form: 
      connection:  default 
      exchange_options: {name: 'soccer_team_stat_ex', type: direct} 
      queue_options: {name: 'soccer_team_stat_form_qu'} 
      callback:   myapp.soccer_team_stat_form.consume 

サービスの定義:

<services> 

     <service class="MyApp\EtlBundle\Producers\SoccerTeamStatProducer" id="myapp.soccer_team_stat.produce"> 
      <argument type="service" id="old_sound_rabbit_mq.soccer_team_stat_producer"/> 
     </service> 

     <service class="MyApp\EtlBundle\Producers\SoccerTeamStatProducer" id="myapp.soccer_team_stat_form.produce"> 
      <argument type="service" id="old_sound_rabbit_mq.soccer_team_stat_producer"/> 
     </service> 

     <service class="MyApp\EtlBundle\Consumers\SoccerTeamStatConsumer" id="myapp.soccer_team_stat.consume"> 
      <argument type="service" id="service_container"/> 
     </service> 

     <service class="MyApp\EtlBundle\Consumers\SoccerTeamStatFormConsumer" id="myapp.soccer_team_stat_form.consume"> 
      <argument type="service" id="service_container"/> 
     </service> 

    </services> 

とPHPアプリ/コンソールRabbitMQの上:消費者がsoccer_team_stat_formを-d私が手:

[symfonyの\コンポーネント\ DependencyInjection \ Exception \ ServiceNotFoundException] 存在しないサービスを要求しました "old_sound_rabbit_mq.soccer_team_stat_form_consumer"

私はmultiple_consumers設定キーを使用してさまざまな組み合わせを試しましたが、成功しませんでした。私は何が欠けているのですか? routing_keybinding_keyのどちらも設定されている場合

答えて

1

direct交換がfanoutのように動作しますので、私はあなたの構成から見ているものに基づいて、あなたはfanoutを使用してオフに優れていることは知っているすべてのキューにメッセージを送信するので、好きです以下。

old_sound_rabbit_mq: 
    connections: 
     default: 
      host:  %rabbit_mq_host% 
      port:  %rabbit_mq_port% 
      user:  %rabbit_mq_user% 
      password: %rabbit_mq_pswd% 
      vhost: /
      lazy:  true 
    producers: 
     soccer_team_stat: 
      connection:  default 
      exchange_options: { name: 'soccer_team_stat_ex', type: fanout } 
     soccer_team_stat_form: 
      connection:  default 
      exchange_options: { name: 'soccer_team_stat_form_ex', type: fanout } 
    consumers: 
     soccer_team_stat: 
      connection:  default 
      exchange_options: { name: 'soccer_team_stat_ex', type: fanout } 
      queue_options: { name: 'soccer_team_stat_qu' } 
      callback:   myapp.soccer_team_stat.consume 
     soccer_team_stat_form: 
      connection:  default 
      exchange_options: { name: 'soccer_team_stat_form_ex', type: fanout } 
      queue_options: { name: 'soccer_team_stat_form_qu' } 
      callback:   myapp.soccer_team_stat_form.consume 

このRabbitMQ fanout example with symfony including 2 Producer & 2 Exchange & 2 Queue & N Worker & 2 Consumerは、物事はsymfonyのアプリケーション内で行われる方法を示します(実際にはすでにあなたがをやりたいのバージョンを作ったあなたの質問/への完全な答えは)完全な例です。そこに使われているパターンに従うことをお勧めします。非常に追跡して維持するのは簡単です。より多くの例が必要な場合は、そのブログのキーワードRabbitMQを検索してください。

関連する問題