2016-10-30 2 views
0

Для моего проекта я должен использовать pubsub и cometD подписчик. Я использую Oracle Weblogic сервер приложений для двух приложений. Один из них публикует несколько сообщений для каналов pubsubs, а другой подписывается на каналы для отображения сообщений. Мой сервер pubsub также находится на сервере приложений weblogic и настроен с некоторыми файлами xml (weblogic.xml и weblogic-pubsub.xml). Вот как настроен мой PubSub сервер (WebLogic-pubsub.xml):CometD клиент Java APIn как?

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

И это хорошо работает, потому что мое второе приложение может susbscribe к каналу с cometD subscirber JavaScript API и Dojo Toolkit. Итак, теперь подписка выполняется на клиентской стороне моего веб-приложения благодаря этому Javascript API.

Вот как подписка делается на стороне клиента (JavaScript API) с Dojo Toolkit:

//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, подписка канала и сообщения слушателя сделаны в попытке блок. У меня есть следующая ошибка в строке кода HttpClient httpClient = new HttpClient(); : СИЛЬНЫЙ: java.lang.IncompatibleClassChangeError: орг/затмение/Пристань/клиент/HttpClient

И функция OnMessage никогда не уволят ...

Можете ли вы принести мне некоторую помощь, пожалуйста?

Спасибо,

ответ

0

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

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+, вы должны быть хорошими.

+0

Благодарим за отзыв @sbordet. API CometD, который я использовал в моем проекте, включен в maven. Я не использую тот, который поставляется WebLogic. Dojox.cometd.callbackPollTransport - это моя клиентская реализация Javascript для подписки и обработки сообщений, но она работает. Я проверю версию JDK и повторю попытку с JDK 8, чтобы увидеть, появится ли исключение. Я не хочу, чтобы Vaadin переводил компонент в Javascript, наоборот, я хочу, чтобы он управлялся на стороне сервера и больше не на стороне клиента. –

Смежные вопросы