【问题标题】:Adaptive polling with JSF and PrimeFaces使用 JSF 和 PrimeFaces 进行自适应轮询
【发布时间】:2012-06-12 15:34:38
【问题描述】:

为了刷新数据,我使用了一个primefacespoll

<p:poll id="myPoll" interval="#{controller.interval}"/>

并且想用微调器控制更新间隔。

<p:spinner  value="#{controller.interval}">
  <p:ajax process="@this" update="myPoll"/>
</p:spinner>

bean 属性的值按预期更新,但轮询间隔没有。轮询由生成的脚本执行,其中包括间隔值。如何强制 poll 重新生成更新脚本以包含新值而不提交/重新渲染整个表单?

【问题讨论】:

    标签: java ajax jsf primefaces polling


    【解决方案1】:

    如果你给它一个widgetVar,那么你可以用javascript来操作它。

    widget_form_j_idt19.stop();
    widget_form_j_idt19.timer = 1;
    widget_form_j_idt19.cfg.frequency = 1;
    widget_form_j_idt19.start();
    

    只需将其放入脚本中,您应该能够在 ajax 更新后将其更新为您想要的任何内容。

    【讨论】:

    • 谢谢,maple_shaft。我花了一段时间来尝试它,但它确实有效。还有……我不太明白 - timer 是原始 pf.js 中的一个函数。为什么将其设置为数字有效?而且 - 当我用 firebug 检查元素时, poll 元素的脚本不会改变。为什么?
    【解决方案2】:

    在这里解决:

    我遇到了类似的行为,只需在 bean 中设置值并将投票嵌入面板中即可解决,例如在每次投票后可以更新该面板。否则,poll 只是 js 代码,并没有添加到 DOM 中。否则你可能会在回调参数上执行js并在客户端刷新值。

        <p:outputPanel id="infoPanel" >
        <h:panelGrid columns="1">
            <h1>TESTING POLLING</h1>
            <h:outputText id="ts" value="TS Update:#{testPollBean.timeStamp}"/>
            <h:outputText id="callNum" value="Call Number:#{testPollBean.callNumber}°"/>
            <h:outputText id="interval" value="Interval:#{testPollBean.interval} second"/>
            <h:outputText id="Stop" value="Stop:"#{testPollBean.stopPolling}"/>
        </h:panelGrid>  
    </p:outputPanel>
    
    <h:panelGrid id="panelPolling">
        <p:poll id="durrPolling" async="true" stop="#{testPollBean.stopPolling}"
            interval="#{testPollBean.interval}" 
            process="@this" partialSubmit="true" listener="#{testPollBean.listener}"
            update="panelPolling infoPanel" widgetVar="polling"
            autoStart="true" rendered="true"/>
    </h:panelGrid>
    
    @ViewScoped
    @Named(value = "testPollBean")
    public class TestPollBean implements Serializable {
    
        private static final long serialVersionUID = 1L;
        private static final Logger LOG = Logger.getLogger(TestPollBean.class);
        private Calendar calendar;
        private Date timeStamp;
        private Date nextCall;
        private int callNumber;
        private int interval;
        private boolean stopPolling;
        private boolean listenerBusy;
    
        @PostConstruct
        public void init() {
            this.calendar = Calendar.getInstance();
            this.timeStamp = calendar.getTime();
            this.nextCall = null;
            this.callNumber = 0;
            this.interval = 1;
            stopPolling = false;
            listenerBusy = false;
        }
    
        public void listener() {
            callNumber ++;
            LOG.info("-> Poll "+ callNumber + "° on thread " + Thread.currentThread().getId());
            if (!listenerBusy) {
                listenerBusy = true; // skip any other concurrence call 
    
                if (callNumber >= 30) {
                    //stopPolling = true;
                    this.interval = 30;
                }
    
                if (callNumber < 20) {
                    this.timeStamp = calendar.getTime();
                    calendar.add(Calendar.SECOND, interval);
                    nextCall = calendar.getTime();
    
                    LOG.info("\t > Attennding "+ callNumber + "° call on  thread " + Thread.currentThread().getId() + ". Sleeping ..." );
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        LOG.info("\t\t E R R O R ! ! ! \t > Attennding "+ callNumber + "° call on  thread " + Thread.currentThread().getId() );
                    }
                    //Later on we will try to adapt dynamically the interval.
                } else  {
                    LOG.info("\t > Attennding inmediately "+ callNumber + "° call on  thread " + Thread.currentThread().getId() + "." );
                }
                LOG.info("<-  Poll "+ callNumber + "° on thread " + Thread.currentThread().getId());
    
                listenerBusy = false;
            } else {
                LOG.info("<- Listener on thread " + Thread.currentThread().getId() + " dismiss call " + callNumber + "° cause is already busy.");
            }
        }
        + Getters / Setters
    

    恕我直言;不要玩弄已经完成和正在工作的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2013-10-01
      • 2011-10-20
      • 2016-08-14
      • 2012-06-26
      • 1970-01-01
      相关资源
      最近更新 更多