Advertisement
Guest User

Untitled

a guest
Dec 13th, 2017
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.04 KB | None | 0 0
  1. package bulk.reserving;
  2.  
  3. import java.io.IOException;
  4. import java.net.*;
  5.  
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8.  
  9. import bulk.nodes.En_TrapLevel;
  10. import bulk.nodes.Tm_BulkTrap;
  11. import bulk.system.threading.Tm_SeparateThread;
  12.  
  13. public class Tm_MasterThread extends Tm_SeparateThread
  14. {
  15.     private static Logger       m_Logger = LoggerFactory.getLogger(Tm_MasterThread.class);
  16.    
  17.     private int                 m_Port;
  18.     private String              m_Host;
  19.     private int                 m_Timeout;
  20.     private ThreadGroup         m_Group;
  21.    
  22.     /** Create master thread
  23.      */
  24.     public Tm_MasterThread()
  25.     {
  26.         // Get reserving
  27.         Tm_Reserving res = Tm_Reserving.getInstance();
  28.        
  29.         setID(res.getTopic());
  30.        
  31.         m_Port      = res.getPort();
  32.         m_Host      = res.getBindAddress();
  33.         m_Timeout   = res.getTimeout();
  34.         m_Group     = new ThreadGroup(res.getID());
  35.     }
  36.    
  37.     /**
  38.      * @see bulk.concurrent.Tm_Thread#exception(java.lang.Throwable)
  39.      */
  40.     public void exception(Throwable ex) throws InterruptedException
  41.     {
  42.         m_Logger.warn("Caught unhandled exception: ", ex);
  43.        
  44.         // Send a critical trap
  45.         Tm_BulkTrap trap = new Tm_BulkTrap(getID());
  46.         trap.setMessage("Caught unhandled exception");
  47.         trap.setLevel(En_TrapLevel.CRITICAL);
  48.         trap.setCause(ex);
  49.         Tm_Reserving.sendTrap(getID(), trap);
  50.     }
  51.    
  52.     /** Accept socket connection with a timeout handling
  53.      * @param server server socket
  54.      * @return socket if connection estimated
  55.      * @throws IOException
  56.      * @throws InterruptedException
  57.      */
  58.     public Socket safeAccept(ServerSocket server) throws IOException, InterruptedException
  59.     {
  60.         while (true)
  61.         {
  62.             try
  63.             {
  64.                 return server.accept();
  65.             }
  66.             catch (SocketTimeoutException ex)
  67.             {
  68.                 // Check thread interrupt status
  69.                 if (isInterrupted())
  70.                     throw new InterruptedException();
  71.             }
  72.         }
  73.     }
  74.  
  75.     /**
  76.      * @see bulk.concurrent.Tm_Thread#execute()
  77.      */
  78.     public void execute() throws InterruptedException
  79.     {
  80.         ServerSocket server = null;
  81.        
  82.         try
  83.         {
  84.             server = new ServerSocket();
  85.             SocketAddress addr = (m_Host!=null) ?
  86.                     new InetSocketAddress(m_Host, m_Port) :
  87.                     new InetSocketAddress(m_Port);
  88.  
  89.             // Set address re-using & bind socket
  90.             server.setReuseAddress(true);
  91.             server.setSoTimeout(5000); // 5 seconds for accept
  92.             server.bind(addr);
  93.            
  94.             while (true)
  95.             {
  96.                 // Check if thread is interrupted
  97.                 if (isInterrupted())
  98.                 {
  99.                     m_Logger.info("Interrupted");
  100.                     break;
  101.                 }
  102.                
  103.                 // Accept a socket and set it's timeout
  104.                 Socket client = safeAccept(server);
  105.                 client.setSoTimeout(m_Timeout);
  106.                
  107.                 // Start child thread
  108.                 synchronized (m_Group)
  109.                 {
  110.                     Thread thrd   = new Tm_ClientThread(m_Group, getID(), client);
  111.                     thrd.setDaemon(true); // Fixing hangup
  112.                     thrd.start();
  113.                 }
  114.                
  115.                 // Send a trap
  116.                 {
  117.                     m_Logger.info("Attached client from " +
  118.                                     "address=tcp:" + client.getRemoteSocketAddress().toString());
  119.                    
  120.                     Tm_BulkTrap trap = new Tm_BulkTrap(getID());
  121.                     trap.setMessage("Attached client from " +
  122.                                     "address=tcp:" + client.getRemoteSocketAddress().toString());
  123.                     trap.setLevel(En_TrapLevel.NORMAL);
  124.                     Tm_Reserving.sendTrap(getID(), trap);
  125.                 }
  126.             }
  127.         }
  128.         catch (IOException ex)
  129.         {
  130.             m_Logger.warn("Caught I/O exception: ", ex);
  131.            
  132.             // Send a trap
  133.             Tm_BulkTrap trap = new Tm_BulkTrap(getID());
  134.             trap.setMessage("Caught I/O exception");
  135.             trap.setLevel(En_TrapLevel.WARNING);
  136.             trap.setCause(ex);
  137.             Tm_Reserving.sendTrap(getID(), trap);
  138.         }
  139.         finally
  140.         {
  141.             safeCloseSocket(server);
  142.         }
  143.        
  144.         exit();
  145.     }
  146.  
  147.     /** Safe close socket
  148.      * @param server socket to close
  149.      */
  150.     private static void safeCloseSocket(ServerSocket server)
  151.     {
  152.         try
  153.         {
  154.             if (server!=null)
  155.                 server.close();
  156.         }
  157.         catch (IOException ex)
  158.         {
  159.             /* nothing */
  160.         }
  161.        
  162.     }
  163.  
  164.     /**
  165.      * @see bulk.concurrent.Tm_Thread#exit()
  166.      */
  167.     public void exit()
  168.     {
  169.         synchronized (m_Group)
  170.         {
  171.             m_Logger.info("Interrupting all client threads");
  172.             m_Group.interrupt();
  173.             m_Logger.info("Interrupt OK");
  174.         }
  175.     }
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement