CometD: обработка широковещательных сообщений перед широковещательной рассылкой

У меня есть приложение cometd, работающее внутри причала. Я хочу получать входящие трансляции от клиентов, затем выполнять некоторую обработку (включая взаимодействие с базой данных), а затем заканчивать трансляцией всем подписчикам, если ошибок не обнаружено.

Моя первоначальная мысль - сделать это с помощью расширения, но есть ли более подходящий способ?


Вот моя модифицированная попытка, основанная на ответе @sbordet:

@Inject
private BayeuxServer bayeux;
@Session
private ServerSession serverSession;

    @Listener("/service/*")
    public void handle(ServerSession remote, ServerMessage message) {
        System.out.println("Message received on service: " + message);

        String broadcastChannel = message.getChannel().replace("/service", "");
        System.out.println("bayeux: " + bayeux + " - sending: " + broadcastChannel + " - " + message.getData());
        System.out.println("bayeux.getChannel(broadcastChannel): " + bayeux.getChannel(broadcastChannel));
        bayeux.getChannel(broadcastChannel).publish(serverSession, message.getData());
    }

По сути, я хочу прослушивать все служебные каналы и выполнять некоторую обработку, а затем публиковать на том же широковещательном канале, за исключением /service. Итак, /service/test становится /test.

Этот ток возвращает ноль для bayeux.getChannel(broadcastChannel)


person mtyson    schedule 09.04.2016    source источник


Ответы (1)


Поскольку то, что вы описываете, является обычной обработкой сообщений внутри CometD, не используйте расширения, но услуги.

Расширения следует использовать в тех случаях, когда вы хотите изменить поведение протокола Bayeux, лежащего в основе CometD.

Службы, с другой стороны, представляют собой удобный способ обработки бизнес-сообщений, которыми обменивается ваше приложение, и поэтому идеально подходят для вашего случая.

person sbordet    schedule 11.04.2016
comment
Когда я использую bayeux.getChannel(broadcastChannel));, метод getChannel() возвращает значение null... - person mtyson; 12.04.2016
comment
Я беру служебный канал, /service/test, а затем вещаю по /test - это кажется правильной семантикой. Но байе (введенный через Spring) возвращает null для getChannel('/test') - person mtyson; 12.04.2016
comment
BayeuxServer.getChannel(String) следует использовать, когда вы априори знаете, что канал уже существует. В противном случае используйте BayeuxServer.createChannelIfAbsent(...). Прочитайте документацию о том, как настроить и инициализировать канал. - person sbordet; 13.04.2016