2016-10-30 1 views
0

Pour mon projet, je dois utiliser pubsub et abonné cometD. J'utilise Oracle Weblogic serveur d'application pour deux applications. L'un d'entre eux publie des messages sur les chaînes pubsubs et l'autre souscrit à des chaînes pour afficher les messages. Mon serveur pubsub est également sur le serveur d'applications weblogic et configuré avec certains fichiers xml (weblogic.xml et weblogic-pubsub.xml). Voici comment mon serveur PubSub est configuré (weblogic-pubsub.xml):Client CometD Java APIn comment?

<wlps:channel> 
    <wlps:channel-pattern>/gip/**</wlps:channel-pattern> 
</wlps:channel> 

<wlps:channel-constraint> 
    <wlps:channel-resource-collection> 
     <wlps:channel-resource-name>all-permissions</wlps:channel-resource-name> 
     <wlps:description>Grant all permissions for everything by everyone</wlps:description> 
     <wlps:channel-pattern>/gip/*</wlps:channel-pattern> 
    </wlps:channel-resource-collection> 
</wlps:channel-constraint> 

Et cela fonctionne bien parce que ma deuxième application peut espace abonné à canal avec l'API javascript subscirber de cometd et boîte à outils dojo. Alors maintenant l'abonnement est fait côté client de mon application web grâce à cette API Javascript.

Voici comment l'abonnement se fait côté client (API Javascript) avec la boîte à outils de dojo:

//Initialize Dojo (CometD) for pubsub events 
dojo.require("dojo.io.script"); 
dojo.require("dojox.cometd"); 
dojo.require("dojox.cometd.callbackPollTransport"); 

dojo.addOnLoad(function() 
{ 
    console.log("on load dojo"); 
    dojox.cometd.init("/WebInterface/cometd", { 
    }); 
    dojox.cometd.subscribe("/gip/**", onEvent); 

    initMap(); 
}); 

Cette implémentation côté client fonctionne bien, la fonction onEvent() est bien déclenché lorsque les messages atteignent le canal pubsub.

Maintenant, je voudrais que l'abonnement et le traitement des messages soient faits côté serveur. Pour cela, j'ai compris que CometD dispose également d'une API Java client permettant de s'abonner au canal pubsub et de gérer les messages. Mais je n'ai pas réussi à le faire.

Voici maintenant ce que j'ai essayé de faire pour le côté serveur suivant la cometd 3 documents (https://docs.cometd.org/current/reference/#_java_client):

import com.vaadin.ui.CustomComponent; 
import java.util.HashMap; 
import java.util.Map; 
import org.cometd.bayeux.Channel; 
import org.cometd.bayeux.Message; 
import org.cometd.bayeux.client.ClientSession; 
import org.cometd.bayeux.client.ClientSessionChannel; 
import org.cometd.client.BayeuxClient; 
import org.cometd.client.transport.ClientTransport; 
import org.cometd.client.transport.LongPollingTransport; 
import org.eclipse.jetty.client.HttpClient; 

public class WireServerCometD extends CustomComponent { 

    private static final String CHANNEL = "/gip"; 
    private final ClientSessionChannel.MessageListener gipListener = new GIPListener(); 

    public WireServerCometD() { 
     System.out.println("Wire CometD constructor"); 
     setSizeFull(); 
     setWidth(50, Unit.PERCENTAGE); 
     setHeight(300, Unit.PIXELS); 
     addStyleName("customBackground"); 

     try { 
      // Create (and eventually set up) Jetty's HttpClient: 
      HttpClient httpClient = new HttpClient(); 
      // Here set up Jetty's HttpClient, for example: 

      // Prepare the transport 
      Map<String, Object> options = new HashMap<String, Object>(); 
      ClientTransport transport = new LongPollingTransport(options, httpClient); 

      // Create the BayeuxClient 
      ClientSession client = new BayeuxClient("http://localhost:8080/WebInterface/cometd", transport); 

      client.getChannel(CHANNEL).addListener(new ClientSessionChannel.MessageListener() { 
       public void onMessage(ClientSessionChannel channel, Message message) { 
        if (message.isSuccessful()) { 
         // Here handshake is successful 
         System.out.println("Handshake is successfull"); 
        } 
       } 
      }); 
      client.handshake(); 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    private static class GIPListener implements ClientSessionChannel.MessageListener { 

     public void onMessage(ClientSessionChannel channel, Message message) { 
      System.out.println("message received"); 
     } 
    } 

} 

Ceci est un élément-cadre Vaadin, l'écouteur d'abonnement canal et le message sont effectués dans l'essai bloc. J'ai l'erreur suivante à la ligne de code HttpClient httpClient = new HttpClient(); : GRAVES: java.lang.IncompatibleClassChangeError: org/eclipse/jetée/client/HttpClient

Et la fonction onMessage est jamais tiré ...

Pouvez-vous me apporter un peu d'aide s'il vous plaît?

Merci,

Répondre

0

D'abord, je pense que WebLogic peut expédier un très ancienne version de cometd, ou un très personnalisé qui ne correspond pas à la version officielle de la CometD project. Le dojox.cometd.callbackPollTransport n'était pas quelque chose qui ait jamais existé dans le projet CometD, c'était probablement une ébauche de tentative lorsque CometD était 0.x, ou quelque chose qui n'était pas officiellement publié, ou quelque chose créé par WebLogic. Vos chances d'avoir un client CometD 3.x officiel avec le «CometD» livré par WebLogic sont très minces. Je doute qu'ils soient compatibles.

De plus, je ne pense pas Vaadin sera en mesure de traduire le composant que vous avez écrit ci-dessus en JavaScript. Un certain temps, les gens ont écrit des liaisons pour cometd en JavaScript, mais ceux ne sont jamais entrés officiellement le projet cometd (manque de traction, voir https://github.com/cometd/cometd/issues/63), donc je ne suis pas sûr dans quel état ils sont maintenant. Le IncompatibleClassChangeError est probablement dû au fait que vous utilisez un JDK plus ancien que JDK 7 et CometD 3.x ne fonctionne qu'avec JDK 7+.

Je crains que vous devrez repenser tout le système. Je suggère de rester avec le CometD officiel sur le serveur (pas celui fourni par WebLogic), et si vous devez vraiment utiliser Vaadin/GWT regardez comment les gens ont écrit ces fixations dans le passé, et peut-être répliquez-les si vous ne pouvez pas utiliser ces bibliothèques.

Une fois que vous avez les liaisons Vaadin/GWT en place, et le cometd officiel du serveur, et JDK 7+, vous devriez être bon.

+0

Merci pour votre réponse @sbordet. L'API CometD que j'ai utilisée dans mon projet est incluse avec maven. Je n'utilise pas celui expédié par WebLogic. Le dojox.cometd.callbackPollTransport est mon implémentation de client Javascript pour l'abonnement et la gestion des messages, mais cela fonctionne. Je vais vérifier ma version JDK et réessayer avec JDK 8 pour voir si l'exception apparaîtra à nouveau. Je ne veux pas que Vaadin traduise le composant en Javascript, au contraire je veux qu'il soit géré côté serveur et non plus côté client. –