@Test
 public void testGoodNetSingle() throws Exception {
   final int port = SocketUtils.findAvailableServerSocket();
   AbstractConnectionFactory ccf = new TcpNetClientConnectionFactory("localhost", port);
   final CountDownLatch latch = new CountDownLatch(1);
   final AtomicBoolean done = new AtomicBoolean();
   Executors.newSingleThreadExecutor()
       .execute(
           new Runnable() {
             public void run() {
               try {
                 ServerSocket server =
                     ServerSocketFactory.getDefault().createServerSocket(port, 100);
                 latch.countDown();
                 List<Socket> sockets = new ArrayList<Socket>();
                 int i = 0;
                 while (true) {
                   Socket socket = server.accept();
                   ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                   ois.readObject();
                   ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                   oos.writeObject("Reply" + (i++));
                   sockets.add(socket);
                 }
               } catch (Exception e) {
                 if (!done.get()) {
                   e.printStackTrace();
                 }
               }
             }
           });
   ccf.setSerializer(new DefaultSerializer());
   ccf.setDeserializer(new DefaultDeserializer());
   ccf.setSoTimeout(10000);
   ccf.setSingleUse(true);
   ccf.start();
   assertTrue(latch.await(10000, TimeUnit.MILLISECONDS));
   TcpOutboundGateway gateway = new TcpOutboundGateway();
   gateway.setConnectionFactory(ccf);
   QueueChannel replyChannel = new QueueChannel();
   gateway.setRequiresReply(true);
   gateway.setOutputChannel(replyChannel);
   // check the default remote timeout
   assertEquals(
       Long.valueOf(10000), TestUtils.getPropertyValue(gateway, "remoteTimeout", Long.class));
   gateway.setSendTimeout(123);
   // ensure this also changed the remote timeout
   assertEquals(
       Long.valueOf(123), TestUtils.getPropertyValue(gateway, "remoteTimeout", Long.class));
   gateway.setRemoteTimeout(60000);
   gateway.setSendTimeout(61000);
   // ensure this did NOT change the remote timeout
   assertEquals(
       Long.valueOf(60000), TestUtils.getPropertyValue(gateway, "remoteTimeout", Long.class));
   gateway.setRequestTimeout(60000);
   for (int i = 100; i < 200; i++) {
     gateway.handleMessage(MessageBuilder.withPayload("Test" + i).build());
   }
   Set<String> replies = new HashSet<String>();
   for (int i = 100; i < 200; i++) {
     Message<?> m = replyChannel.receive(10000);
     assertNotNull(m);
     replies.add((String) m.getPayload());
   }
   for (int i = 0; i < 100; i++) {
     assertTrue(replies.remove("Reply" + i));
   }
 }