📄 remotingcallservlet.java
字号:
package com.cownew.PIS.framework.server;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter;
import com.cownew.PIS.framework.common.SysConstants;
import com.cownew.PIS.framework.common.exception.ServiceBeanInitException;
import com.cownew.PIS.framework.server.helper.LocalServiceLocator;
import com.cownew.PIS.framework.server.lifeMgr.ServiceLifeMonitor;
import com.cownew.PIS.framework.server.lifeMgr.SessionServiceLifeListener;
public class RemotingCallServlet extends HttpServlet
{
private static Logger logger = Logger.getLogger(RemotingCallServlet.class);
protected void doPost(HttpServletRequest httpRequest,
HttpServletResponse httpResponse) throws ServletException,
IOException
{
try
{
invokeService(httpResponse, httpRequest);
} catch (ServiceBeanInitException rpcEx)
{
// 像session非法之类的异常不是在bean运行过程中抛出的,因此客户端得不到异常,
// 这类异常会在此处抛出,因此我们通过http错误代码的方式发送给客户端
// 这样也保证了SessionServiceLifeListener不用关心用的是什么remoting技术
// 只要抛出异常就可以了
String msg = rpcEx.getMessage();
httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
logger.error(msg, rpcEx);
} catch (Throwable e)
{
// 注意,bean运行过程中的异常并不是通过此处抛出的,而是通过remoting机制传递到客户端再抛出的
// 此处抛出的是非bean的异常
logger.error(e.getMessage(), e);
throw new ServletException(e);
}
}
private void invokeService(HttpServletResponse response,
HttpServletRequest request) throws ServletException
{
String reqPath = request.getPathInfo();
String serviceId = getServiceId(reqPath);
String sessionId = request.getParameter(SysConstants.SESSIONID);
ServiceLifeMonitor lifeMonitor = new ServiceLifeMonitor(sessionId);
lifeMonitor.addServiceLifeListener(new SessionServiceLifeListener());
try
{
lifeMonitor.beforeInvoke();
invokeBean(request, response, serviceId);
} finally
{
lifeMonitor.afterInvoke();
}
}
private void invokeBean(HttpServletRequest request,
HttpServletResponse response, String serviceId)
throws ServletException
{
// 服务都是无状态的,所以无需同步服务
try
{
Class serviceIntfClass = Class.forName(serviceId);
Object _service = LocalServiceLocator.getInstance()
.getService(serviceIntfClass);
HttpInvokerServiceExporter exporter = new HttpInvokerServiceExporter();
exporter.setService(_service);
exporter.setServiceInterface(serviceIntfClass);
exporter.afterPropertiesSet();
exporter.handleRequest(request, response);
} catch (ClassNotFoundException e)
{
throw new ServletException(e);
} catch (IOException e)
{
throw new ServletException(e);
}
}
private static String getServiceId(String reqPath)
{
Pattern pattern = Pattern.compile("/(.+)");
Matcher match = pattern.matcher(reqPath);
match.matches();
match.group();
String serviceId = match.group(1);
return serviceId;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -