来自另一个字符串的Netty Channel.write不起作用

时间:2013-11-26 19:52:29

标签: java multithreading netty

private void handleWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) {

    // Check for closing frame
    if (frame instanceof CloseWebSocketFrame) {
        handshaker.close(ctx.channel(), (CloseWebSocketFrame) frame.retain());
        return;
    }
    if (frame instanceof PingWebSocketFrame) {
        ctx.channel().write(new PongWebSocketFrame(frame.content().retain()));
        return;
    }
    if (!(frame instanceof TextWebSocketFrame)) {
        throw new UnsupportedOperationException(String.format("%s frame types not supported", frame.getClass()
                .getName()));
    }

    // Send the uppercase string back.
    String request = ((TextWebSocketFrame) frame).text();
    if (logger.isLoggable(Level.FINE)) {
        logger.fine(String.format("%s received %s", ctx.channel(), request));
    }
    Message msg = new Message(ctx.channel(), request);
    ReadQueueHandler.getInstance().addMessageToProcess(msg);
}




public class ReadQueueHandler implements Runnable {
private static int POOL_SIZE = 3;
private static ReadQueueHandler instance;

private final BlockingQueue<Message> messageQueue;
private final ExecutorService threadPool;
private final int threadPoolSize;
private final boolean isActive;

private ReadQueueHandler() {
    this.threadPoolSize = POOL_SIZE;
    this.threadPool = Executors.newFixedThreadPool(threadPoolSize);
    this.messageQueue = new LinkedBlockingQueue<Message>();
    isActive = true;
    initThreadPool();
}

private void initThreadPool() {
    for (int i = 0; i < this.threadPoolSize; i++) {
        this.threadPool.execute(this);
    }
}

/**
 * Add message to read queue
 * 
 * @param message
 *            - adding message
 */
public void addMessageToProcess(Message message) {
    if (message != null) {
        this.messageQueue.add(message);
    }
}

@Override
public void run() {
    while (isActive) {
        Message message = null;
        try {
            message = this.messageQueue.take();
        } catch (InterruptedException e) {
            System.out.println("Exceptio " + e);
            /*
             * TODO Add logging
             */
        }
        if (message != null) {
            Channel channel = message.getChannel();
            channel.write(new TextWebSocketFrame("Message handled "));
        }

    }
}

public static ReadQueueHandler getInstance() {
    if (instance == null) {
        instance = new ReadQueueHandler();
    }
    return instance;
}

}

如果我执行Channel.write(“something”)而不是将数据添加到队列,那么一切正常,客户端获取数据。但是如果Channel.write(“”)从另一个线程执行,则不会获得数据。可能是什么原因?通道写入不能从另一个线程执行?

1 个答案:

答案 0 :(得分:0)

对我来说,似乎你忘记在完成写入后调用flush()来保证它被刷新到套接字。例如,你可以通过使用来解决这个问题:

channel.writeAndFlush(new TextWebSocketFrame("Message handled "));