static void Main(string[] args)
        {
            //you should change these configurations for your own rabbitmq server
            string rbmqUsername  = "******";
            string rbmqPassword  = "******";
            string rbmqServerUrl = "localhost";

            CalUnit cal = new CalUnit("aggregate.calUnit", "calUnit", rbmqUsername, rbmqPassword, rbmqServerUrl);
            Add     add = new Add("chips.add", "add", rbmqUsername, rbmqPassword, rbmqServerUrl);
            Sub     sub = new Sub("chips.sub", "sub", rbmqUsername, rbmqPassword, rbmqServerUrl);
            Mul     mul = new Mul("chips.mul", "mul", rbmqUsername, rbmqPassword, rbmqServerUrl);
            Div     div = new Div("chips.div", "div", rbmqUsername, rbmqPassword, rbmqServerUrl);

            Console.WriteLine("working...");

            string line;

            while ((line = Console.ReadLine()).Trim() != "q")
            {
                try {
                    var    match = Regex.Match(line, @"(?<a>\d+(\.\d+)?)(?<op>[+\-*/])(?<b>\d+(\.\d+)?)");
                    double a     = Convert.ToDouble(match.Groups["a"].Value);
                    string op    = match.Groups["op"].Value;
                    double b     = Convert.ToDouble(match.Groups["b"].Value);

                    cal.calculate(op, a, b);
                } catch (Exception) {
                    Console.WriteLine("invalid input.");
                }
            }
            div.stopWork();
            mul.stopWork();
            sub.stopWork();
            add.stopWork();
            cal.stopWork();
        }