Skip to content
Snippets Groups Projects
CallbackServiceImpl.java 3.25 KiB
Newer Older
xujingfeng's avatar
xujingfeng committed
package com.aliware.tianchi;

import org.apache.dubbo.rpc.listener.CallbackListener;
import org.apache.dubbo.rpc.service.CallbackService;

Recolic Keghart's avatar
Recolic Keghart committed
import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
import java.util.*;
xujingfeng's avatar
xujingfeng committed
import java.util.concurrent.ConcurrentHashMap;
Recolic Keghart's avatar
Recolic Keghart committed
import java.util.stream.Collectors;
xujingfeng's avatar
xujingfeng committed

/**
 * @author daofeng.xjf
xujingfeng's avatar
xujingfeng committed
 * 服务端回调服务
 * 可选接口
 * 用户可以基于此服务,实现服务端向客户端动态推送的功能
xujingfeng's avatar
xujingfeng committed
 */
public class CallbackServiceImpl implements CallbackService {

    public CallbackServiceImpl() {
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                if (!listeners.isEmpty()) {
潇洒's avatar
潇洒 committed
                    //System.out.println("Server push " +generateStatusMessage() + "   Mem="+Runtime.getRuntime().freeMemory());
xujingfeng's avatar
xujingfeng committed
                    for (Map.Entry<String, CallbackListener> entry : listeners.entrySet()) {
                        try {
潇洒's avatar
潇洒 committed
                            //entry.getValue().receiveServerMsg(System.getProperty("quota") + " " + new Date().toString());Runtime.getRuntime().freeMemory()
                            entry.getValue().receiveServerMsg(System.getProperty("quota") + "," + generateStatusMessage());
xujingfeng's avatar
xujingfeng committed
                        } catch (Throwable t1) {
                            listeners.remove(entry.getKey());
                        }
                    }
                }
            }
潇洒's avatar
潇洒 committed
        }, 0, 5000);
xujingfeng's avatar
xujingfeng committed
    }

    private Timer timer = new Timer();

Recolic Keghart's avatar
Recolic Keghart committed
    private String generateStatusMessage() {
        try {
            List<String> cpuLoadList = getProcessCpuLoad().stream().map(Object::toString).collect(Collectors.toList());
潇洒's avatar
潇洒 committed
            String cpuLoadString = String.join(",", cpuLoadList);
            return "cpu=" + cpuLoadString;
Recolic Keghart's avatar
Recolic Keghart committed
        }
        catch(Exception ex) {
            return "error";

        }

    }

xujingfeng's avatar
xujingfeng committed
    /**
     * key: listener type
     * value: callback listener
     */
    private final Map<String, CallbackListener> listeners = new ConcurrentHashMap<>();

    @Override
    public void addListener(String key, CallbackListener listener) {
Recolic Keghart's avatar
Recolic Keghart committed
        System.out.println("Server: add Listener " + key);
xujingfeng's avatar
xujingfeng committed
        listeners.put(key, listener);
        listener.receiveServerMsg(new Date().toString()); // send notification for change
    }
Recolic Keghart's avatar
Recolic Keghart committed

    // System status impl
    private static List<Double> getProcessCpuLoad() throws Exception {
        List<Double> result = new ArrayList<>();

        MBeanServer mbs    = ManagementFactory.getPlatformMBeanServer();
        ObjectName name    = ObjectName.getInstance("java.lang:type=OperatingSystem");
        AttributeList list = mbs.getAttributes(name, new String[]{ "ProcessCpuLoad" });

        for(int i = 0; i < list.size(); ++i) {
            Attribute att = (Attribute) list.get(i);
            Double value  = (Double)att.getValue();
            if(value == -1.0)
                // usually takes a couple of seconds before we get real values
                result.add(Double.NaN);
            else
                // returns a percentage value with 1 decimal point precision
                result.add(((int)(value * 1000) / 10.0));
        }

        return result;
    }
xujingfeng's avatar
xujingfeng committed
}