2009-12-07 3 views
1

J'utilise Apache Mina 1.1.7 et Java 1.6. Le serveur envoie une séquence de trois messages au client en boucle. Parfois, deux ensembles de messages se chevauchent. Par exemple, je me attends:Problème de synchronisation des threads avec Apache Mina

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

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

mais je reçois ceci:

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

Voici ma configuration du serveur:

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); 
} 

Voici comment j'envoie une séquence de messages :

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

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

Que suis-je? ça ne va pas?

Répondre

0

Si trois threads sont chacun dans des boucles de sendMessage() alors vous vous attendez à ce qu'ils sortent les lignes parfois entrelacées, parfois non. Quel est le comportement que vous décrivez?

Je vois que vous avez essayé de synchroniser ces threads afin de sortir des blocs entiers de messages chacun. Donc, ce qui ne va probablement pas, c'est que chaque thread a son propre objet session. Vos threads doivent partager l'objet sur lequel ils se synchronisent.

La manière la plus simple de résoudre ce problème consiste à supprimer l'instruction synchronisée et à sendMessage() de synchronized method. Cela pourrait ne pas être très rapide cependant.

Questions connexes