1

さまざまなプッシュ テクノロジ間の技術的な比較のための経験的な背景が必要なので、CometD を使い始めようとしています。

最終的に、Tomcat (v7.0) でサンプル コードを実行することができました。

今、私は奇妙な振る舞いをしており、何が間違っていたのかを必死に見つけようとしています.

ここに私の観察があります:

  • 接続ループ:

    クライアントとの無限の接続ループで実行しています。

    リクエスト:

    [{"channel":"/meta/connect","connectionType":"long-polling","id":"19","clientId":"f1le33y91f6pa71f39z52km87yp"}]
    

    応答:

    [{"id":"19","successful":true,"advice":{"interval":2000,"reconnect":"retry","multiple-clients":true,"timeout":60000},"channel":"/meta/connect"}]
    

    これについて興味深いのは、Listener-callback イベントが実際に発生することです。

     cometd.addListener('/meta/handshake', _metaHandshake);
    
  • クライアント接続要求がスタックする

    これは主に、Tomcat サーバーを再起動した後に発生します。2 つのチャネルへのサブスクリプションが成功したことを確認できます。

    リクエスト

    [{"version":"1.0","minimumVersion":"0.9","channel":"/meta/handshake","supportedConnectionTypes":["long-polling","callback-polling"],"advice":{"timeout":60000,"interval":0},"id":"1"}]
    

    応答

    [{"id":"1","minimumVersion":"1.0","supportedConnectionTypes":["callback-polling","long-polling"],"successful":true,"channel":"/meta/handshake","clientId":"11tnpjnmkqo3tf64zcvufuqbtv","version":"1.0"}]
    

    リクエスト

    [{"channel":"/meta/subscribe","subscription":"/hello","id":"2","clientId":"11tnpjnmkqo3tf64zcvufuqbtv"},{"channel":"/service/hello","data":{"name":"World"},"id":"3","clientId":"11tnpjnmkqo3tf64zcvufuqbtv"}]
    

    応答

    [{"id":"2","subscription":"/hello","successful":true,"channel":"/meta/subscribe"},{"id":"3","successful":true,"channel":"/service/hello"}]
    

    この後の呼び出しはスタックし、永遠にかかります。

... abd ここに私のコードがあります

  • クライアント

    (function($)
     {
       var cometd = $.cometd;
    
    $(document).ready(function()
    {
        function _connectionEstablished()
        {
            $('#body').append('<div>CometD Connection Established</div>');
        }
    
        function _connectionBroken()
        {
            $('#body').append('<div>CometD Connection Broken</div>');
        }
    
        function _connectionClosed()
        {
            $('#body').append('<div>CometD Connection Closed</div>');
        }
    
        // Function that manages the connection status with the Bayeux server
        var _connected = false;
        function _metaConnect(message)
        {
            if (cometd.isDisconnected())
            {
                _connected = false;
                _connectionClosed();
                return;
            }
    
            var wasConnected = _connected;
            _connected = message.successful === true;
            if (!wasConnected && _connected)
            {
                _connectionEstablished();
            }
            else if (wasConnected && !_connected)
            {
                _connectionBroken();
            }
        }
    
        // Function invoked when first contacting the server and
        // when the server has lost the state of this client
        function _metaHandshake(handshake)
        {
            if (handshake.successful === true)
            {
               // interesting enough: that event is triggered
                alert('event occured');
                cometd.batch(function()
                {
                    // that function is called and produces a corresponding request to the server
                    cometd.subscribe('/hello', function(message)
                    {
                        // that one never happens... 
                        $('#body').append('<div>Server Says: ' + message.data.greeting + '</div>');
                    });
                    // Publish on a service channel since the message is for the server only
                    cometd.publish('/service/hello', { name: 'World' });
                });
            }
        }
    
        // Disconnect when the page unloads
        $(window).unload(function()
        {
            cometd.disconnect(true);
        });
    
        var cometURL = location.protocol + "//" + location.host + config.contextPath + "/cometd";
        cometd.configure({
            url: cometURL,
            logLevel: 'debug'
        });
    
        cometd.addListener('/meta/handshake', _metaHandshake);
        cometd.addListener('/meta/connect', _metaConnect);
    
        cometd.handshake();
    });
    })(jQuery);
    
  • サーバ

    これは、配布パッケージの例からほぼ 1:1 であることに注意してください!

    public class HelloService extends AbstractService
    {
    public HelloService(BayeuxServer bayeux)
    {
        super(bayeux, "hello");
        addService("/service/hello", "processHello");
    }
    
    public void processHello(ServerSession remote, Message message)
    {
        Map<String, Object> input = message.getDataAsMap();
        String name = (String)input.get("name");
    
        Map<String, Object> output = new HashMap<String, Object>();
        output.put("greeting", "Hello, " + name);
        remote.deliver(getServerSession(), "/hello", output, null);
    }
    

    }

  • Web.xml ファイル

    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

    <servlet>
        <servlet-name>cometd</servlet-name>
        <servlet-class>org.cometd.server.CometdServlet</servlet-class>
        <async-supported>true</async-supported>
        <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>
    </servlet>
    <servlet-mapping>
        <servlet-name>cometd</servlet-name>
        <url-pattern>/cometd/*</url-pattern>
    </servlet-mapping>
    

たぶん私は何か完全に間違ったことをしているのかもしれませんが、私はこれについて少し必死になり始めています. 助けていただければ幸いです。

4

0 に答える 0