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,
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. –