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 に答える