Pregunta

I followed the examples that I could find for making a Cometd java client application. I am trying to make it so when the user presses a button on the screen, cometd publishes a message to the server. Right now the publish gets called but the server never receives message to its listener. I have this server listener working with javascript but not java code.

Client side setup is as follows:

        // Prepare the transport
        Map<String, Object> options = new HashMap<String, Object>();
        ClientTransport transport = LongPollingTransport.create(options, httpClient);

        _client = new BayeuxClient("http://10.100.97.168:8888/slideshow/slideshow/", transport);
        _client.getChannel(Channel.META_HANDSHAKE).addListener(new InitializerListener());
        _client.getChannel(Channel.META_CONNECT).addListener(new ConnectionListener());

My handshake and connection listeners:

private class InitializerListener implements ClientSessionChannel.MessageListener
    {
        public void onMessage(ClientSessionChannel channel, Message message)
        {
            if (message.isSuccessful())
            {
                _handshaked = true;
            }
            else
            {
                _handshaked = false;
            }
        }
    }

    private class ConnectionListener implements ClientSessionChannel.MessageListener
    {
        private boolean wasConnected;
        private boolean connected;

        public void onMessage(ClientSessionChannel channel, Message message)
        {
            if (_client.isDisconnected())
            {
                connected = false;
                connectionClosed();
                return;
            }

            wasConnected = connected;
            connected = message.isSuccessful();
            if (!wasConnected && connected)
            {
                connectionEstablished();
            }
            else if (wasConnected && !connected)
            {
                connectionBroken();
            }
        }
    }

Button press that tries to publish:

_btnPlay.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                if(_connection_established == true)
                {
                    Map<String, Object> data = new HashMap<String, Object>();
                    _clientSessionChannel.publish(data);
                }
            }
         });

Just in case here is my server Listener too:

@Listener("/service/slide/play")
    public void processServiceSlidePlay(ServerSession client, ServerMessage message)
    {
        synchronized(imagelock)
        {
            if(slideShowRunning == false && imageIDList != null && imageIDList.size() > 0)
            {
                slideShowRunning = true;
                if(imageIDList != null && imageIDList.size() > 0)
                {           
                    deliverChangeMessage(client, message);  
                }
            }
        }
    }

So I can establish a connection and my publish gets called, but the server never picks it up. Also I noticed if I do the same exact publish but in my handshake or connect callback, the server will pick it up. Seems like I just can't do a publish outside of the callbacks.

Thanks in Advance for the Help.

¿Fue útil?

Solución

It turned out that I was running the network, cometD code, on Androids Main UI Thread and that is not allowed. Once I moved all the cometd code over to an AsyncTask it all started working all the time.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top