0

好的,这是一个微不足道的问题,但它就在这里。我想<h:inputTextArea value="bean.status" disabled="true"/>在我的视图中使用 a 显示对数据库进行的各种插入/更新的进度(使用richfaces)。这Bean是一个支持 bean,它有一个status属性和一个添加状态消息的方法:

public void addMessage(String message) {
    status = status.concat(message + "\n");
}

有一个“迁移”按钮可以启动该过程。我的问题是文本区域仅在迁移器方法结束时更新。我需要的是每次status更新时,输入文本区域也会更新。所以...

1 - 怎么做?

2 - 有没有更好的方法来实现这个?


根据 RichFaces Component References,它是必需的:

  • 设置推送

  • 使用服务器端或客户端方法

  • 实现消息生产者

  • 处理推送消息

所以我做了:

  • 安装运行时依赖项(Atmosphere): -- 添加了 Maven 的大气运行时 1.0.0.beta4 依赖项

  • 注册 Push Servlet -- Servlet 3.0 不需要,但在 web.xml 中添加了手动配置:

    推送 Servlet org.richfaces.webapp.PushServlet 1 true

  • 选择带有 Push CDI Event 机制的服务器端方法来触发消息。将我的 Status.java 更新为消息生产者:

    导入 java.io.Serializable;导入 javax.enterprise.context.SessionScoped;导入 javax.enterprise.event.Event;导入 javax.inject.Inject;导入 javax.inject.Named;导入 org.richfaces.cdi.push.Push;

    @Named @SessionScoped 公共类 Status 实现 Serializable {

    @Inject
    @Push(topic = "statusPush")
    Event<String> pushEvent;
    private String status;
    
    public void addMessage(String message) {
        //Everytime the status is updated...
        status = status.concat(message + "\n");
        //... the message is sent to the topic
        sendMessage(message);
    }
    
    public void sendMessage(String message) {
        pushEvent.fire(message);
    }
    
    
    public String getStatus() {
        return status;
    }
    
    public void setStatus(String status) {
        this.status = status;
    }
    

    }

  • 处理视图上的消息:

    <a4j:push address="statusPush"
        onerror="alert(event.rf.data)">
        <a4j:ajax event="dataavailable" render="statusOutput" />
    </a4j:push>
    
    
    <h:inputTextarea id="statusOutput" value="#{status.status}" cols="80" rows="20" disabled="true"/>
    

似乎一切就绪,但是当我单击启动迁移过程的按钮时,我得到以下堆栈跟踪:

警告:StandardWrapperValve [Faces Servlet]:PWC1406:Servlet Faces Servlet 的 Servlet.service() 抛出异常 com.google.common.collect.ComputationException:javax.faces.FacesException:在 SerialContext[myEnv={ 中查找“/ConnectionFactory”失败java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory,java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl,java.naming.factory。 org.richfaces.application.push.impl.jms.JMSTopicsContextImpl.createTopic( JMSTopicsContextImpl.java:281) 在 org.richfaces.application.push.TopicsContext.getOrCreateTopic(TopicsContext.java:48) 在 org.richfaces。application.push.impl.SessionImpl.createSubscriptions(SessionImpl.java:190) at org.richfaces.application.push.impl.SessionImpl.subscribe(SessionImpl.java:185) at org.richfaces.resource.PushResource.encode(PushResource. java:88) at org.richfaces.resource.UserResourceWrapperImpl.encode(UserResourceWrapperImpl.java:188) at org.richfaces.resource.ResourceHandlerImpl.handleResourceRequest(ResourceHandlerImpl.java:229) at javax.faces.webapp.FacesServlet.service(FacesServlet .java:591) 在 org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 在 org.apache.catalina。 core.StandardContextValve.invoke(StandardContextValve.java:175) 在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 在 org.apache.catalina.connector.CoyoteAdapter .doService(CoyoteAdapter.java:331) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java :317) com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) com.sun。 grizzly.comet.CometEngine.executeServlet(CometEngine.java:459) 在 com.sun.grizzly.comet.CometEngine.handle(CometEngine.java:316) 在 com.sun.grizzly.comet.CometAsyncFilter.doFilter(CometAsyncFilter.java:87) 在 com.sun.grizzly.arp.DefaultAsyncExecutor.interrupt(DefaultAsyncExecutor.java:143) 在 com.sun.grizzly.arp.DefaultAsyncExecutor.invokeFilters(DefaultAsyncExecutor.java:171) 在 com.sun.grizzly.arp .AsyncProcessorTask.doTask(AsyncProcessorTask.java:102) 在 com.sun.grizzly.http.TaskBase.run(TaskBase.java:193) 在 com.sun.grizzly.http.TaskBase.execute(TaskBase.java:175) 在com.sun.grizzly.arp.DefaultAsyncHandler.handle(DefaultAsyncHandler.java:145) 在 com.sun.grizzly.arp.AsyncProtocolFilter.execute(AsyncProtocolFilter.java:210) 在 com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain. java:137) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 在 com.sun.com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)。grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 在 com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 在 com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 在 com .sun.grizzly.ContextTask.run(ContextTask.java:71) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.run (AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:722) 原因:javax.faces.FacesException:在 SerialContext[myEnv={java.naming.factory.初始=com.sun.enterprise.naming.impl.SerialInitContextFactory,java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl,java.naming.factory.url.pkgs=com。太阳。Enterprise.naming} 在 org.richfaces.application.push.impl.jms.JMSTopicsContextImpl$1.apply(JMSTopicsContextImpl.java:207) 在 org.richfaces.application.push.impl.jms.JMSTopicsContextImpl$1.apply(JMSTopicsContextImpl.java: 195) com.google.common.collect.ComputingConcurrentHashMap$ComputingValueReference.compute(ComputingConcurrentHashMap.java:355) com.google.common.collect.ComputingConcurrentHashMap$ComputingSegment.compute(ComputingConcurrentHashMap.java:184) com.google.common .collect.ComputingConcurrentHashMap$ComputingSegment.getOrCompute(ComputingConcurrentHashMap.java:153) at com.google.common.collect.ComputingConcurrentHashMap.getOrCompute(ComputingConcurrentHashMap.java:69) at com.google.common.collect.ComputingConcurrentHashMap$ComputingMapAdapter.get(ComputingConcurrentHashMap .java:393) ...39 更多原因:javax.naming.NamingException:在 SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory. state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [根异常是 javax.naming.NameNotFoundException: ] at com。 sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) 在 com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) 在 com.sun.enterprise.naming.impl。 SerialContext.lookup(SerialContext.java:654) at javax.naming.InitialContext.lookup(InitialContext.java:415) at javax.naming.InitialContext.lookup(InitialContext.java:415) at org.richfaces.application.push.impl .jms。JMSTopicsContextImpl$JMSTopicContext.createConnection(JMSTopicsContextImpl.java:98) 在 org.richfaces.application.push.impl.jms.JMSTopicsContextImpl$JMSTopicContext.start(JMSTopicsContextImpl.java:123) 在 org.richfaces.application.push.impl.jms。 JMSTopicsContextImpl$1.apply(JMSTopicsContextImpl.java:199) ... 45 更多原因:javax.naming.NameNotFoundException: at com.sun.enterprise.naming.impl.TransientContext.resolveContext(TransientContext.java:310) at com.sun .enterprise.naming.impl.TransientContext.lookup(TransientContext.java:218) 在 com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:77) 在 com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl .lookup(LocalSerialContextProviderImpl.java:119) 在 com.sun.enterprise.naming.impl.SerialContext。查找(SerialContext.java:505)... 52 更多

底线:JMS(我认为)找不到statusPush主题。

更新:在 web.xml 中启用了 JMS,更改为

<context-param>
    <param-name>org.richfaces.push.jms.enable</param-name>
    <param-value>true</param-value>
</context-param>

现在堆栈跟踪是:

警告:StandardWrapperValve [AutoRegisteredPushServlet]:PWC1406:Servlet AutoRegisteredPushServlet 的 Servlet.service() 在 org.atmosphere.handler.ReflectorServletProcessor.onRequest(ReflectorServletProcessor.java:171) 处抛出异常 java.lang.RuntimeException: java.lang.NullPointerException。 org.atmosphere.cpr.AsynchronousProcessor.suspended(AsynchronousProcessor.java:166) at org.atmosphere.container.GrizzlyCometSupport.service(GrizzlyCometSupport.java:119) at org.atmosphere.cpr.AsynchronousProcessor.action(AsynchronousProcessor.java:248) .atmosphere.container.GlassFishWebSocketSupport.service(GlassFishWebSocketSupport.java:110) 在 org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1257) 在 org.atmosphere.cpr.AtmosphereServlet.doPost(AtmosphereServlet.java:293) 在 org.atmosphere.cpr.AtmosphereServlet.doGet(AtmosphereServlet.java:279) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:668) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java :770) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 在 org.apache.catalina.core 的 org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)。 StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at org .apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) 在 org.apache。catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 在 com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) 在 com.sun.enterprise.v3.services。 impl.ContainerMapper.service(ContainerMapper.java:195) 在 com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) 在 com.sun.grizzly.comet.CometEngine.executeServlet(CometEngine.java:459)在 com.sun.grizzly.comet.CometEngine.handle(CometEngine.java:316) 在 com.sun.grizzly.comet.CometAsyncFilter.doFilter(CometAsyncFilter.java:87) 在 com.sun.grizzly.arp.DefaultAsyncExecutor.invokeFilters (DefaultAsyncExecutor.java:171) 在 com.sun.grizzly.arp.DefaultAsyncExecutor.interrupt(DefaultAsyncExecutor.java:143) 在 com.sun.grizzly.arp.AsyncProcessorTask.doTask(AsyncProcessorTask.java:102) 在 com.sun.grizzly.http.TaskBase.run(TaskBase.java:193) 在 com.sun.grizzly.http.TaskBase.execute(TaskBase.java:175) 在 com.sun.grizzly.arp.DefaultAsyncHandler .handle(DefaultAsyncHandler.java:145) 在 com.sun.grizzly.arp.AsyncProtocolFilter.execute(AsyncProtocolFilter.java:210) 在 com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 在 com.sun。 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 的 com.sun.grizzly.http.HttpProtocolChain.execute(DefaultProtocolChain.java:104) 的 grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) com .sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 在 com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 在 com.sun.grizzly。com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 上的 ContextTask.run(ContextTask.java:71) com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java: 513)在 java.lang.Thread.run(Thread.java:722) 引起:在 org.atmosphere.util.AtmosphereFilterChain 的 org.richfaces.webapp.PushHandlerFilter.doFilter(PushHandlerFilter.java:90) 的 java.lang.NullPointerException .doFilter(AtmosphereFilterChain.java:154) 在 org.atmosphere.util.AtmosphereFilterChain.invokeFilterChain(AtmosphereFilterChain.java:131) 在 org.atmosphere.handler.ReflectorServletProcessor$FilterChainServletWrapper.service(ReflectorServletProcessor.java:310) 在 org.atmosphere。 handler.ReflectorServletProcessor.onRequest(ReflectorServletProcessor.java:168) ... 40 更多71) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 在 java.lang.Thread 的 com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) .run(Thread.java:722) 由 org.atmosphere.util.AtmosphereFilterChain.doFilter(AtmosphereFilterChain.java:154) 的 org.richfaces.webapp.PushHandlerFilter.doFilter(PushHandlerFilter.java:90) 引起的 java.lang.NullPointerException ) 在 org.atmosphere.util.AtmosphereFilterChain.invokeFilterChain(AtmosphereFilterChain.java:131) 在 org.atmosphere.handler.ReflectorServletProcessor$FilterChainServletWrapper.service(ReflectorServletProcessor.java:310) 在 org.atmosphere.handler.ReflectorServletProcessor.onRequest(ReflectorServletProcessor.爪哇:168)... 40更多71) 在 com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 在 java.lang.Thread 的 com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) .run(Thread.java:722) 由 org.atmosphere.util.AtmosphereFilterChain.doFilter(AtmosphereFilterChain.java:154) 的 org.richfaces.webapp.PushHandlerFilter.doFilter(PushHandlerFilter.java:90) 引起的 java.lang.NullPointerException ) 在 org.atmosphere.util.AtmosphereFilterChain.invokeFilterChain(AtmosphereFilterChain.java:131) 在 org.atmosphere.handler.ReflectorServletProcessor$FilterChainServletWrapper.service(ReflectorServletProcessor.java:310) 在 org.atmosphere.handler.ReflectorServletProcessor.onRequest(ReflectorServletProcessor.爪哇:168)... 40更多doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:722) 原因:java.lang .NullPointerException at org.richfaces.webapp.PushHandlerFilter.doFilter(PushHandlerFilter.java:90) at org.atmosphere.util.AtmosphereFilterChain.doFilter(AtmosphereFilterChain.java:154) at org.atmosphere.util.AtmosphereFilterChain.invokeFilterChain(AtmosphereFilterChain.java :131) 在 org.atmosphere.handler.ReflectorServletProcessor.onRequest(ReflectorServletProcessor.java:168) 的 org.atmosphere.handler.ReflectorServletProcessor$FilterChainServletWrapper.service(ReflectorServletProcessor.java:310) ... 还有 40 个doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:722) 原因:java.lang .NullPointerException at org.richfaces.webapp.PushHandlerFilter.doFilter(PushHandlerFilter.java:90) at org.atmosphere.util.AtmosphereFilterChain.doFilter(AtmosphereFilterChain.java:154) at org.atmosphere.util.AtmosphereFilterChain.invokeFilterChain(AtmosphereFilterChain.java :131) 在 org.atmosphere.handler.ReflectorServletProcessor.onRequest(ReflectorServletProcessor.java:168) 的 org.atmosphere.handler.ReflectorServletProcessor$FilterChainServletWrapper.service(ReflectorServletProcessor.java:310) ... 还有 40 个513)在 java.lang.Thread.run(Thread.java:722) 引起:在 org.atmosphere.util.AtmosphereFilterChain 的 org.richfaces.webapp.PushHandlerFilter.doFilter(PushHandlerFilter.java:90) 的 java.lang.NullPointerException .doFilter(AtmosphereFilterChain.java:154) 在 org.atmosphere.util.AtmosphereFilterChain.invokeFilterChain(AtmosphereFilterChain.java:131) 在 org.atmosphere.handler.ReflectorServletProcessor$FilterChainServletWrapper.service(ReflectorServletProcessor.java:310) 在 org.atmosphere。 handler.ReflectorServletProcessor.onRequest(ReflectorServletProcessor.java:168) ... 40 更多513)在 java.lang.Thread.run(Thread.java:722) 引起:在 org.atmosphere.util.AtmosphereFilterChain 的 org.richfaces.webapp.PushHandlerFilter.doFilter(PushHandlerFilter.java:90) 的 java.lang.NullPointerException .doFilter(AtmosphereFilterChain.java:154) 在 org.atmosphere.util.AtmosphereFilterChain.invokeFilterChain(AtmosphereFilterChain.java:131) 在 org.atmosphere.handler.ReflectorServletProcessor$FilterChainServletWrapper.service(ReflectorServletProcessor.java:310) 在 org.atmosphere。 handler.ReflectorServletProcessor.onRequest(ReflectorServletProcessor.java:168) ... 40 更多doFilter(AtmosphereFilterChain.java:154) 在 org.atmosphere.util.AtmosphereFilterChain.invokeFilterChain(AtmosphereFilterChain.java:131) 在 org.atmosphere.handler.ReflectorServletProcessor$FilterChainServletWrapper.service(ReflectorServletProcessor.java:310) 在 org.atmosphere.handler .ReflectorServletProcessor.onRequest(ReflectorServletProcessor.java:168) ... 40 更多doFilter(AtmosphereFilterChain.java:154) 在 org.atmosphere.util.AtmosphereFilterChain.invokeFilterChain(AtmosphereFilterChain.java:131) 在 org.atmosphere.handler.ReflectorServletProcessor$FilterChainServletWrapper.service(ReflectorServletProcessor.java:310) 在 org.atmosphere.handler .ReflectorServletProcessor.onRequest(ReflectorServletProcessor.java:168) ... 40 更多

4

1 回答 1

0

您必须定期调用服务器并更新您的文本区域。这可以使用 a4j:poll 组件来实现,该组件会定期触发 ajax 请求并更新表单上的特定字段。一个例子可以在这里找到。

于 2012-10-14T08:09:44.383 回答