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