2016-05-25 5 views
0

Ich habe ein System, wo externe Systeme Ereignisse abonnieren können, die von meinem System generiert werden. Das System wird in Grails 2 geschrieben, wobei RabbitMQ plugin für die interne Nachrichtenübermittlung verwendet wird. Die Ereignisse zu externen Systemen werden über HTTP kommuniziert.Create Queue Runtime in Grails mit RabbitMQ Plugin

Ich möchte eine Warteschlange für jeden Abonnenten erstellen, um zu verhindern, dass ein langsamer Abonnentenendpunkt Nachrichten an einen anderen Abonnenten verlangsamt. Subskriptionen können zur Laufzeit auftreten, deshalb ist es nicht wünschenswert, Warteschlangen in der Anwendungskonfiguration zu definieren.

Wie kann ich mit dem Grails RabbitMQ-Plugin eine Warteschlange mit einer Themenbindungslaufzeit erstellen?

Da das Lesen von Nachrichten aus RabbitMQ-Warteschlangen direkt mit Diensten verbunden ist, könnte ein Nebenproblem beim Erstellen der Warteschlangenlaufzeit mehrere Instanzen des Grails-Dienstes haben. Irgendwelche Ideen?

Antwort

0

I Frühling landete mit AMQP, das vom Grails RabbitMQ-Plugin verwendet wird. Einige Methoden/Argumente wurden entfernt, da sie für die Stichprobe nicht relevant sind:

-1

Ich schlage vor, dies zu überprüfen (https://www.infoq.com/presentations/api-io-state). Ich habe ein API-Plugin für Grails 3.1 eingereicht, um den E/A-Status und die abstrakte API-Funktionalität von Controllern zu teilen, damit es mit Diensten in einer verteilten Architektur geteilt werden kann. Das Grails-Team scheint jedoch andere Regeln anzuwenden als andere in der Community. .

Es würde Ihr Problem lösen, aber es wird wahrscheinlich nie veröffentlicht werden.

1

Ich habe eine fertige Lösung nicht für Sie, aber wenn Sie den Code in dem RabbitmqGrailsPlugin Descriptor insbesondere den doWithSpring Abschnitt folgen sollten Sie in der Lage sein, die Schritte erstellen notwendig, ein neues Queue und die damit verbundenen Listener dynamisch zur Laufzeit zu initialisieren.

Es kommt dann alles auf, um die notwendigen Parameter zu übergeben, notwendige Frühlingsbohnen zu registrieren und die Zuhörer zu starten.

Um Ihre zweite Frage zu beantworten, denke ich, dass Sie einige Namenskonvention und erstellen Sie einen neuen Warteschlangenhandler für jede Warteschlange erstellen können. Ein Beispiel, wie Feder Bohnen erstellen dynamisch hier: dynamically declare beans

Nur ein kurzes Beispiel, wie ich schnell eine Warteschlange es erfordert viel mehr Verdrahtung usw. registrieren würde ...

def createQ(queueName) { 
    def queuesConfig = { 
     "${queueName}"(durable: true, autoDelete: false,) 
    } 
    def queueBuilder = new RabbitQueueBuilder() 
    queuesConfig.delegate = queueBuilder 
    queuesConfig.resolveStrategy = Closure.DELEGATE_FIRST 
    queuesConfig() 

    queueBuilder.queues?.each { queue -> 
     if (log.debugEnabled) { 
      log.debug "Registering queue '${queue.name}'" 
     } 
     BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(Queue.class); 
     builder.addConstructorArgValue(queue.name) 
     builder.addConstructorArgValue(Boolean.valueOf(queue.durable)) 
     builder.addConstructorArgValue(Boolean.valueOf(queue.exclusive)) 
     builder.addConstructorArgValue(Boolean.valueOf(queue.autoDelete)) 
     builder.addConstructorArgValue(queue.arguments) 
     DefaultListableBeanFactory factory = (DefaultListableBeanFactory) grailsApplication.mainContext.getBeanFactory(); 
     factory.registerBeanDefinition("grails.rabbit.queue.${queue.name}", builder.getBeanDefinition()); 
    } 
}