All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.highway2urhell.service.ThunderExporterService Maven / Gradle / Ivy

There is a newer version: 1.0.5
Show newest version
package com.highway2urhell.service;

import com.highway2urhell.CoreEngine;
import com.highway2urhell.domain.EntryPathData;
import com.highway2urhell.domain.MessageBreaker;
import com.highway2urhell.domain.MessageMetrics;
import com.highway2urhell.domain.MessageThunderApp;

import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.net.HttpURLConnection;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import com.sun.management.OperatingSystemMXBean;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.gson.Gson;


public class ThunderExporterService {
	private Logger LOGGER = LoggerFactory.getLogger(this.getClass());
	private static ThunderExporterService instance;
	private BlockingQueue queueRemoteBreaker = new LinkedBlockingQueue(
			10000);
	private BlockingQueue queueRemotePerformance = new LinkedBlockingQueue(
			10000);
	private final static int MSG_SIZE = 50;

	private ThunderExporterService() {
		ScheduledExecutorService schExService = Executors
				.newScheduledThreadPool(1);
		schExService.scheduleAtFixedRate(new Runnable() {

			public void run() {
				LOGGER.info("Drain the queue Remote");
				List listBreaker = new ArrayList();
				int result = queueRemoteBreaker.drainTo(listBreaker, MSG_SIZE);
				LOGGER.info("Drain Remote size " + result);
				if (result > 0) {
					LOGGER.info("Send the Data");
					sendDataHTTP("/addBreaker", listBreaker);
				}

				LOGGER.info("Drain the queue Performance");
				List listPerformance = new ArrayList();
				int resultPerf = queueRemotePerformance.drainTo(listPerformance, MSG_SIZE);
				LOGGER.info("Drain Performance size " + result);
				if (resultPerf > 0) {
					LOGGER.info("Send the Data");
					sendDataHTTP("/addPerformance", listPerformance);
				}

			}
		}, 5, 30, TimeUnit.SECONDS);
	}

	public static ThunderExporterService getInstance() {
		if (instance == null) {
			synchronized (ThunderExporterService.class) {
				if (instance == null) {
					instance = new ThunderExporterService();
				}
			}
		}
		return instance;
	}

	public void registerAppInThunder() {
		String token = sendDataHTTP("/createThunderApp/", CoreEngine
				.getInstance().getConfig());
		CoreEngine.getInstance().getConfig().setToken(token);
		LOGGER.info("application registred with token {} for application {}",
				token, CoreEngine.getInstance().getConfig()
						.getNameApplication());
	}

	public void initPathsRemoteApp() {
		LOGGER.info("initPathsRemoteApp ");
		TransformerService ts = new TransformerService();
		List res = ts
				.collectBreakerDataFromLeechPlugin(CoreEngine.getInstance()
						.getLeechServiceRegistered());
		MessageThunderApp msg = new MessageThunderApp();
		msg.setListentryPathData(res);
		msg.setToken(CoreEngine.getInstance().getConfig().getToken());
		sendDataHTTP("/initThunderApp", msg);
	}

	public void sendRemotePerformance(String fullMethodName,int timeExec){
		MessageMetrics msg = new MessageMetrics();
		msg.setPathClassMethodName(fullMethodName);
		msg.setToken(CoreEngine.getInstance().getConfig().getToken());
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
		Date date = new Date();
		msg.setDateIncoming(sdf.format(date));
		msg.setTimeExec(timeExec);
		getCpuInformation(msg);
		queueRemotePerformance.add(msg);
	}
	
	public void sendRemoteBreaker(String pathClassMethodName) {
		MessageBreaker msg = new MessageBreaker();
		msg.setPathClassMethodName(pathClassMethodName);
		msg.setToken(CoreEngine.getInstance().getConfig().getToken());
		SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy:hh-mm-ss");
		Date date = new Date();
		msg.setDateIncoming(sdf.format(date));
		queueRemoteBreaker.add(msg);
	}

	private String sendDataHTTP(String uri, Object message) {
		Gson gson = new Gson();
		String data = gson.toJson(message);
		String urlServer = CoreEngine.getInstance().getConfig().getUrlH2hWeb()
				+ uri;
		HttpClient client = HttpClientBuilder.create().build();
		HttpPost httpPost = new HttpPost(urlServer);
		if (data != null) {
			httpPost.setEntity(new StringEntity(data, "UTF8"));
		}
		httpPost.setHeader("Content-type", "application/json");
		String result = null;
		try {
			HttpResponse response = client.execute(httpPost);
			if (response != null) {
				if (response.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_CREATED
						|| response.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_OK
						|| response.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_ACCEPTED
						|| response.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_NO_CONTENT) {
					result = EntityUtils.toString(response.getEntity());
					LOGGER.info("Message from H2H server" + result);
				} else {
					LOGGER.error("Failed : HTTP error code : "
							+ response.getStatusLine().getStatusCode()
							+ " for urlServer " + urlServer + "msg "
							+ EntityUtils.toString(response.getEntity()));
				}
			} else {
				LOGGER.error("Failed : Response Null from urlServer : "
						+ urlServer);
			}

		} catch (IOException e) {
			LOGGER.error("Error while sending dataHttp to " + urlServer, e);
		}
		return result;
	}


	private void getCpuInformation(MessageMetrics mb){
		OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
		Double cpuLoadProcess = Double.valueOf(operatingSystemMXBean.getProcessCpuLoad()*100);
		Double cpuLoadSystem = Double.valueOf(operatingSystemMXBean.getSystemCpuLoad()*100);
		mb.setCpuLoadProcess(cpuLoadProcess);
		mb.setCpuLoadSystem(cpuLoadSystem);
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy