2016-07-12 9 views
0

Ich versuche, RabbitMQ mit https://github.com/php-amqplib/RabbitMqBundle und Symfony2 Framework zu implementieren.Oldsound Rabbitmq Bündel mehrere Verbraucher Konfiguration

Ich habe es geschafft, die Sache mit 1 Hersteller und 1 Verbraucher arbeiten, aber das Problem ist, wenn ich mehrere Verbraucher verwenden.

Dies ist meine Konfiguration:

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 

Service-Definitionen:

<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> 

Und auf PHP-app/console rabbitmq: Verbraucher -d i erhalten soccer_team_stat_form:

[Symfony \ Component \ DependencyInjection \ Exception \ ServiceNotFoundException] Sie haben einen nicht existenten Dienstangefordert"old_sound_rabbit_mq.soccer_team_stat_form_consumer".

Ich habe verschiedene Kombinationen versucht, einschließlich multiple_consumers Konfigurationsschlüssel, aber ohne Erfolg. Was ich vermisse?

Antwort

1

Wenn keine routing_key und binding_key gesetzt sind, direct Austausch wie fanout verhalten und die Nachrichten an alle Warteschlangen senden Sie es weiß, so auf das, was ich von Ihrer Konfigurationen zu sehen bin, sind Sie besser dran fanout mit so tun wie unten.

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 

Diese RabbitMQ fanout example with symfony including 2 Producer & 2 Exchange & 2 Queue & N Worker & 2 Consumer ist die vollständige Beispiel (tatsächlich die vollständige Antwort auf Ihre Frage/bereits Version von dem, was Sie wollen tun), das zeigt, wie sich die Dinge in symfony Anwendungen fertig sind. Ich würde vorschlagen, dass Sie dem dort verwendeten Muster folgen. Sehr einfach zu folgen und beizubehalten. Wenn Sie weitere Beispiele wünschen, suchen Sie einfach nach dem Stichwort RabbitMQ in diesem Blog.

Verwandte Themen