2012-02-16 14 views
0

こんにちは、私はcometd + jquery + javaを使って次の問題を報告しています。CometD + Java + jQuery:1回の呼び出しで多すぎます

これは私のweb.xml、イムcometdの注釈実装を使用して、次のとおりです。

<!-- Cometd Servlet --> 
<servlet> 
    <servlet-name>cometd</servlet-name> 
    <servlet-class>org.cometd.java.annotation.AnnotationCometdServlet</servlet-class> 
    <init-param> 
     <param-name>timeout</param-name> 
     <param-value>60000</param-value> 
    </init-param> 
    <init-param> 
     <param-name>logLevel</param-name> 
     <param-value>3</param-value> 
    </init-param> 
    <init-param> 
     <param-name>services</param-name> 
     <param-value>com.api.services.UserStatusService</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    <async-supported>true</async-supported> 
</servlet> 
<servlet-mapping> 
    <servlet-name>cometd</servlet-name> 
    <url-pattern>/do/cometd/*</url-pattern> 
</servlet-mapping> 

は、これは私が登録されているサービスである:

package com.api.services; 

import java.util.HashMap; 

import javax.inject.Inject; 

import org.cometd.bayeux.Message; 
import org.cometd.bayeux.client.ClientSession; 
import org.cometd.bayeux.client.ClientSessionChannel; 
import org.cometd.bayeux.server.BayeuxServer; 
import org.cometd.java.annotation.Service; 
import org.cometd.java.annotation.Session; 
import org.cometd.java.annotation.Subscription; 

@Service 
public class UserStatusService 
{ 
    @Inject 
    private BayeuxServer bayeux; 
    @Session 
    private ClientSession bayeuxClient; 

    @Subscription("/userStatus") 
    public void userStatus (Message message) 
    { 
     HashMap<String, String> mapa = new HashMap<String,String>(); 
     String channel = message.getChannel(); 
     System.out.println("*** The Channel is "+channel+" ***"); 
     ClientSessionChannel chann = bayeuxClient.getChannel(channel); 
     mapa.put("canal", channel); 
     mapa.put("mensaje", "Hola Wi!!"); 
     mapa.put("ServChan", bayeux.getChannels().get(0).toString()); 
     chann.publish(mapa); 
    } 
} 

そして、これはするために使用してJSのjQueryコードイムですサブスクライブして公開する(大きなオブジェクトの一部ですので、これに関連する主要なものを貼り付けるだけです)。

 /** On document ready i call this one **/ 
    initBroad:function(){ 
    $.cometd.unregisterTransport('websocket'); 
    $.cometd.init('http://localhost/MyApp/do/cometd'); 
    console.log("Set cometd initialization"); 
    main.broadListener(); 
}, 
count:0, 
subscription:null, 
refresh:function(){ 
    this.appUnsubscribe(); 
    this.appSubscribe(); 
}, 
appUnsubscribe:function(){ 
    if (this.subscription) 
     $.cometd.unsubscribe(this.subscription); 
    this.subscription = null; 
}, 
appSubscribe:function(){ 
    func = function(msg){ 
        /** I had to do this in order to avoid ALL the 500 times it does it :S **/ 
     if(main.count < 1){ 
      console.log(main.count + ": " + msg.data.mensaje); 
     } 
     main.count++; 
    }; 
    this.subscription = $.cometd.subscribe("/userStatus",func); 
}, 
broadListener:function(){ 
    console.log("Set the broadListener"); 
    main.refresh(); 
}, 
publishBroad:function(){ 
    main.refresh(); 
    $.cometd.publish('/userStatus', {mensaje:"Hola"}); 
}, 

さて、コンソール上でpublishBroadメソッドを実行しようとすると、実際には実行されますが、1回のクリック/リクエストで450-500回サーバー上で実行されます(はい、ブラウザからJavaサーバーへのリクエストは1回だけです)回はサーバー側でのみ繰り返され、何度もその応答でブラウザに到達します)。

どうしたのですか?私の最新のcometd.jsとjquery.cometd.jsをcometd公式サイトから使用しています。

また、コンソール(JBoss AS7を使用しています)でこれをチェックすると、私の呼び出しがメソッドを入力したかどうかを確認する出力ログ行が残っていました(The channel is:そのログ行のJBossコンソールの450〜500倍!

誰もが

感謝!!

+0

私は気づいたtho私は '(this._subscription) $ .cometd.unsubscribe(this.subscription); this.subscription = null; '余分なアンダースコアがあると思います –

+0

この行を修正しましたが、問題を抱えていますが、js cometd publishメソッドを呼び出すと、サーバーのサービス:( –

答えて

1

あなたの問題は、あなたのサービスでClientSessionのを使用しているということです??私はこれを修正するために助けてください。

あなたのサービスでは、送信者に返信するには、NT、その後、次の操作を行います。

@Service 
public class UserStatusService 
{ 
    @Session 
    private LocalSession session; 

    @Subscribe("/userStatus") 
    public void userStatus(ServerSession remoteClient, ServerMessage message) 
    { 
     Map<String, String> map = new HashMap<String,String>(); 
     map.put("mensaje", "Hola Wi!!"); 
     remoteClient.deliver(session, message.getChannel(), map, null); 
    } 
} 

ClientSessionを、のServerSessionとLocalSession、およびannotated services参照の違いを理解することがCometD conceptsを参照してください。

あなたが気付いたループの理由(1件のリクエストでサービスが500回以上実行された原因)は、サービスの最後の行で同じチャンネルに再度ブロードキャストしているためです。

+0

ありがとう、私はそれを試してみましょう、私はあなたが知っているように、私が見ることができるように混乱しても、様々な読み取り後もcometdドキュメントからコンセプトを非常によく理解していない:) –

+0

私は今、覚えています、そのアイデアは、そのチャンネルへのすべてのサブスクリプションに通知を送信することです、なぜ私は、リモートメソッドを使用していませんでした。私はそれらに到達する方法は、ドキュメントをもっと慎重に読んで、何が起こっているか見る –

関連する問題