Слушатели подписки CometD
У меня проблема с обработкой запросов на подписку от клиентов и выполнением некоторой обработки на основе запроса. Я хотел бы иметь возможность вызывать метод и выполнять некоторую обработку при получении входящего запроса на подписку на сервере. Я посмотрел следующую документацию по CometD и попробовал пример, описанный в разделе "Поддержка конфигурации подписки", но мне не очень повезло.
http://www.cometd.org/documentation/2.x/cometd-java/server/services/annotated
Я уже создал Bayeux Server, используя Spring Bean, и я могу публиковать данные для других имен каналов, которые я создал на стороне сервера. Любая помощь или дополнительная информация. по теме будет оценен!
Пример кода, который я использую:
@Service("CometDSubscriptionListener")
public class CometDSubscriptionListener {
private final String channel = "/subscription";
private static final Logger logger = Logger.getLogger(CometDSubscriptionListener.class);
private Heartbeat heartbeat;
@Inject
private BayeuxServer bayeuxserver;
@Session
private ServerSession sender;
public CometDSubscriptionListener(BayeuxServer bayeuxserver){
logger.info("CometDSubscriptionListener constructor called");
}
@Subscription(channel)
public void processClientRequest(Message message)
{
logger.info("Received request from client for channel " + channel);
PublishData();
}
1 ответ
Ознакомьтесь с документацией по аннотированным сервисам, а также с концепциями CometD.
Если я правильно прочитал ваш вопрос, вы хотите иметь возможность выполнять некоторую логику, когда клиенты подписываются на канал, а не когда сообщения поступают на этот канал.
Вы путаете смысл @Subscription
аннотации, поэтому прочитайте ссылки выше, которые должны уточнить его семантику.
Чтобы сделать то, что я понял, вы хотите сделать это, вам нужно это:
@Service
public class CometDSubscriptionListener
{
...
@Listener(Channel.META_SUBSCRIBE)
public void processSubscription(ServerSession remote, ServerMessage message)
{
// What channel the client wants to subscribe to ?
String channel = (String)message.get(Message.SUBSCRIPTION_FIELD);
// Do your logic here
}
}