当前位置: 首页 > 工具软件 > CometD > 使用案例 >

cometd java_CometD客户端Java APIn如何?

蒋高杰
2023-12-01

对于我的项目,我必须使用 pubsub 和 cometD 订阅者 . 我使用Oracle Weblogic 应用程序服务器进行两次应用程序 . 其中一个向pubsubs Channels 发布一些消息,另一个订阅 Channels 以显示消息 . 我的pubsub服务器也在weblogic应用服务器上,并配置了一些xml文件(weblogic.xml和weblogic-pubsub.xml) . 以下是我的pubsub服务器的配置方式(weblogic-pubsub.xml):

/gip/**

all-permissions

Grant all permissions for everything by everyone

/gip/*

它运行良好,因为我的第二个应用程序可以使用 cometD subscirber javascript API 和dojo工具包进行通道 . 因此,由于此Javascript API,现在订阅已在我的Web应用程序的客户端完成 .

以下是使用dojo工具包完成订阅客户端(Javascript API)的方法:

//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();

});

这个 client side 实现运行良好,当消息到达pubsub通道时,onEvent()函数被很好地触发 .

现在,我希望订阅和消息处理完成 server side . 为此,我了解到CometD还有一个客户端Java API,允许订阅pubsub通道并处理消息 . 但我没有成功做到这一点 .

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 options = new HashMap();

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");

}

}

}

这是一个Vaadin框架组件,通道订阅和消息监听器在try块中完成 . 我在代码行HttpClient httpClient = new HttpClient(); : SEVERE: java.lang.IncompatibleClassChangeError:org / eclipse / jetty / client / HttpClient

并且onMessage函数永远不会被触发......

你能给我一些帮助吗?

谢谢,

 类似资料: