Skip to main content
summaryrefslogblamecommitdiffstats
blob: a8d85497785d59944f37d033c05c4c47b83fae5d (plain) (tree)
1
2
3
4
5
6
7
8
9
10









                                                    







                                                                  

                                       


                                                                               
                                                             

                             

                       

                  
 



                                                               

                      






                                                              
 







                                                     


                                     


                                  
                                           






















                                                                              
 




                                          
package org.eclipse.osee.ote.core;

import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.BindException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedByInterruptException;
import java.nio.channels.DatagramChannel;
import java.util.logging.Level;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.ote.OTEException;

public abstract class BaseUdpReceiveRunnable implements Runnable {

   private static final int DATA_SIZE = 65536;
   private static final int UDP_TIMEOUT = 240000; // 4 MINUTES
   private static final int ONE_MEG = 1024 * 1024;

   private volatile boolean run = true;
   private Class<BaseUdpReceiveRunnable> logger = BaseUdpReceiveRunnable.class;
   private InetSocketAddress address;

   public BaseUdpReceiveRunnable(InetSocketAddress address) {
      this.address = address;
   }

   public void stop() {
      run = false;
   }

   @Override
   public void run() {
      ByteBuffer buffer = ByteBuffer.allocateDirect(DATA_SIZE);
      DatagramChannel channel = null;
      try {
         while (run) {
            try {
               channel = DatagramChannel.open();
               channel.socket().setReuseAddress(true);
               channel.socket().bind(address);
               channel.socket().setSoTimeout(UDP_TIMEOUT);
               channel.socket().setReceiveBufferSize(ONE_MEG);
               channel.configureBlocking(true);

               while (run) {
                  buffer.clear();
                  channel.receive(buffer);
                  buffer.flip();
                  processBuffer(buffer);
               }
            } catch (BindException ex) {
               OseeLog.log(logger, Level.FINEST, ex);
               if (channel != null) {
                  channel.close();
               }
               Thread.sleep(1000);
            }
         }
      } catch (InterruptedIOException ex) {
         Thread.interrupted();
         if (run) {
            OseeLog.log(logger, Level.WARNING, "Unexpected interruption", ex);
         }
      } catch (ClosedByInterruptException ie) {
         Thread.interrupted();
         if (run) {
            OseeLog.log(logger, Level.WARNING, "Unexpected interruption", ie);
         }
      } catch (Throwable t) {
         throw new OTEException(t);
      } finally {
         try {
            if (channel != null) {
               channel.close();
            }
         } catch (IOException ex) {
            ex.printStackTrace();
         }
      }
   }

   protected abstract void processBuffer(ByteBuffer buffer);

   public InetSocketAddress getAddress() {
      return address;
   }

}

Back to the top