【问题标题】:how to implement queueing in Application server?如何在应用服务器中实现排队?
【发布时间】:2013-07-14 04:22:37
【问题描述】:

我正在使用Apache Geronimo 应用服务器,我想在 Geronimo 中自定义队列,所有请求都存储在应用服务器队列中,并一一释放。 这意味着,应用程序服务器一次只服务一个请求。一旦前一个完成,下一个请求将被释放。我想这样设置。

我希望,你明白我在尝试什么。如果有人有任何疑问,请告诉我。

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

谢谢

【问题讨论】:

    标签: tomcat jboss websphere weblogic geronimo


    【解决方案1】:

    你需要将数据库线程池的大小设置为 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 服务等执行相同操作。

    请说明您为什么希望您的服务器使用单线程,也许有更多更好的方法可用,我从不建议这些方法:)

    方法 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>
    

    终于试一试了:)

    【讨论】:

    • 我们使用Wolfram Mathematica 开发了一个应用程序。使用这项技术,我们可以在不到 1 秒的时间内处理繁重的计算。实际上最终用户不与此应用程序交互。应用程序做什么,它从DB1 获取数据并进行计算并将其存储在DB2 中。最终用户与DB2 进行交互。对于这种交互,我们使用Node.js, Javascript 开发了另一个应用程序。使用一个 Mathematica 许可证,我们将只能获得一个 kernel.so 一次无法运行两个应用程序。因此,我们想在应用服务器中自定义队列。
    • 每个DB1DB2 的数据传输是否会影响另一个?如果不是,则无需强制 AS 转到单线程。如果只有一个系统与DB1 交互,那么为什么要将它实现为 JEE 应用程序呢?无法将WM 切换到 JSE?另一种方法是将DB1连接池设置为1
    • 嗯,您如何运行WM 应用程序?是exe文件吗?还是 JEE 模块?
    • WM 提供一些标签。使用这些标签,我们可以在JSP 页面中编写WM 代码。最后我在JSP 中的整个应用程序代码。
    • 所以我认为 servlet 过滤器方法(第 2 种方法)会对您有所帮助,试一试。 :)
    猜你喜欢
    • 2019-01-03
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 2020-04-23
    相关资源
    最近更新 更多