1

我在处理来自客户的订阅请求并根据请求执行一些处理时遇到问题。我希望能够在服务器上收到传入订阅请求时调用一个方法并执行一些处理。我查看了以下 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();  
    }
4

1 回答 1

4

查看注释服务的文档,以及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
    }
}
于 2013-04-10T10:37:13.540 回答