/**
 * Copyright (c) 2016-2020, Michael Yang 杨福海 (fuhai999@gmail.com).
 * <p>
 * Licensed under the GNU Lesser General Public License (LGPL) ,Version 3.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.gnu.org/licenses/lgpl-3.0.txt
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.jboot.app;

import io.jboot.app.config.JbootConfigManager;
import io.jboot.core.JbootCoreConfig;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author michael yang (fuhai999@gmail.com)
 * @Date: 2020/3/24
 */
public class JbootRpcApplication {

    private static final ReentrantLock LOCK = new ReentrantLock();
    private static final Condition STOP = LOCK.newCondition();

    public static void main(String[] args) {
        run(args);
    }

    public static void setBootArg(String key, Object value) {
        JbootConfigManager.me().setBootArg(key, value);
    }

    public static void run(String[] args) {
        JbootConfigManager.me().parseArgs(args);
        JbootCoreConfig coreConfig = new JbootCoreConfig();
        new RPCServer(coreConfig).start();
    }



    static class RPCServer extends Thread {
        private JbootCoreConfig coreConfig;

        public RPCServer(JbootCoreConfig coreConfig) {
            this.coreConfig = coreConfig;
            doInit();
        }

        private void doInit(){
            this.coreConfig.onStart();
        }

        @Override
        public void run() {
            addHook(coreConfig);
            await();
        }

        private  void await() {
            try {
                LOCK.lock();
                STOP.await();
            } catch (InterruptedException e) {
                System.err.println("jboot rpc application has stopped, interrupted by other thread!");
            } finally {
                LOCK.unlock();
            }
        }

        private void addHook(JbootCoreConfig config) {
            Runtime.getRuntime().addShutdownHook(new Thread(() -> {
                try {
                    config.onStop();
                } catch (Exception e) {
                    System.err.println("jboot rpc stop exception : " + e.toString());
                }

                System.err.println("jboot rpc application exit, all service stopped.");
                try {
                    LOCK.lock();
                    STOP.signal();
                } finally {
                    LOCK.unlock();
                }
            }, "jboot-rpc-application-hook"));
        }
    }

}

@@ -21,9 +21,9 @@
  201
-6
+5
 -202
@@ -97,58 +97,32 @@
 the 
-GNU Lesser General Public License (LGPL) ,
+Apache License, 
 Version 
 3.0 
@@ -117,17 +117,17 @@
 Version 
-3
+2
 .0 (the 
@@ -274,11 +274,14 @@
 www.
-gnu
+apache
 .org
@@ -294,20 +294,19 @@
 ses/
-lgpl-3.0.txt
+LICENSE-2.0
 %0A * 
@@ -1523,16 +1523,17 @@
 hread %7B%0A
+%0A
         

optimize JbootRpcApplication