CometD订阅听众

时间:2013-04-10 09:40:00

标签: cometd bayeux

我在处理来自客户端的订阅请求时遇到问题,并根据请求执行一些处理。我希望能够在服务器上收到传入的订阅请求时调用方法并执行一些处理。我已经看了下面的CometD文档,并尝试了“订阅配置支持”中概述的示例,但我没有太多运气。

http://www.cometd.org/documentation/2.x/cometd-java/server/services/annotated

我已经使用Spring Bean创建了Bayeux服务器,并且我能够将数据发布到我在服务器端创建的其他频道名称。任何帮助或其他信息。关于这个主题将不胜感激!

我正在使用的代码示例:

@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 个答案:

答案 0 :(得分:3)

查看documentation for annotated services,以及CometD concepts

如果我正确地阅读了您的问题,您希望能够在客户订阅频道时执行某些逻辑,而不是在邮件到达该频道时执行。

你混淆了@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
    }
}