2016-04-09 9 views
0

Ich habe eine Cometd-App im Steg laufen. Ich möchte eingehende Broadcasts von Clients abrufen, dann eine Verarbeitung durchführen (einschließlich der Interaktion mit der db) und dann die Übertragung an alle Abonnenten beenden, wenn keine Fehler auftreten.CometD: Broadcast-Nachrichten vor dem Senden verarbeiten

Mein erster Gedanke ist, dies mit einer Erweiterung zu tun, aber gibt es einen geeigneteren Weg?


Hier ist mein modifizierte Versuch auf @sbordet Antwort basiert:

@Inject 
private BayeuxServer bayeux; 
@Session 
private ServerSession serverSession; 

    @Listener("/service/*") 
    public void handle(ServerSession remote, ServerMessage message) { 
     System.out.println("Message received on service: " + message); 

     String broadcastChannel = message.getChannel().replace("/service", ""); 
     System.out.println("bayeux: " + bayeux + " - sending: " + broadcastChannel + " - " + message.getData()); 
     System.out.println("bayeux.getChannel(broadcastChannel): " + bayeux.getChannel(broadcastChannel)); 
     bayeux.getChannel(broadcastChannel).publish(serverSession, message.getData()); 
    } 

Grund mag ich für alle Servicekanäle hören, und einige Verarbeitung tun, dann auf den gleichen Broadcast-Kanal veröffentlichen, weniger der Service. Also,/service/test wird/test.

Dieser Strom liefert eine Null für bayeux.getChannel(broadcastChannel)

Antwort

1

Weil Sie beschreiben, was ist eine normale Nachrichtenverarbeitung innerhalb CometD, verwenden Sie nicht extensions, aber services.

Erweiterungen sollten für die Fälle verwendet werden, in denen Sie das Verhalten des Bayeux-Protokolls ändern möchten, das den Kern von CometD bildet.

Dienste hingegen sind eine praktische Möglichkeit, Geschäftsnachrichten zu verarbeiten, die Ihre Anwendung austauscht und daher ideal für Ihren Fall ist.

+0

Wenn ich 'bayeux.getChannel (broadcastChannel)) verwende;} dann gibt' getChannel() 'Methode null zurück ... – mtyson

+0

Ich nehme den Dienstkanal,'/service/test' und dann über '/ test' - Das scheint die richtige Semantik zu sein. Aber Bayeux (injiziert über Spring) gibt null für getChannel ('/ test') zurück – mtyson

+0

Ich aktualisierte die Antwort mit weiteren Details zur Verwendung Ihres Ansatzes ... – mtyson