对于我的项目,我必须使用 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函数永远不会被触发......
你能给我一些帮助吗?
谢谢,