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

scouter.agent.batch.netio.data.net.UdpLocalServer Maven / Gradle / Ivy

There is a newer version: 2.20.0
Show newest version
/*
 *  Copyright 2016 the original author or authors. 
 *  @https://github.com/scouter-project/scouter
 *
 *  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 scouter.agent.batch.netio.data.net;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import scouter.agent.batch.Configure;
import scouter.agent.batch.Main;
import scouter.agent.batch.netio.mtu.MultiPacketProcessor;
import scouter.io.DataInputX;
import scouter.lang.pack.MapPack;
import scouter.net.NetCafe;

public class UdpLocalServer extends Thread{
	private static UdpLocalServer instance;

	private int days = 0;
	private int startBatchs = 0;
	private int endBatchs = 0;
	private int endNoSignalBatchs = 0;
	
	public static synchronized UdpLocalServer getInstance() {
		if (instance == null) {
			instance = new UdpLocalServer();
			instance.setName("SCOUTER-UDP");
			instance.setDaemon(true);
			instance.start();
		}
		return instance;
	}
	
	public void run(){
		Configure conf = Configure.getInstance();
		byte[] receiveData = new byte[conf.net_udp_packet_max_bytes];
		DatagramSocket serverSocket = null;
		int flag;
		
		try {
			serverSocket = new DatagramSocket(conf.net_local_udp_port);
	        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
	        while(true){
	        	serverSocket.receive(receivePacket);
	        	flag = DataInputX.toInt(receiveData, 0);
	        	if(flag == NetCafe.UDP_CAFE_MTU){
	        		processMTU(receiveData, receivePacket.getAddress());
	        	}else{
	        		process(flag, receiveData);
	        	}
	        }
		}catch(Exception ex){
			ex.printStackTrace();
		}finally{
			if(serverSocket !=null){
				try {serverSocket.close();}catch(Exception ex){}
			}
		}
	}
	
	private void processMTU(byte[] receiveData, InetAddress addr) throws Exception{
		DataInputX in = new DataInputX(receiveData);
		in.readInt();
        int objHash = in.readInt();
        long pkid = in.readLong();
        short total = in.readShort();
        short num = in.readShort();
        byte [] data = in.readBlob();
        		
        data = MultiPacketProcessor.getInstance().add(pkid, total, num, data, objHash, addr);
        if (data != null) {
        	int flag = DataInputX.toInt(data, 0);
        	process(flag, data);
        }
	}
	
	private void process(int flag, byte[] receiveData) throws Exception{
		int size = receiveData.length - 4;
    	byte [] data = new byte[size];
		System.arraycopy(receiveData, 4, data, 0, size);
		
		switch(flag){
		case BatchNetFlag.BATCH_END_DUMPFILE_INFO:
        	TcpAgentReqMgr.getInstance().addJob(data);
        	break;
		case BatchNetFlag.BATCH_RUNNING_INFO:
			processRunningInfo(data);
			break;
		case BatchNetFlag.BATCH_END_INFO:
			processEndInfo(data);
			break;
		}		
	}
	
	public int getStartBatchs(){
		return startBatchs;
	}
	
	public int getEndBatchs(){
		return endBatchs;
	}
	
	public int getEndNoSignalBatchs(){
		return endNoSignalBatchs;
	}
	
	public void addEndNoSignalBatchs(){
		checkDays();
		endNoSignalBatchs++;
	}
	
	private void checkDays(){
		int currentDays = (int)(System.currentTimeMillis() / 86400000L);
		if(currentDays != days){
			startBatchs = endBatchs = endNoSignalBatchs = 0;
			days = currentDays;
		}
	}
	
	private void processRunningInfo(byte [] data){
		DataInputX input = new DataInputX(data);
		try{
			MapPack mapPack = new MapPack();
			mapPack.read(input);
			String key = new StringBuilder(50).append(mapPack.getText("batchJobId")).append('-').append(mapPack.getLong("pID")).append('-').append(mapPack.getLong("startTime")).toString();
			checkDays();
			if(!Main.batchMap.containsKey(key)){
				startBatchs++;
			}
			Main.batchMap.put(key, mapPack);
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
	
	private void processEndInfo(byte [] data){
		DataInputX input = new DataInputX(data);
		try{
			String key = new StringBuilder(50).append(input.readText()).append('-').append(input.readInt()).append('-').append(input.readLong()).toString();
			checkDays();
			endBatchs++;
			Main.batchMap.remove(key);
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy