http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/Mux.java?r1=1069292&r2=1135026&diff_format=h
Ici, je peux voir que le délai d'attente a été ajouté récemment.
assurez-vous que startTimeout est > à 0, sinon vous attendrez (0) ou attendre (-n), ce qui provoquera probablement une IllegalMonitorStateException.
EDIT : Ok, ce qui précède est un désastre mais essayons ceci :
nous sommes dans le constructeur de Mux : http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/Mux.java?view=markup
ligne 176 nous créons SocketChannelConnectionIO et passons ceci après cela nous nous interrompons et un autre thread prend le relais.
dans le constructeur de SocketChannelConnectionIO défini ici : http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/SocketChannelConnectionIO.java?view=markup ligne 112 nous enregistrons le canal avec le nouveau handler().
Le handler reçoit quelque chose sur le canal et la fonction, disons la fonction handleReadReady est exécutée, nous synchronisons sur muxLock.
maintenant nous sommes toujours dans le constructeur donc l'objet dans la finale est toujours mutable ! !! supposons qu'il change, maintenant nous avons quelque chose qui attend un autre muxLock
Un scénario sur un million
EDITAR
http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/Mux.java?revision=1135026&view=co
Mux(SocketChannel channel,
int role, int initialInboundRation, int maxFragmentSize)
throws IOException
{
this.role = role;
if ((initialInboundRation & ~0x00FFFF00) != 0) {
throw new IllegalArgumentException(
"illegal initial inbound ration: " +
toHexString(initialInboundRation));
}
this.initialInboundRation = initialInboundRation;
this.maxFragmentSize = maxFragmentSize;
//LINE BELOW IS CAUSING PROBLEM it passes this to SocketChannelConnectionIO
this.connectionIO = new SocketChannelConnectionIO(this, channel);
//Lets assume it stops here we are still in constructor
//and we are not in synchronized block
directBuffersUseful = true;
}
maintenant dans le constructeur de SocketChannelConnectionIO http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/SocketChannelConnectionIO.java?revision=1069292&view=co
SocketChannelConnectionIO(Mux mux, SocketChannel channel)
throws IOException
{
super(mux);
channel.configureBlocking(false);
this.channel = channel;
//Line below we are registering to the channel with mux that is still mutable
//this is the line that actually is causing the problem move that to
// start() and it should work
key = selectionManager.register(channel, new Handler());
}
déplacer ce code vers start() devrait fonctionner key = selectionManager.register(channel, new Handler());
(je suppose que start est exécuté quand nous voulons commencer la prospection).
/**
* Starts processing connection data.
*/
void start() throws IOException {
key = selectionManager.register(channel, new Handler());
key.renewInterestMask(SelectionKey.OP_READ);
}
Mais il serait bien mieux de ne pas créer SocketChannelConnectionIO dans le constructeur de mux mais peut-être quelque part après cela, de même pour le second constructeur créant StreamConnectionIO avec ceci