//--------< Define action to be performed on receiving message >------
 private static Action doserviceAction(Sender sndr, Receiver rcvr, Server srvr)
 {
   int counter_write = 0;
   int counter_read = 0;
   ulong write_clnt_process_time = 0;
   ulong read_clnt_latency_time = 0;
   ulong server_throughput_time = 0;
   Action serviceAction = () =>
   {
     Message msg = null;
     while (true)
     {
       msg = rcvr.getMessage();   // note use of non-service method to deQ messages          
       Console.Write("\n  Received message:\n");
       Console.Write("\n  sender is {0}\n", msg.fromUrl);
       Console.Write("\n  content is {0}\n", msg.content);
       if (specialMessage(ref msg, srvr, sndr, rcvr, ref read_clnt_latency_time, ref write_clnt_process_time, ref server_throughput_time, ref counter_write, ref counter_read))
       {
         continue;
       }
       else if (msg.content == "closeServer")
       {
         Console.Write("\n\nreceived closeServer\n\n");
         break;
       }
       else
       {
         WriteLine();
         List<string> msg_list = msg.content.Split(',').ToList<string>();
         IEnumerator<string> msg_enumerator = msg_list.GetEnumerator();
         ServerParser sp = new ServerParser();
         string str = "";
         while (msg_enumerator.MoveNext())
         {
           getDatabase(ref sp, ref msg_enumerator, ref str);
         };
         // swap urls for outgoing message
         msg.content = str;
         Util.swapUrls(ref msg);
         /////////////////////////////////////////////////
         // Use the statement below for normal operation
         Console.WriteLine("\n\n Sending Message: " + msg.content + "\n\n");
         sndr.sendMessage(msg);
       }
     }
   };
   return serviceAction;
 }
 //-----------< action for received query messages >------------
 private static void getDatabase(ref ServerParser sp, ref IEnumerator<string> msg_enumerator, ref string str)
 {
   bool flag_int = false, flag_str = false;
   switch (msg_enumerator.Current)
   {
     case "keytype":
       msg_enumerator.MoveNext();
       if (msg_enumerator.Current == "integer")
       {
         flag_int = true;
         flag_str = false;
       }
       if (msg_enumerator.Current == "String")
       {
         flag_int = false;
         flag_str = true;
       }
       break;
     case "payloadtype":
       msg_enumerator.MoveNext();
       if (msg_enumerator.Current == "String")
       {
         flag_int = true;
         flag_str = false;
       }
       if (msg_enumerator.Current == "List`1")
       {
         flag_int = false;
         flag_str = true;
       }
       if (flag_int)
       {
         str = sp.parse(ref msg_enumerator, db);
       }
       else if (flag_str)
       {
         str = sp.parse(ref msg_enumerator, enum_db);
       }
       break;
   }
 }