/*
* 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();
}
}
}