Java API клиента CometD Как это сделать?

Для моего проекта я должен использовать подписчика pubsub и cometD. Я использую сервер приложений 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 subscirber javascript API и инструментария dojo. Итак, теперь подписка выполняется на стороне клиента моего веб-приложения благодаря этому 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 и обрабатывать сообщения. Но мне это не удалось.

Вот что я пытался сделать для серверной части в соответствии с документацией CometD 3 (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");
        }
    }

}

Это компонент фреймворка Vaadin, подписка на канал и прослушиватель сообщений выполняются в блоке try. У меня есть следующая ошибка в строке кода HttpClient httpClient = new HttpClient(); : СЕРЬЕЗНЫЙ: java.lang.IncompatibleClassChangeError: org/eclipse/jetty/client/HttpClient

И функция onMessage никогда не запускается...

Можете ли вы помочь мне, пожалуйста?

Спасибо,


person Guney Mutlu    schedule 30.10.2016    source источник


Ответы (1)


Прежде всего, я думаю, что WebLogic может поставлять очень старую версию CometD или сильно модифицированную версию, которая не соответствует официальной с Проект CometD.

dojox.cometd.callbackPollTransport не было чем-то, что когда-либо существовало в проекте CometD, это, вероятно, была попытка проекта, когда CometD был 0.x, или что-то, что не было официально выпущено, или что-то, созданное WebLogic.

Ваши шансы на то, что официальный клиент CometD 3.x будет работать с CometD, поставляемым WebLogic, очень малы. Сомневаюсь, что они совместимы.

Кроме того, я не думаю, что Vaadin сможет перевести компонент, который вы написали выше, на JavaScript. Некоторое время назад люди писали привязки для CometD на JavaScript, но они так и не вошли официально в проект CometD (отсутствие поддержки, см. https://github.com/cometd/cometd/issues/63), поэтому я не уверен, в каком они сейчас состоянии.

IncompatibleClassChangeError, вероятно, связано с тем, что вы используете JDK старше JDK 7, а CometD 3.x работает только с JDK 7+.

Боюсь, вам придется переосмыслить всю систему.

Я бы посоветовал придерживаться официального CometD на сервере (не того, который поставляется WebLogic), и если вам действительно нужно использовать Vaadin/GWT, посмотрите, как люди писали эти привязки в прошлом, и, возможно, воспроизведите их, если вы не могу использовать эти библиотеки.

Если у вас есть привязки Vaadin/GWT, официальный CometD на сервере и JDK 7+, все должно быть хорошо.

person sbordet    schedule 30.10.2016
comment
Спасибо за ваш ответ @sbordet. API CometD, который я использовал в своем проекте, включен в maven. Я не использую тот, который поставляется WebLogic. dojox.cometd.callbackPollTransport — это моя реализация клиента Javascript для подписки и обработки сообщений, и, тем не менее, она работает. Я проверю свою версию JDK и повторю попытку с JDK 8, чтобы увидеть, появится ли исключение снова. Я не хочу, чтобы Vaadin переводил компонент в Javascript, наоборот, я хочу, чтобы он управлялся на стороне сервера, а не на стороне клиента. - person Guney Mutlu; 31.10.2016