Для моего проекта я должен использовать подписчика 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 никогда не запускается...
Можете ли вы помочь мне, пожалуйста?
Спасибо,