我正在使用Apache Geronimo
应用程序服务器,我想在 Geronimo 中自定义队列,例如,所有请求都存储在应用程序服务器队列中,并一一释放。这意味着,应用程序服务器一次只处理一个请求。一旦前一个完成,下一个请求将被释放。我想这样设置。
我希望,你明白我在尝试什么。如果有人有任何疑问,请告诉我。
如果有人研究这个概念,建议我。
谢谢
您需要将数据库线程池大小设置为 1(id it let's you),并将 Servlet 设置为单线程,但对队列没有任何保证,可能队列中的第二个在第一个之前,您为什么需要这样做吗?
另一种方式是每个请求都由一个 servlet 过滤器过滤,该过滤器从开始到结束响应锁定一个同步对象,这确保您没有任何其他线程会获取锁定并执行相同操作(至少对于 http 请求)
servlet单线程模式:
public class AloneServlet extends HttpServlet implements SingleThreadModel {
//....
}
the servlet filter approach
public final class HitCounterFilter implements Filter {
private Object lock=new Object();
//...
public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)
synchronized(lock){
chain.doFilter(request, wrapper);
}
}
}
上面的两个示例是针对 http 请求的,您需要对 web 服务执行相同的操作,等等。
请告诉你为什么你想让你的服务器变成单线程,也许有更多更好的方法可用,我从不建议这些方法:)
方法二:
先编码过滤器代码
package com.stackoverflow.supportbuddy
import javax.servlet.*;
import javax.servlet.http.*;
// Implements Filter class
@ServletFilter(urlPatterns={"/pages/myJSP.jsp"})// for Java EE 6+
public class SyncFilter implements Filter {
public void init(FilterConfig config)throws ServletException{}
@Override
private static Object lock=new Lock();
@Override
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws java.io.IOException, ServletException {
//each thread needs to lock the "lock" object and this ensures you only one thread will be forwarded.
synchronized(lock){
chain.doFilter(request,response);
}
}
@Override
public void destroy( ){}
}
然后将过滤器映射到所需的 jsp 文件,例如,如果jsp
文件位于/pages
文件夹下,那么您需要将过滤器映射为 thisweb.xml
或在较新版本的 Java EE 中使用注释
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
.....
<filter>
<filter-name>SycnFilter</filter-name>
<filter-class>com.stackoverflow.supportbuddy.SyncFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SycnFilter</filter-name>
<url-pattern>/pages/myJSP.jsp</url-pattern>
</filter-mapping>
.....
</web-app>
终于试一试了:)