Праймфейсы подталкивают к странному поведению

Я пытаюсь заставить работать пример "Counter" Primefaces Push. На самом деле это работает, но мне нужно обновить страницу один раз, чтобы открыть конечную точку push. Как я могу открыть его при загрузке первой страницы?

Я запускаю это на Tomcat 8.0.24.

Вот зависимости в pom.xml:

<dependencies>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>servlet-api</artifactId>
        <version>6.0.44</version>
    </dependency>
    <dependency>
        <groupId>org.apache.myfaces.core</groupId>
        <artifactId>myfaces-api</artifactId>
        <version>2.2.8</version>
    </dependency>
    <dependency>
        <groupId>org.apache.myfaces.core</groupId>
        <artifactId>myfaces-impl</artifactId>
        <version>2.2.8</version>
    </dependency>
    <dependency>
        <groupId>org.primefaces</groupId>
        <artifactId>primefaces</artifactId>
        <version>5.2</version>
    </dependency>
    <dependency>
        <groupId>org.atmosphere</groupId>
        <artifactId>atmosphere-runtime</artifactId>
        <version>2.3.3</version>
    </dependency>
</dependencies>

Конечная точка:

@PushEndpoint("/counter")
public class CounterResource {

  @OnMessage(encoders = { JSONEncoder.class })
  public String onMessage(String count) {
    return count;
  }

  @OnOpen
  public void onOpen(RemoteEndpoint r, EventBus e) {
    System.out.println("CounterResource:onOpen PushEndpoint open!");
  }

  @OnClose
  public void onClose(RemoteEndpoint r, EventBus e) {
    System.out.println("CounterResource:onClose PushEndpoint closed!");
  }
}

Управляемый компонент:

@ManagedBean
@ApplicationScoped
public class GlobalCounterView implements Serializable {

  private volatile int count;

  public int getCount() {
    return count;
  }

  public void setCount(int count) {
    this.count = count;
  }

  public void increment() {
    count++;

    EventBus eventBus = EventBusFactory.getDefault().eventBus();
    eventBus.publish("/counter", String.valueOf(count));
  }
}

Страница counter.xhtml:

<h:body>
<h:form id="form">
    <h:outputText id="out" value="#{globalCounterView.count}"
        styleClass="ui-widget display" />

    <p:commandButton value="Click"
        actionListener="#{globalCounterView.increment}" />
</h:form>

<p:socket onMessage="handleMessage" channel="/counter" />

<script type="text/javascript">
    /* ugly workaround here
    window.onload = function() {
        if (!localStorage.justOnce) {
            localStorage.setItem("justOnce", "true");
            window.location.reload();
        }
    }*/

    function handleMessage(data) {
        $('.display').html(data);
    }
</script>

Веб.xml:

<!-- JSF -->
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

<!-- Primefaces Push -->
<servlet>
    <servlet-name>Push Servlet</servlet-name>
    <servlet-class>org.primefaces.push.PushServlet</servlet-class>
    <init-param>
        <param-name>org.atmosphere.cpr.broadcasterCacheClass</param-name>
        <param-value>org.atmosphere.cache.UUIDBroadcasterCache</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
</servlet>

<servlet-mapping>
    <servlet-name>Push Servlet</servlet-name>
    <url-pattern>/primepush/*</url-pattern>
</servlet-mapping>

При запуске этого кода у меня нет вывода, когда я впервые загружаю страницу и нажимаю кнопку, значение увеличивается на стороне сервера, но отображаемое значение не изменяется, поскольку конечная точка не открыта.

Затем, когда я обновляю страницу, открывается конечная точка, отображается правильное значение счетчика, а когда я нажимаю кнопку, значение увеличивается и отображается, как предполагалось.

Буду очень признателен за любую помощь в этом. Спасибо за помощь.


person Vinciwin    schedule 05.08.2015    source источник
comment
Есть ли какие-либо ошибки в инструменте разработчика браузера при первоначальном доступе к странице?   -  person Kukeltje    schedule 06.08.2015
comment
@Kukeltje Нет, у меня нет ошибок ни в консоли инструментов разработчика, ни в tomcat, и это меня очень беспокоит.   -  person Vinciwin    schedule 06.08.2015
comment
Также нет на вкладке сети инструментов разработчика? 101 или 404 или что-то в этом роде   -  person Kukeltje    schedule 06.08.2015
comment
Да, у меня есть код состояния 101. Я только что попытался развернуть проект на Tomcat 7.0.63, и он сразу заработал! Но код состояния 101 там тоже есть...   -  person Vinciwin    schedule 06.08.2015


Ответы (1)


Изменение сервера приложений с Tomcat 8.0.24 на Tomcat 7.0.63 решило проблему!

Я согласен с этим решением, так как мне абсолютно не нужен Tomcat 8.

И благодаря @Kukeltje я заметил некоторую разницу между Tomcat 7 и Tomcat 8, происходящую на сетевом уровне при загрузке первой страницы. Я думаю, что проблема может быть связана с атмосферой во время выполнения, и я посмотрю на это подробнее, чтобы удовлетворить свое любопытство :)

person Vinciwin    schedule 06.08.2015
comment
Хорошо, что это работает. Возможно, тогда поможет другая версия Atmosphere (или попробуйте PF 5.3-SNAPSHOT с последней атмосферой). Или, может быть, поищите в списке проблем с атмосферой. - person Kukeltje; 06.08.2015