/*
 * Copyright 1999-2012 Alibaba Group.
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *   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 com.alibaba.dubbo.examples.heartbeat;

import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.common.utils.NetUtils;
import com.alibaba.dubbo.remoting.Transporters;
import com.alibaba.dubbo.remoting.exchange.ExchangeClient;
import com.alibaba.dubbo.remoting.exchange.ExchangeHandler;
import com.alibaba.dubbo.remoting.exchange.ExchangeServer;
import com.alibaba.dubbo.remoting.exchange.support.ExchangeHandlerAdapter;
import com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeClient;
import com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeServer;

/**
 * @author <a href="mailto:gang.lvg@alibaba-inc.com">kimi</a>
 */
public class HeartbeatServer {

    private static final URL clientUrl = URL.valueOf(
            new StringBuilder(32)
                    .append("netty://")
                    .append(NetUtils.getLocalHost())
                    .append(":9999").toString())
            .addParameter(Constants.CODEC_KEY, "exchange");

    private static final ExchangeHandler handler = new ExchangeHandlerAdapter() {

    };

    private static ExchangeServer exchangeServer;

    private static volatile boolean serverStarted = false;

    public static void main(String[] args) throws Exception {

        final HeartBeatExchangeHandler serverHandler = new HeartBeatExchangeHandler(handler);

        Thread serverThread = new Thread(new Runnable() {

            public void run() {
                try {
                    exchangeServer = new HeaderExchangeServer(
                            Transporters.bind(
                                    clientUrl.addParameter(Constants.HEARTBEAT_KEY, 1000),
                                    serverHandler));
                    serverStarted = true;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        serverThread.setDaemon(true);
        serverThread.start();

        while (!serverStarted) {
            Thread.sleep(1000);
        }

        HeartBeatExchangeHandler clientHandler = new HeartBeatExchangeHandler(handler);
        ExchangeClient exchangeClient = new HeaderExchangeClient(
                Transporters.connect(clientUrl, clientHandler));

        for (int i = 0; i < 10; i++) {
            Thread.sleep(1000);
            System.out.print(".");
        }

        System.out.println();

        if (clientHandler.getHeartBeatCount() > 0) {
            System.out.printf("Client receives %d heartbeats",
                    clientHandler.getHeartBeatCount());
        } else {
            throw new Exception("Server heartbeat does not work.");
        }

        exchangeClient.close();
        exchangeServer.close();

    }

}
