CometD客户端Java APIn如何实现



对于我的项目,我必须使用pubsubcometD订阅者。我使用Oracle Weblogic应用服务器用于两个应用程序。其中一个将一些消息发布到pubsubs通道,另一个订阅通道以显示消息。我的pubsub服务器也在weblogic应用服务器上,并配置了一些xml文件(weblogic.xml和weblogic-pubsub.xml)。下面是我的pubsub服务器配置(weblogic-pubsub.xml):

<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>

它工作得很好,因为我的第二个应用程序可以订阅频道与cometD订阅者javascript API和dojo工具包。现在订阅在我的web应用程序的客户端完成了,多亏了这个Javascript API。

订阅是如何在客户端(Javascript API)使用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();
}); 

这个客户端实现工作得很好,onEvent()函数在消息到达pubsub通道时被很好地触发。

现在,我希望订阅和消息处理完成服务器端。为此,我知道CometD还有一个客户端Java API,允许订阅pubsub通道并处理消息。但我还没有成功。

下面是我尝试按照cometd3文档(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");
        }
    }
}

这是一个vadin框架组件,通道订阅和消息侦听器在try块中完成。我有以下错误在代码行HttpClient HttpClient = new HttpClient();:严重:java.lang.IncompatibleClassChangeError: org/eclipse/jetty/client/HttpClient

onMessage函数永远不会被触发…

你能帮我一下吗?

谢谢你,

首先,我认为WebLogic可能会发布一个非常旧的CometD版本,或者是一个与CometD项目的官方版本不匹配的非常定制的版本。

dojox.cometd.callbackPollTransport不是CometD项目中曾经存在的东西,它可能是CometD为0时的草稿尝试。

你有机会有一个正式的CometD 3。使用WebLogic提供的"CometD"的x客户端工作非常少。我怀疑它们是否兼容。

此外,我不认为Vaadin能够翻译你上面用JavaScript写的组件。不久前,有人用JavaScript为CometD编写了绑定,但这些绑定从未正式进入CometD项目(缺乏吸引力,参见https://github.com/cometd/cometd/issues/63),所以我不确定它们现在处于什么状态。

IncompatibleClassChangeError可能是由于您使用的JDK比JDK 7和cometd3早。

恐怕你得重新考虑整个系统了。

我建议坚持使用服务器上的官方CometD(不是WebLogic提供的那个),如果你真的必须使用Vaadin/GWT,看看过去人们是如何编写这些绑定的,如果你不能使用这些库,也许可以复制它们。

一旦有了Vaadin/GWT绑定,服务器中有了正式的CometD和JDK 7+,就可以了。

最新更新