sivakfil

Response writer template

May 16th, 2017
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.83 KB | None | 0 0
  1. package ass.sivakfil.hw8.server.impl;
  2.  
  3. import java.io.IOException;
  4. import java.io.UncheckedIOException;
  5. import java.nio.ByteBuffer;
  6. import java.nio.channels.SelectionKey;
  7. import java.nio.channels.Selector;
  8. import java.nio.channels.SocketChannel;
  9. import java.util.Iterator;
  10. import java.util.Map;
  11. import java.util.concurrent.ConcurrentHashMap;
  12. import java.util.concurrent.ConcurrentLinkedQueue;
  13.  
  14. import ass.sivakfil.hw8.server.IResponse;
  15. import ass.sivakfil.hw8.server.IResponseWriter;
  16.  
  17. public class ResponseWriterTemplate implements IResponseWriter, Runnable {
  18.    
  19.     // elements are inserted from other thread
  20.     protected ConcurrentLinkedQueue<SocketChannel> queue = new ConcurrentLinkedQueue<>();
  21.     protected Map<SocketChannel, ByteBuffer> bufferMap = new ConcurrentHashMap<>();
  22.     protected final Selector selector;
  23.    
  24.     public ResponseWriterTemplate() {
  25.         try {
  26.             // prepare selector
  27.             selector = Selector.open();
  28.         } catch (IOException e) {
  29.             throw new UncheckedIOException(e);
  30.         }
  31.        
  32.         // Start single thread that writes responses in non-blocking way using selector
  33.         // TODO
  34.     }
  35.    
  36.     @Override
  37.     public void run() {
  38.         // there could be better stopping condition
  39.         // e.g.: IResponseWriter could inherit from subscriber, than this thread could be stopped on onComplete message
  40.         System.out.println("Started writing thread .. ");
  41.         while(true) {
  42.             // register channels that were added to queue
  43.             // TODO
  44.            
  45.             // call blocking selector.select()
  46.            
  47.             Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
  48.             while(iterator.hasNext()) {
  49.                 SelectionKey selKey = iterator.next();
  50.                
  51.                 SocketChannel client = (SocketChannel)selKey.channel();
  52.                
  53.                 // TODO check that key is readable and valid and stuff
  54.                
  55.                 // get buffer from client
  56.                 ByteBuffer bufferToWrite = bufferMap.get(client);
  57.                
  58.                 // write what you can; bufferToWrite remembers position, no need to remember what was written
  59.                 // TODO
  60.                
  61.                 // use bufferToWrite.hasRemaining to check, whether whole buffer was written
  62.                 // TODO
  63.                
  64.                 // cleanup bufferMap of channels that were cancelled or closed by client
  65.                 // TODO
  66.                
  67.                 iterator.remove();
  68.             }
  69.         }
  70.     }
  71.    
  72.     public void registerChannels() throws IOException {
  73.         while(!queue.isEmpty()) {
  74.             SocketChannel toBeRegistered = queue.poll();
  75.            
  76.             // register channel for write operation
  77.             // TODO
  78.         }
  79.     }
  80.    
  81.     @Override
  82.     public void accept(IResponse t) throws Exception {
  83.         System.out.println("Registering response for writing ..");
  84.         ByteBuffer dataToWrite = ByteBuffer.wrap(t.getResponseData().getBytes());
  85.         SocketChannel socketToWriteTo = t.getClient();
  86.         bufferMap.put(socketToWriteTo, dataToWrite);
  87.         queue.add(socketToWriteTo);
  88.        
  89.         // this wakes up blocking selector.select() so that loop can register sockets added to queue
  90.         selector.wakeup();
  91.     }
  92.  
  93. }
Add Comment
Please, Sign In to add comment