2013-04-10 81 views
1

我在處理來自客戶端的訂閱請求並根據請求執行某些處理時遇到問題。我希望能夠在服務器上收到傳入訂閱請求時調用方法並執行一些處理。我查看了下面的CometD文檔,並嘗試了「訂閱配置支持」中列出的示例,但我沒有太多運氣。CometD訂閱監聽器

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

我已經創建使用一個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(); 
    } 

回答

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 
    } 
} 
+0

感謝您的意見。我會看看你提供的鏈接。 – user676567 2013-04-10 10:50:14