0

サーバーからクライアントにメッセージをプッシュしようとしています。私は、tomcat6と統合されたDOJO 1.7、CometdおよびJettyを使用しています。

 //Server side code
   public class notificationService extends AbstractService {

public notificationService(BayeuxServer bayeux, String name) {
    super(bayeux, name);
    System.out.println("Inside constrcutor of Notification Service");
    addService("/notification", "processNotification");
}


    public void processNotification(ServerSession remote,ServerMessage.Mutable message)      
        {
    System.out.println("Inside process Notification");
    Map<String,Object> response = new HashMap<String,Object>();
    response.put("payload",new java.util.Date());
            getBayeux().createIfAbsent("/notification");
          getBayeux().getChannel("/notification").publish(getServerSession(),response,null);
            //remote.deliver(getServerSession(),"/notification", response, null);
        }

      //Client Side Code (DOJO)

       var cometd = dojox.cometd;
       cometd.init("http://serverip:port/cometd")
       cometd.publish('/notification',{ mydata: { foo: 'bar' } });
       cometd.subscribe('/notification', function(message)
            {
                    //alert("Message received" + message.data.payload);
                    //alert(message.data.payload);
                    alert("Message received");
            });

特定のチャネルに加入しているすべてのクライアントにメッセージをブロードキャストしたい。remore.deliverを使用すると、個々のクライアントにメッセージが送信されますが、そのチャネルにサブスクライブされているすべてのクライアントには送信されません。channel.publishは私のために機能していません...どんな助けやコメントも大歓迎です。

4

1 に答える 1

2

メッセージがサービスによって受信されるだけでなく、すべてのサブスクライバーにもブロードキャストされるように、クライアントは/notificationブロードキャスト チャネル (定義についてはhttp://docs.cometd.org/reference/#concepts_channelsを参照) である channel にパブリッシュしています。そのチャンネルの。

次に、サービスで、チャネルのサブスクライバーに別のメッセージをServerChannel.publish()送信する呼び出しを行います (サービス自体とは別に、無限ループ防止機能があります)。/notification

この種のアクションを実行するより良い方法は、サービス チャネルを使用することです。たとえば/service/notification、クライアントからサービスに最初のメッセージを送信します。その後、サービスは現在のように channel にブロードキャストできます/notification

呼び出しServerChannel.publish()は、サービスからメッセージをブロードキャストする正しい方法です。残念ながら、なぜうまくいかないのか正確に特定されていないので、私は助けることができません.

最初のメッセージのクライアントとサービスの間でサービス チャネルを使用することから始めます。

また、Tomcat 6 は非同期サーブレット (サーブレット 3) をサポートしていないため、CometD の最適なソリューションではないことにも注意してください。

Jetty 8などの Servlet 3 準拠のコンテナーを使用することをお勧めします。

于 2012-09-06T11:39:14.260 に答える