Tomcat 如何在应用服务器中实现排队?

Tomcat 如何在应用服务器中实现排队?,tomcat,jboss,websphere,weblogic,geronimo,Tomcat,Jboss,Websphere,Weblogic,Geronimo,我使用的是apachegeronimoapplicationserver,我想像Geronimo一样定制队列,所有的请求都存储在applicationserver队列中,并逐个发布。 这意味着,应用服务器一次只提供一个请求。一旦上一个请求完成,下一个请求将被释放。我想这样设置 我希望你能理解我的想法。如果有任何疑问,请告诉我 如果有人研究这个概念,建议我 谢谢您需要将数据库线程池大小设置为1(让您使用id),并将servlet设置为单线程,但是队列没有任何保证,可能队列中的第二个线程在第一个线程

我使用的是
apachegeronimo
applicationserver,我想像Geronimo一样定制队列,所有的请求都存储在applicationserver队列中,并逐个发布。 这意味着,应用服务器一次只提供一个请求。一旦上一个请求完成,下一个请求将被释放。我想这样设置

我希望你能理解我的想法。如果有任何疑问,请告诉我

如果有人研究这个概念,建议我


谢谢

您需要将数据库线程池大小设置为1(让您使用id),并将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服务等执行相同的操作

请告诉我为什么你希望你的服务器是单线程的,也许有更好的方法,我从不建议这些方法:)

方法2:
首先对过滤器代码进行编码

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
文件夹下,则需要在
web.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>

.....
精神过滤器
com.stackoverflow.supportbuddy.SyncFilter
精神过滤器
/pages/myJSP.jsp
.....

最后试一试:)

我们使用Wolfram Mathematica开发了一个应用程序。使用这种技术,我们可以在不到1秒的时间内处理繁重的计算。实际上,最终用户并没有与这个应用程序交互。应用程序将执行它所做的操作,它从
DB1
中获取数据,计算将发生并存储在
DB2
中。最终用户与
DB2
进行交互。对于这种交互,我们使用
Node.js、Javascript
开发了另一个应用程序。有了一个Mathematica许可证,我们只能得到一个内核。所以一次两个应用程序不能运行。因此,我们希望自定义应用服务器中的队列。那么,每个
DB1
DB2
的数据传输是否会影响到另一个?如果没有,则不需要强制执行AS go单线程。如果只有一个系统与
DB1
交互,那么为什么要将其实现为JEE应用程序呢?无法将
WM
切换到JSE?另一种方法是将
DB1
连接池设置为1Hmm,如何运行
WM
应用程序?是exe文件吗?或者JEE模块?
WM
提供一些标签。使用这些标记,我们可以在
JSP
页面中编写
WM
代码。最后,我的整个应用程序代码都在
JSP
中。因此,我认为servlet过滤器方法(第二种方法)将帮助您,请尝试一下。:)