/*
* <p>
* 版权: ©2011
* </p>
*/
package org.young.isocket.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.young.isocket.filter.ThreadPoolFilter;
import org.young.isocket.util.SocketKeys;
/**
* <p>
* 服务Controller类
* </p>
*
* @see
* @author yangjun2
* @email yangjun1120@gmail.com
*
*/
public class ServiceController {
private static final Logger logger = LoggerFactory
.getLogger(ServiceController.class);
private static ServiceFactory sf;
public ServiceController() {
sf = ServiceFactory.getInstance();
}
public boolean isNotifyService(ServiceRequest svcReq) {
String serviceId = svcReq.getServiceId();
IService service = sf.getService(serviceId);
return (service instanceof INotifyService);
}
public boolean isCommonService(ServiceRequest svcReq) {
String serviceId = svcReq.getServiceId();
IService service = sf.getService(serviceId);
return (service instanceof ICommonService);
}
public ServiceResponse invoke(ServiceRequest svcReq) {
ServiceResponse svcRes = null;
//try {
String serviceId = svcReq.getServiceId();
IService service = sf.getService(serviceId);
if (service instanceof INotifyService) {
doInvokeNotifyService(((INotifyService) service),svcReq);
} else if (service instanceof ICommonService) {
svcRes = doInvokeCommonService(((ICommonService) service),svcReq);
}
// } catch (Exception e) {
// svcRes = handleThrowable(svcReq, e,
// SocketKeys.RESPONSE_CODE_SERVICEERROR);
// } catch (Error e) {
// svcRes = handleThrowable(svcReq, e,
// SocketKeys.RESPONSE_CODE_SERVERERROR);
// } finally {
// // svcRes.setAuth(svcReq.isAuth());
// }
return svcRes;
}
public void doInvokeNotifyService(INotifyService s, ServiceRequest svcReq) {
try {
s.invoke(svcReq);
} catch (Exception e) {
logger.error(
String.format(
"notify service execute error,service id:%s ,reqid:%s,request:%s",
svcReq.getServiceId(), svcReq.getId(),
""+svcReq.getRequestObject()), e);
} catch (Error e) {
logger.error(
String.format(
"notify service execute error,service id:%s ,reqid:%s,request:%s",
svcReq.getServiceId(), svcReq.getId(),
""+svcReq.getRequestObject()), e);
}
}
public ServiceResponse doInvokeCommonService(ICommonService s,
ServiceRequest svcReq) {
ServiceResponse svcRes = null;
try {
Object obj = s.invoke(svcReq);
svcRes = handleSuccess(svcReq, obj);
} catch (Exception e) {
svcRes = handleThrowable(svcReq, e,
SocketKeys.RESPONSE_CODE_SERVICEERROR);
} catch (Error e) {
svcRes = handleThrowable(svcReq, e,
SocketKeys.RESPONSE_CODE_SERVERERROR);
}
return svcRes;
}
private ServiceResponse handleThrowable(ServiceRequest req, Throwable e,
int errorCode) {
ServiceResponse svcRes = new ServiceResponse();
svcRes.setId(req.getId());
svcRes.setResponseCode(errorCode);
svcRes.setResponseMessage(e.getMessage());
// svcRes.setAuth(req.isAuth());
svcRes.setTransformType(req.getTransformType());
svcRes.setServiceId(req.getServiceId());
return svcRes;
}
private ServiceResponse handleSuccess(ServiceRequest req, Object resObj) {
ServiceResponse svcRes = new ServiceResponse();
svcRes.setId(req.getId());
svcRes.setResponseCode(SocketKeys.RESPONSE_CODE_SUCCESS);
svcRes.setResponseObject(resObj);
// svcRes.setAuth(req.isAuth());
svcRes.setTransformType(req.getTransformType());
svcRes.setServiceId(req.getServiceId());
return svcRes;
}
}