2016-04-11 1 views
0

J'ai une solution de travail à mon problème, mais se demander s'il y a un moyen plus propre de le faire.rabbitmq Abonnez-vous à plusieurs services, mais dans une consommer mode round robin

Mon architecture est composée de plusieurs services, émettant des messages par un courtier RabbitMQ.

Certains travailleurs consomment ces messages et effectuent des tâches d'arrière-plan. Le fait est que je voulais être capable de créer différents types de travailleurs, tous ceux qui consomment les mêmes services et qui peuvent faire en sorte que plusieurs travailleurs du même type puissent faire le travail à tour de rôle.

Pour ce faire, les messages sont publiés par le service dans un pub/sous mode et consommés par un processus qui redistribue les messages dans une file d'attente de travail dédié à un ensemble de travailleurs.

Y a-t-il une manière plus élégante de faire ceci? Désolé, si l'explication n'est pas claire, je vais le modifier.

Merci!

(je aurais pu créer une file d'attente par travailleur dans les services, mais avec ma solution que je peux souscrire autant que je veux sans toucher aucun code)

Répondre

0

sonne comme un ajustement parfait pour topic exchange.

+0

Je ne les comprends de cette façon, peut-être que je ne l'ai pas lire à ce sujet assez. On dirait ce que je cherche. Je vais tester et voir. Merci beaucoup! – Sirf0x

+0

Vous êtes les bienvenus. – cantSleepNow

0

S'il vous plaît consulter: https://www.rabbitmq.com/tutorials/tutorial-two-java.html

Section "Round-robin dispatching"

Vous devez définir le paramètre channel.basicQos(X):

channel.basicQos(1); 

final Consumer consumer = new DefaultConsumer(channel) { 
    @Override 
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { 
    String message = new String(body, "UTF-8"); 

    System.out.println(" [x] Received '" + message + "'"); 
    try { 
     doWork(message); 
    } finally { 
     System.out.println(" [x] Done"); 
     channel.basicAck(envelope.getDeliveryTag(), false); 
    } 
    } 
};