无法与Apache Mina同步线程

时间:2009-12-07 22:40:59

标签: java networking apache-mina

我正在使用Apache Mina 1.1.7和Java 1.6。服务器以循环方式向客户端发送三个消息序列。有时两组消息重叠。例如,我期待:

++ recv: MSGHEAD 
++ recv: message body 1
++ recv: .

++ recv: MSGHEAD 
++ recv: message body 2
++ recv: .

但我得到了这个:

++ recv: MSGHEAD
++ recv: MSGHEAD 
++ recv: message body 1
++ recv: .
++ recv: message body 2
++ recv: .

这是我的服务器配置:

    SocketAcceptor acceptor = new SocketAcceptor();
    SocketAcceptorConfig config = new SocketAcceptorConfig();
    config.setThreadModel(ThreadModel.MANUAL);
    if (true) {
        SSLContextFactory factory = new SSLContextFactory();
        config.getFilterChain().addLast("sslFilter", new SSLFilter(factory.getInstance(true)));
    }

    System.out.println(config.getFilterChain().toString());
    config.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")) ));
    config.getFilterChain().addLast("to-message", new ToMessageIoFilter());

    config.getSessionConfig().setReuseAddress( true );
    config.getSessionConfig().setTcpNoDelay(true);
    acceptor.bind( new InetSocketAddress(PORT), new MinaServerHandler(new MinaConnectionFactory()), config );
}

以下是我发送一系列消息的方法:

public  void sendMessage(String msg) throws IOException {
    synchronized(session){
        writeLine("MSGHEAD");
        writeLine(msg);
        writeLine(".");
    }
}

private void writeLine(String line) {
    WriteFuture w=session.write(line);
}

我做错了什么?

1 个答案:

答案 0 :(得分:0)

如果三个线程各自处于sendMessage()的循环中,那么您可能希望它们输出有时交错的行,有时不会。你描述的行为是什么。

我确实看到你试图同步这些线程,以便分别输出完整的消息块。所以可能出错的是每个线程都有自己的session对象。您的线程必须共享它们同步的对象。

解决此问题的最简单方法是删除synchronized语句并将sendMessage()设为synchronized method。这可能不是很快。