
org.caiguoqing.uyuni.rpc.server.socketserver.SocketThread Maven / Gradle / Ivy
The newest version!
/**
*
*/
package org.caiguoqing.uyuni.rpc.server.socketserver;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.Socket;
import java.util.Date;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author org.caiguoqing
*
*/
public class SocketThread implements Runnable {
private Logger logger = LoggerFactory.getLogger(SocketThread.class);
private Socket socket;
private Map serviceInstances;
private int sleep = 1000*5;
private volatile long timeStamp = 0;
private ObjectInputStream input;
private ObjectOutputStream output;
private volatile boolean isContinue = false;
public SocketThread(Socket socket,Map serviceInstances) throws IOException{
this.socket = socket;
this.serviceInstances = serviceInstances;
input = new ObjectInputStream(socket.getInputStream());
output = new ObjectOutputStream(socket.getOutputStream());
}
private void monitor(){
timeStamp = new Date().getTime();
new Thread(new Runnable() {
public void run() {
while(isContinue){
long now = new Date().getTime();
if(now - timeStamp >= sleep){
closeSocket();
}
try {
Thread.sleep(sleep);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
private void closeSocket(){
isContinue = false;
try {
input.close();
} catch (IOException e) {
logger.error(e.getMessage());
}
try {
output.close();
} catch (IOException e) {
logger.error(e.getMessage());
}
try {
socket.close();
} catch (IOException e) {
logger.error(e.getMessage());
}
}
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
public void run() {
isContinue = true;
monitor();
while(isContinue){
try {
try {
String inter = (String)input.readObject();//interface name
timeStamp = new Date().getTime();
if(inter.equals("uyuni_heartbeat")){
continue;
}
Object serviceInstance = serviceInstances.get(inter);
if(serviceInstance == null){
output.writeObject(null);
continue;
}
Class> serviceClass = serviceInstance.getClass();
String methodName = (String)input.readObject();
Class>[] paramTypers = (Class>[])input.readObject();
Object[] arguments = (Object[])input.readObject();
try {
Method method = serviceClass.getMethod(methodName, paramTypers);
Object result = method.invoke(serviceInstance, arguments);
output.writeObject(result);
} catch (Exception e) {
logger.error(e.getMessage());
closeSocket();
}
} catch (ClassNotFoundException e) {
logger.error(e.getMessage());
closeSocket();
}
} catch (IOException e) {
logger.error(e.getMessage());
closeSocket();
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy