Seam和ServletOutputStream - 不能立即看到flush

时间:2011-02-24 13:02:28

标签: servlets seam weblogic-10.x

我正在将一份已有6年历史的申请转换为Seam 2.2。 该应用程序用于在java 1.4和weblogic 8中运行。 它只使用jsp和servlet。 在我使用的一个servlet中:

    public void doGet (HttpServletRequest req,HttpServletResponse res) throws  ServletException,IOException
        {
            //...

            ServletOutputStream out = = res.getOutputStream();

            // displaying a lot of messages
            // after each println() I do a flush()
            out.println("lots of messages.....");
            out.flush();

            out.close(); 
            //...
        } 

运行应用程序时,会立即在浏览器中看到消息。

当我在Weblogic 10和Java 1.6中使用Seam 2.2运行时,浏览器中不会立即显示消息。 只有当servlet完成运行时才会。

我可以更改一些东西来解决这个问题吗?

我不想将servlet更改/转换为Seam组件。 servlet运行正常。唯一的事情是将消息刷新到浏览器窗口,这只发生在servlet停止运行之后。

可能原因是servlet现在通过Seam过滤器:

<filter>
  <filter-name>Seam Filter</filter-name>
  <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
</filter>

<filter-mapping>
  <filter-name>Seam Filter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

2 个答案:

答案 0 :(得分:2)

你正在运行一个servlet - 这里与Seam没有任何关系。我怀疑你需要重新评估你的设计,因为从servlet到Seam结构并没有真正的转换。

答案 1 :(得分:2)

原因可能是请求通过SeamFilter,正如您所想的那样。 我认为不是SeamFilter本身缓冲来自servlet的数据流,而是缓冲区链中调用的Ajax4Jsf过滤器。

如果类路径中有RichFaces,则会有一个seam组件在链中注册Ajax4jsf过滤器。即,Seam组件是org.jboss.seam.web.ajax4jsfFilter

如果您不需要RichFaces,请尝试将其从类路径中删除。如果您需要它,我建议您覆盖org.jboss.seam.web.ajax4jsfFilter以跳过指向您的servlet的请求的Ajax4Jsf过滤器。

另一种可能的解决方案是将过滤器中的servlet转换为Seam组件(请参阅@Filter注释),并使用around属性将其定位在链的开头。类似的东西:

@Name("FormerServlet")
@Scope(STATELESS)
@BypassInterceptors
@Filter(around = "org.jboss.seam.web.ajax4jsfFilterInstantiator")
public class FormerServletFilter implements Filter
{

    protected void init(FilterConfig filterConfig) throws Exception
    {
    }


    protected void doDestroy()
    {
    }

    /**
     * Performs the filtering for a request.
     */
    protected void doFilter(final HttpServletRequest request, final HttpServletResponse response,
                            final FilterChain chain) throws Exception
    {
        if (thisRequestShoudBeManagedByMyServlet(request) )
        {
           // do here what you previously did in the servlet

        } else
        {
            // go ahead with the Seam lifecycle
            chain.doFilter(request, response);
        }
    }