1

我已经着手在torquebox (www.torquebox.org) 上实现对类似于mod_xsendfile 的功能的支持。Torquebox 基本上是 JBoss AS 7 之上的一堆代码,这让我的努力相当于让 sendfile 在 JBoss AS 7 上工作。

这里的主要问题可能是我对 JBoss 的困惑,但是在浪费了太多时间用尽我所有的谷歌搜索资源之后,我不得不相信有人真正知道这个东西在 AS 7 中是如何工作的。

据我了解,JBoss 通过使用 JBoss Web 本地连接器 (http://www.jboss.org/jbossweb/downloads/jboss-native-2-0-10) 支持 sendfile,即 APR http 连接器。

在花了几个小时未能在 AS 7 上安装这些之后,这似乎对其他人来说是一种魅力(https://community.jboss.org/message/614790),grep'ing 我的本地 JBoss 目录告诉我,这些本机连接器是似乎与 AS 7 捆绑在一起。在我的情况下,所需的 dll 被放置在

%JBOSS_HOME%\modules\org\jboss\as\web\main\lib\win-x86_64

所以史诗般的失败,试图安装已经存在的东西。检查我的standalone.xml 配置文件还显示正在使用此本机连接器

<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host">
    <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
    <virtual-server name="default-host" enable-welcome-root="false">
        <alias name="localhost"/>
        <alias name="example.com"/>
    </virtual-server>
</subsystem>

将所有日志记录级别切换为调试并检查日志会显示日志消息

Standalone/log/server.log.2012-02-10:324:23:12:17,964 INFO [org.apache.coyote.http11.Http11AprProtocol](MSC 服务线程 1-5)在 http-127.0 上启动 Coyote HTTP/1.1 .0.1-127.0.0.1-8080

其中 Http11AprProtocol 表示使用了 APR http 连接器。但是,网络上的许多帖子都提到还应显示以下行:

org.apache.catalina.core.AprLifecycleListener init INFO:APR 功能:IPv6 [true],sendfile [true],接受过滤器 [false],随机 [true]。

无论日志记录级别如何, AprLifecycleListener 行都不会显示。

当我查看此内容时,似乎现在正在使用 APR http 连接器。

根据文档,我可以让以下 servlet 工作

public class Sendfile extends HttpServlet {
    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response) throws ServletException, IOException {
        if(Boolean.TRUE == request.getAttribute("org.apache.tomcat.sendfile.support")){
            // Send all the files!!
        }
        else{
            throw new ServletException("BOOM!");
        }
    }
}

但不是。org.apache.tomcat.sendfile.support 属性为空,如果尝试设置用于发送文件的 http 标头(忽略 support 属性)并设置其余所需的 sendfile 属性,我的浏览器会认为它正在接收文件,但没有数据传输......并且连接处于挂起状态。

总结这个问题,似乎所需的 APR 本机连接器正在使用中,默认情况下应该启用 sendfile,但服务器不知道我试图让它做什么。

如何进行?

4

1 回答 1

8

我也浪费了好几个小时试图了解它是如何工作的。你做的一切都是对的。只是错过了将 Web 系统作为native=true

<subsystem xmlns="urn:jboss:domain:web:1.1" 
         default-virtual-server="default-host" native="true">

用它启动:

11:00:26,018 DEBUG [org.apache.catalina.core.AprLifecycleListener] (MSC service thread 1-3) Loaded: apr-1
11:00:26,039 DEBUG [org.jboss.modules] (ServerService Thread Pool -- 58) Module org.jboss.xb:main defined by local module loader @d8d9850 (roots: /home/mmagnani/Development/jboss-eap/jboss-eap-6.0/modules)
11:00:26,070 DEBUG [org.apache.catalina.core.AprLifecycleListener] (MSC service thread 1-3) Loaded: z
11:00:26,071 DEBUG [org.apache.catalina.core.AprLifecycleListener] (MSC service thread 1-3) Loaded: crypto
11:00:26,072 DEBUG [org.apache.catalina.core.AprLifecycleListener] (MSC service thread 1-3) Loaded: ssl
11:00:26,079 DEBUG [org.jboss.as.ejb3] (ServerService Thread Pool -- 36) Adding EJB @Asynchronous support
11:00:26,082 DEBUG [org.jboss.as.ejb3] (ServerService Thread Pool -- 36) Configuring timers
11:00:26,092 DEBUG [org.jboss.as.ejb3] (ServerService Thread Pool -- 36) Adding EJB IIOP support
11:00:26,101 FINE  [org.hornetq.core.server.impl.HornetQServerImpl] (MSC service thread 1-6) Starting server HornetQServerImpl::
11:00:26,120 DEBUG [org.apache.catalina.core.AprLifecycleListener] (MSC service thread 1-3) Loaded: tcnative-1
11:00:26,141 DEBUG [org.apache.catalina.core.AprLifecycleListener] (MSC service thread 1-3) Loaded Apache Tomcat Native library 1.1.23.
11:00:26,141 DEBUG [org.apache.catalina.core.AprLifecycleListener] (MSC service thread 1-3) APR capabilities: IPv6 [true], sendfile [true], random [true].

祝你好运 :)

于 2012-10-02T14:09:40.783 回答