Bonjour,
J'ai fait un ServerSocketChannel qui traite des connexion client , et save les messages reçu dans un fichier.
J'attaque ce server avec une classe qui lance 20 Threads qui créent des sockets et envoient des messages.
Après environ 1 heure de traitement j'ai l'exception Too many open file .
Open file system : 32000.
Voila on thread Serveur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
 
private class StartingServer extends Thread {
 
		public void run() {
 
			startServer(server, selector);
		}
 
		private void startServer(ServerSocketChannel server, final Selector selector) {
 
			while (isRunning) {
 
				try {
					selector.select();
					Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
 
					while (keys.hasNext()) {
 
 
						SelectionKey key = keys.next();
						keys.remove();
 
						if (!key.isValid()) {
							continue;
						}
						try {
							//l'évenement correspond à une acceptation de connexion
							if(key.isAcceptable()) {
 
								SocketChannel channel = server.accept();
								channel.configureBlocking(false);
								channel.register(selector, SelectionKey.OP_READ);
 
							}
							//l'évenement correspond à une lecture
							else if(key.isReadable()) {
 
								SocketChannel client = (SocketChannel) key.channel();
 
								TrameManager manager = (TrameManager)key.attachment();
 
								if(manager == null) {
 
										SessionSocket ss = new SessionSocket(client.socket());
										manager = (TrameManager) Introspection.newInstance(managerClassName, new ByteArrayOutputStream(), ss , this.getClass().getClassLoader());
 
									key.attach(manager);
								}
 
								String msg = null;
 
								msg = manager.doRead(doRead(key , manager.getBuffer()));
 
								if(!StringUtils.isEmpty(msg)) {
									putMsgInQueue(msg);
									key.interestOps(SelectionKey.OP_WRITE) ;
								}
 
							}
							//l'évenement correspond à l'écriture
							else if(key.isWritable()) {
 
								TrameManager manager = (TrameManager)key.attachment();
								doWrite(key , manager.doWrite());
 
							}
						} catch (IOException e) {
							fireAlarm(e, "Exception in channel");
							key.channel().close();
							key.attach(null);
							key.cancel();
						}catch (IntrospectionException e) {
							throw new IFException(e, "IntrospectionException");
						}
					}
				} catch (ClosedChannelException e) {
					fireAlarm(e, "Exception in closing channel");
				} catch (IOException e) {
					fireAlarm(e, "Exception in channel");
				}catch (IFException e) {
					fireAlarm(e, "IntrospectionException");
 
				}
			}
		}
	}
Puis-je avoir votre aide pour résoudre ce problème