Java Nio 2

15,451 views

Published on

Java NIO 2
Présentation pour la sortie de Java 7 chez Xebia. Par Julien Buret et Séven Le Mesle

Published in: Technology, Education
0 Comments
12 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
15,451
On SlideShare
0
From Embeds
0
Number of Embeds
9,427
Actions
Shares
0
Downloads
191
Comments
0
Likes
12
Embeds 0
No embeds

No notes for slide

Java Nio 2

  1. 1. Java 7 Asynchronous I/O (NIO2) Julien Buret Séven Le Meslevendredi 29 juillet 2011
  2. 2. Asynchronous I/O API Comparaison avec les autres API I/O Socket SocketChannel AsyncSocketC hannel Java 1.0 Java 1.4 Java 1.7 Synchrone Synchone Asynchrone Bloquant Non bloquant Non bloquant Reactor pattern Proactor pattern Notificationvendredi 29 juillet 2011
  3. 3. Asynchronous I/O API Comparaison avec les autres API I/O FileOutputStream FileChannel AsynchronousFileChannel FileInputStream OutputStream SocketChannel AsynchronousSocketChannel InputStream OutputStream ServerSocketChannel AsynchronousServerSocketChannel InputStream Java 1.0 Java 1.4 Java 1.7vendredi 29 juillet 2011
  4. 4. Asynchronous I/O API Créer un channel AsynchronousChannelGroup channelGroup = AsynchronousChannelGroup.withFixedThreadPool(4, threadFactory); AsynchronousServerSocketChannel socketChannel = AsynchronousServerSocketChannel.open (channelGroup); socketChannel.bind(new InetSocketAddress(8080)); Future<AsynchronousSocketChannel> resAccept = socketChannel.accept(); Future<Integer> res = resAccept.get().read(ByteBuffer.allocate(512));vendredi 29 juillet 2011
  5. 5. Asynchronous I/O API Concept : Future Future<Integer> result = channel.read(byteBuffer); Retourne un «Future» avec le nombre d’octet lue (ou écrit) result.get(); Attend la fin de l’opération I/O result.get(5, TimeUnit.SECONDS); Attend avec un timout result.isDone(); Verifie si l’appel est terminévendredi 29 juillet 2011
  6. 6. Asynchronous I/O API Concept : CompletionHandler channelToClient.read(buffer, counter, new CompletionHandler<Integer, AtomicInteger>() { public void completed(final Integer result, final AtomicInteger counter){ handlerThreadPool.submit(new Runnable() { public void run() { readComplete(result, counter, buffer, channelToClient); } }); } public void failed(Throwable exc, AtomicInteger counter) { logger.error("Client {} failed to read", counter, exc); } });vendredi 29 juillet 2011
  7. 7. Threading model AsynchronousChannelGroup Encapsule le pool de thread, la file d’attente et les autres ressources partagées par les sockets 2 implémentations Fixed thread pool Cached thread pool (ou thread pool fournit)vendredi 29 juillet 2011
  8. 8. Threading model Fixed thread pool CompletionHandler I/O internal Thread Thread Threadvendredi 29 juillet 2011
  9. 9. Threading model Cached thread pool CompletionHandler Thread Thread Thread Cached Thread pool I/O internal Thread Thread Internal Thread pool 1 ou sun.nio.ch.internalThreadPoolSizevendredi 29 juillet 2011
  10. 10. Threading model FixedThreadPool CachedThreadPool ou ThreadPool fournit Thread partagé entre I/O et callback Un pool de thread pour l’I/O et un autre Eviter la contention pour les callback dans les callback Attention au context switchvendredi 29 juillet 2011
  11. 11. Bench Sur une VM 2vCPU (client et serveur) 4000 req/s (50Ko/req et 50Ko/resp) 200 Mo/s (Reçu et émis)vendredi 29 juillet 2011
  12. 12. Multicast non bloquant NetworkInterface eth0Itf = NetworkInterface.getByName("eth0"); InetAddress mcGroup = InetAddress.getByName("225.0.0.100"); DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET) .setOption(StandardSocketOptions.SO_REUSEADDR, true) .bind(new InetSocketAddress(5000)) .setOption(StandardSocketOptions.IP_MULTICAST_IF, eth0Itf); MembershipKey key = dc.join(mcGroup, eth0Itf); Selector selector = Selector.open(); dc.register(selector, dc.validOps());vendredi 29 juillet 2011
  13. 13. Multicast non bloquant while (true) { selector.select(); Iterator it = selector.selectedKeys().iterator(); while (it.hasNext()) { SelectionKey selKey = (SelectionKey) it.next(); it.remove(); if (selKey.isValid() && selKey.isReadable()) { DatagramChannel sChannel = (DatagramChannel) selKey.channel(); } if (selKey.isValid() && selKey.isWritable()) { DatagramChannel sChannel = (DatagramChannel) selKey.channel(); } } }vendredi 29 juillet 2011
  14. 14. Le reste Mise à jour des API SocketChannel bind(SocketAdress local) setOption(SocketOption name, T Value) Support de SCTP (Protocole de transport réseau) IPV6 sous Windows Support de SDP sous Solaris (protocole RMDA utilisé par Infiniband)vendredi 29 juillet 2011
  15. 15. File extension Traitement Asynchrone Droits POSIX / ACL NFS / DOS / ... Liens symboliques et vérous Système de fichier et partitions Supervision d’activité sur répertoires et fichiers Parcours de répertoire Méthodes utilitairesvendredi 29 juillet 2011
  16. 16. java.nio.Path = java.io.File file.toPath() - path.toFile() chemin système du fichier Path p = Paths.get(“/home/user/.myApp“); Iterator<Path> it = p.iterator(); // elements p.relativize(Paths.get(“/home/john“)); // “../john“ p.normalize(); // /home/john/../user = /home/user p.startsWith(“/home“);vendredi 29 juillet 2011
  17. 17. AsynchronousFileChannel Traitement asynchrone non bloquant Chaque read/write donne la position dans le fichier Accède a plusieurs parties du fichier en parallèle Threadsafe Supporte les Locks Options définies sur open(...)vendredi 29 juillet 2011
  18. 18. AsynchronousFileChannel AsynchronousFileChannel afc = AsynchronousFileChannel.open(path, StandardOpenOption.CREATE); FileLock lock = afc.lock().get(); afc.write(buffer, 0l).get(); // Buffer wrote to file lock.close(); afc.close();vendredi 29 juillet 2011
  19. 19. Files operations Files fournit des utilitaires (guava / commons-io) copy / move / delete /... read* / write / newReader* / newWriter* temp dirs / symlinks / walkFileTree Et les accès systèmes set or get : owner / attribute / posixFilePermissions FileSystem / FileStorevendredi 29 juillet 2011
  20. 20. FileAttributes Lecture et modification des atributs du fichier BasicFileAttributes, PosixFileAttributes, Dos, ... Path p = Paths.get(“/home/user/.myApp“); BasicFileAttributes attr = Files.readAttributes(file,BasicFileAttributes.class); System.out.println("creationTime: " + attr.creationTime()); System.out.println("lastAccessTime: " + attr.lastAccessTime()); System.out.println("lastModifiedTime: " + attr.lastModifiedTime()); System.out.println("isDirectory: " + attr.isDirectory()); System.out.println("isSymbolicLink: " + attr.isSymbolicLink()); System.out.println("size: " + attr.size()); Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rw-------"); FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms); Files.setPosixFilePermissions(file, perms);vendredi 29 juillet 2011
  21. 21. WatchService Comme un Selector pour les Paths WatchKey k = register(path, event, ...); WatchEvent evt = k.pollEvents(); Reset key Boucle infini et Threading à la charge du développeurvendredi 29 juillet 2011
  22. 22. WatchService Path p = Paths.get(“/home/user/.myApp“); WatchService watcher = FileSystems.getDefault().newWatchService(); WatchKey key = p.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); for (;;) { key = watcher.take(); for (WatchEvent<?> event: key.pollEvents()) { WatchEvent.Kind<?> kind = event.kind(); WatchEvent<Path> ev = (WatchEvent<Path>)event; Path filename = ev.context(); //.... } boolean valid = key.reset(); if (!valid) { break; } }vendredi 29 juillet 2011
  23. 23. DirectoryStream Autorise le forEach() sur les entrées d’un répertoire Glob pattern (“*.java“) RegExp Filtre implémenté DirectoryStream<Path> ds = Files.newDirectoryStream(dir, “*.java“); for(Path p : ds){ // ... }vendredi 29 juillet 2011
  24. 24. FileVisitor Files.walkFileTree parcours l’arborescence utilise un FileVisitor Définit des options (FOLLOW_LINKS, ... ) FileVisitor est invoqué pour chaque entrée Permet de modifier le parcours Fourni des callbacks pre/post visit File / Directoryvendredi 29 juillet 2011
  25. 25. FileVisitor Path start = ... Files.walkFileTree(start, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException e) throws IOException { if (e == null) { Files.delete(dir); return FileVisitResult.CONTINUE; } else { // directory iteration failed throw e; } } });vendredi 29 juillet 2011

×