Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Send message with all client not work #87

Closed
timactive opened this issue Dec 13, 2013 · 9 comments
Closed

Send message with all client not work #87

timactive opened this issue Dec 13, 2013 · 9 comments

Comments

@timactive
Copy link

For example i test this

this.socketIOServer.getBroadcastOperations().sendJsonObject(rapport)

But i have big problem in production server, i test with 2 client (Firefox and Chrome in a same host).

2013-12-13 08:04:08,090 | ERROR | pool-23-thread-5 | DefaultPromise                   | til.internal.logging.Slf4JLogger  181 | 282 - io.netty.common - 4.0.12.Final | Failed to notify a listener. Event loop shut down?
java.util.concurrent.RejectedExecutionException: event executor terminated
    at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:703)[282:io.netty.common:4.0.12.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:296)[282:io.netty.common:4.0.12.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:691)[282:io.netty.common:4.0.12.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListener(DefaultPromise.java:607)[282:io.netty.common:4.0.12.Final]
    at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:123)[282:io.netty.common:4.0.12.Final]
    at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:93)[283:io.netty.transport:4.0.12.Final]
    at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:28)[283:io.netty.transport:4.0.12.Final]
    at com.corundumstudio.socketio.transport.BaseClient.disconnect(BaseClient.java:111)[300:netty-socketio:1.5.4]
    at com.corundumstudio.socketio.HeartbeatHandler$2.run(HeartbeatHandler.java:63)[300:netty-socketio:1.5.4]
    at com.corundumstudio.socketio.scheduler.CancelableScheduler$1.run(CancelableScheduler.java:50)[300:netty-socketio:1.5.4]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)[:1.7.0_45]
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)[:1.7.0_45]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)[:1.7.0_45]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)[:1.7.0_45]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)[:1.7.0_45]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)[:1.7.0_45]
    at java.lang.Thread.run(Thread.java:744)[:1.7.0_45]

Then after this error i have ~ 100 line error such as

2013-12-13 02:08:03,456 | ERROR | entLoopGroup-7-2 | PacketHandler                    | o.socketio.handler.PacketHandler   78 | 300 - netty-socketio - 1.5.4 | Exception occurs
java.lang.IllegalArgumentException: promise.channel does not match: [id: 0xa05db936, /127.0.0.1:40431 => /127.0.0.1:8283] (expected: [id: 0xa1a3538c, /127.0.0.1:40403 => /127.0.0.1:8283])
    at io.netty.channel.DefaultChannelHandlerContext.validatePromise(DefaultChannelHandlerContext.java:802)[283:io.netty.transport:4.0.12.Final

When i add a sleep after each send it work fine.

for(Entry<UUID, SocketIOClient> entry : users.entrySet()) {
             SocketIOClient user = entry.getValue();
             user.sendMessage(rapportJson);
             try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

The solution is pretty bad, the problem is aillor.

@mrniko
Copy link
Owner

mrniko commented Dec 13, 2013

Which version of netty-socketio do you use? total clients amount connected to server?

@mrniko
Copy link
Owner

mrniko commented Dec 13, 2013

Please try to reproduce it with latest version from master

@timactive
Copy link
Author

Only 2 client i test in local i reproduce problem.
I use version 1.5.4

@timactive
Copy link
Author

Same problem from master

2013-12-13 09:23:31,142 | ERROR | entLoopGroup-3-2 | PacketHandler                    | o.socketio.handler.PacketHandler   82 | 300 - netty-socketio - 1.5.5-SNAPSHOT | Exception occurs
java.lang.IllegalArgumentException: promise.channel does not match: [id: 0x32a3fea1, /127.0.0.1:42881 => /127.0.0.1:8283] (expected: [id: 0x3072497c, /127.0.0.1:42842 => /127.0.0.1:8283])
    at io.netty.channel.DefaultChannelHandlerContext.validatePromise(DefaultChannelHandlerContext.java:802)[283:io.netty.transport:4.0.12.Final]
    at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:636)[283:io.netty.transport:4.0.12.Final]
    at io.netty.handler.stream.ChunkedWriteHandler.doFlush(ChunkedWriteHandler.java:306)[285:io.netty.handler:4.0.12.Final]
    at io.netty.handler.stream.ChunkedWriteHandler.flush(ChunkedWriteHandler.java:141)[285:io.netty.handler:4.0.12.Final]
    at io.netty.channel.DefaultChannelHandlerContext.invokeFlush(DefaultChannelHandlerContext.java:675)[283:io.netty.transport:4.0.12.Final]
    at io.netty.channel.DefaultChannelHandlerContext.flush(DefaultChannelHandlerContext.java:656)[283:io.netty.transport:4.0.12.Final]
    at io.netty.channel.ChannelOutboundHandlerAdapter.flush(ChannelOutboundHandlerAdapter.java:115)[283:io.netty.transport:4.0.12.Final]
    at io.netty.channel.DefaultChannelHandlerContext.invokeFlush(DefaultChannelHandlerContext.java:675)[283:io.netty.transport:4.0.12.Final]
    at io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:701)[283:io.netty.transport:4.0.12.Final]
    at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java:689)[283:io.netty.transport:4.0.12.Final]
    at io.netty.channel.DefaultChannelHandlerContext.writeAndFlush(DefaultChannelHandlerContext.java:718)[283:io.netty.transport:4.0.12.Final]
    at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:893)[283:io.netty.transport:4.0.12.Final]
    at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:240)[283:io.netty.transport:4.0.12.Final]
    at com.corundumstudio.socketio.handler.EncoderHandler.handle(EncoderHandler.java:166)[300:netty-socketio:1.5.5]
    at com.corundumstudio.socketio.handler.EncoderHandler.write(EncoderHandler.java:144)[300:netty-socketio:1.5.5]
    at io.netty.channel.DefaultChannelHandlerContext.invokeWrite(DefaultChannelHandlerContext.java:645)[283:io.netty.transport:4.0.12.Final]
    at io.netty.channel.DefaultChannelHandlerContext.access$2000(DefaultChannelHandlerContext.java:29)[283:io.netty.transport:4.0.12.Final]
    at io.netty.channel.DefaultChannelHandlerContext$WriteTask.run(DefaultChannelHandlerContext.java:906)[283:io.netty.transport:4.0.12.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:354)[282:io.netty.common:4.0.12.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:353)[283:io.netty.transport:4.0.12.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101)[282:io.netty.common:4.0.12.Final]
    at java.lang.Thread.run(Thread.java:744)[:1.7.0_45]

@timactive
Copy link
Author

I understand the problem but i don't know how to resolve?
Dor example i have 2 client connected
client A discute 127.0.0.1:45974
client B discute 127.0.0.1:45989
Server send message 2 client
server -> "welcom" -> Client A
netty wait promise Client A
server -> "welcom" -> Client B

Nevertheless, for example the channel for clientA can receipt response promise Client B, and validation netty not work and throw Exception.

@mrniko
Copy link
Owner

mrniko commented Dec 13, 2013

netty wait promise Client A

@timactive how do you create a "promise" object? could you send a code example of this?

@timactive
Copy link
Author

Reproduce in standalone
Server

public static void main(String args[])
    {
        Configuration config = new Configuration();
        config.setHostname("127.0.0.1");
        config.setPort(8284);
        SocketIOServer server = new SocketIOServer(config);
        SocketIONamespace namespace = server.addNamespace("/rapport");  

          namespace.addDisconnectListener(new DisconnectListener() {

            @Override
            public void onDisconnect(SocketIOClient client) {
                System.out.println("is disconnected "+client.getSessionId());

            }
        });
          namespace.addConnectListener(new ConnectListener() {

            @Override
            public void onConnect(SocketIOClient client) {
                System.out.println("is connected "+client.getSessionId());

            }
        });
          namespace.addMessageListener(new DataListener<String>() {

            @Override
            public void onData(SocketIOClient client, String data,
                    AckRequest ackSender) {
                // TODO Auto-generated method stub

            }

        });
        server.start();
        int nbmessage=0;
        while(true && nbmessage < 250000)
        {
            server.getBroadcastOperations().sendMessage("itsservertestbug " + nbmessage);
            nbmessage++;
            try {
                Thread.sleep(100);/*simule a work*/
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        server.stop();
    } ```

In Client
```java
 var rapportSocket2 =  io.connect('http://localhost:8284/rapport');
    function connectHandler() {
                        return function() {
                            console.log('Client has connected to the server!');
                            rapportSocket.send("coucou je suis "+" romain");
                        }
                }
     rapportSocket2.on('connect', function(){
        console.log(' rapportSocket2 Client has connected to the server!');
     });
     rapportSocket2.on('message', function(data) {
        console.log(data);
     });
     rapportSocket2.on('disconnect', function() {
                        console.log(' rapportSocket2 Client has connected to the server!');
                }); ```

@timactive
Copy link
Author

I test and it work now!!
Thank you.

@mrniko
Copy link
Owner

mrniko commented Dec 13, 2013

Thanks for bug report!

@mrniko mrniko closed this as completed Dec 13, 2013
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants