[RESOLVIDO] Primefaces push

4 respostas
R

Pessoal, alguém conhece bem o PrimePush do primefaces ?
Estou dando uma estudada nele e implementei um exemplo do próprio prime, so que está dando um erro que não estou identificando o motivo.

Eu fiz esta classe :

package org.primefaces.examples.view;

import java.io.Serializable;

import org.primefaces.push.PushContext;
import org.primefaces.push.PushContextFactory;

public class GlobalCounterBean implements Serializable {

    private static final long serialVersionUID = -5427586947481134443L;
    private int count;

    public int getCount() {
        return count;
    }

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

    public synchronized void increment() {
        System.out.println("INICIANDO increment()");
        count++;

        PushContext pushContext = PushContextFactory.getDefault().getPushContext();
        pushContext.push("/counter", String.valueOf(count));

        System.out.println("finalizado increment()");

    }
}

Com este Xhtml :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui">

<p:growl id="growl" showDetail="true" />

<f:view>
	<h:head>
		<style type="text/css">
		.display {
			font-size: 36px !important;
		}
		</style>
		<script type="text/javascript">
  
            function handleMessage(data) {
            	alert(data);
                $('.display').html(data);
            }
   
		</script>
	</h:head>
	<h:body>
		<h:form id="form">
			<h:outputText id="out" value="#{globalCounter.count}"
				styleClass="ui-widget display" />
			<br />

			&lt;p:commandButton value="Click"
				actionListener="#{globalCounter.increment}" /&gt;
		&lt;/h:form&gt;
		&lt;p:socket onMessage="handleMessage" channel="/counter" /&gt;
	&lt;/h:body&gt;
&lt;/f:view&gt;
&lt;/html&gt;

Este exemplo na verdade é o exemplo counter que tem no manual do Primefaces.
A diferença aqui é que eu estou implementando no GlassFish 3.12
No glasfish eu ativei o Comet na opção da console SERVER-CONFIG/NETWORK-CONFIG/NETWORK-LISTENERS. Nesta opção peguei o listener que esta apontando para a porta 8080 e marquei as opções :Websockets Support e Comet Support

A aplicação sobre, porém que quando clico no botão que deveria atualizar o contador na tela, recebo essa mensagem na console do glassfish

[#|2013-01-20T15:10:53.981-0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=93;_ThreadName=Thread-2;|[Atmosphere-AsyncWrite-3] WARN org.atmosphere.cpr.DefaultBroadcaster - This message {"data":"5"} will be lost, adding it to the BroadcasterCache|#]

Não ocorre nenhuma exception, so esta mensagem. Percebo que o contador esta mudando a cada clique no botão, porem ele não atualiza na tela: (This message {"data":"5"} ).
Alguém tem uma dica, ou consegue ver algo neste código que estou deixando passar ?

Obrigado

4 Respostas

R

Tenho duas informações novas :

1º) Achei um texto na WEb dizendo que não posso ativar :Websockets Support e Comet Support juntos. Alguém que conheça os conceitos poderia me explicar sobre :Websockets e Comet Support ?

2º) Em outro texto uma pessoa comentou que o PrimePush e o GlassFish não trabalham bem direito

D

Acho que ta faltando uma anotação no seu GlobalCounterBean

R

A anotação de managed bean não estou usando pq fiz a configuração do managed bean no faces-config.
Tirando essa anotação, não existe nenhuma outra referenciada na documentação do primefaces

R

Novidades sobre essa tranqueira. Parece que está estável agora.

Em conversas no fórum do prime faces descobri que usando o primefaces 3.5 com o atmosfere 1.1 o GlassFish 3.1.2 tem que funcionar com o primepush.
Realmente haviam bugs que impediam o bom funcionamento do glassfish com as versões anterioes do atmosfere e primefaces.

Preciso fazer mais testes mas aparentemente ta funcionando. Deixei rodando horas esse exemplo e ele não parou de funcionar pelo menos.

Coloquei os seguintes jars do atmosfere na aplicação :
atmosphere-compat-jbossweb-1.1.0-SNAPSHOT.jar
atmosphere-compat-tomcat-1.1.0-SNAPSHOT.jar
atmosphere-compat-tomcat7-1.1.0-SNAPSHOT.jar
atmosphere-runtime-1.1.0-SNAPSHOT.jar

Mudei a versão do primefaces de 3.4 para 3.5
primefaces-3.5.jar

PS : Meu glassfish é o 3.1.2 e está habilitado a opção comet. A opção webSocket está desabilitada.

no Web.xml ficou assim :
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&gt;
	&lt;welcome-file-list&gt;
		&lt;welcome-file&gt;index.xhtml&lt;/welcome-file&gt;
	&lt;/welcome-file-list&gt;
	&lt;context-param&gt;
		&lt;param-name&gt;facelets.DEVELOPMENT&lt;/param-name&gt;
		&lt;param-value&gt;true&lt;/param-value&gt;
	&lt;/context-param&gt;
	&lt;servlet&gt;
		&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
		&lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;
		&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
	&lt;/servlet&gt;
	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/faces/*&lt;/url-pattern&gt;
		&lt;url-pattern&gt;*.jsf&lt;/url-pattern&gt;
		&lt;url-pattern&gt;*.xhtml&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;

	&lt;servlet&gt;
		&lt;servlet-name&gt;Resource Servlet&lt;/servlet-name&gt;
		&lt;servlet-class&gt;org.primefaces.resource.ResourceServlet&lt;/servlet-class&gt;
	&lt;/servlet&gt;

	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;Resource Servlet&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/primefaces_resource/*&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;

	&lt;servlet&gt;
		&lt;servlet-name&gt;Push Servlet&lt;/servlet-name&gt;
		&lt;servlet-class&gt;org.primefaces.push.PushServlet&lt;/servlet-class&gt;	
	&lt;/servlet&gt;

	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;Push Servlet&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/primepush/*&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;

	&lt;context-param&gt;
		&lt;param-name&gt;javax.faces.PARTIAL_STATE_SAVING&lt;/param-name&gt;
		&lt;param-value&gt;false&lt;/param-value&gt;
	&lt;/context-param&gt;

&lt;/web-app&gt;

Criei uma aplicação baseado no counter que tem na pagina do primefaces

ManagedBean :

package org.primefaces.examples.view;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

import org.primefaces.push.PushContext;
import org.primefaces.push.PushContextFactory;

@ManagedBean(name = &quot;globalCounter&quot;)
@ViewScoped
public class GlobalCounterBean {

	private int count = 0;
	
	private static boolean emLoop = true;


	public  void parar(ActionEvent e) {
		emLoop = false;
		System.out.println(emLoop);
	}
	
	
	public void monitor(ActionEvent e) {

		PushContext pushContext = PushContextFactory.getDefault()
				.getPushContext();
		while (emLoop) {			
			this.count++;			
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}		
			pushContext.push(&quot;/counter&quot;, String.valueOf(this.count));			
			System.out.println(count);		
		}
	}
}
Xhtml
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE html&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui"&gt;

&lt;p:growl id="growl" showDetail="true" /&gt;

&lt;f:view&gt;
	&lt;h:head&gt;
		&lt;style type="text/css"&gt;
			.display {
				font-size: 36px !important;
			}
		&lt;/style&gt;
		&lt;script type="text/javascript"&gt;
			function handleMessage(data) {				
				$('.display').html(data);
			}
		&lt;/script&gt;
	&lt;/h:head&gt;
	&lt;h:body&gt;
		&lt;h:form id="form" prependId="false"&gt;				
			&lt;p:remoteCommand autoRun="true" name="monitorSocket" actionListener="#{globalCounter.monitor}" async="true" &gt;&lt;/p:remoteCommand&gt;		
			&lt;h:outputText id="out" styleClass="display" /&gt;
			&lt;p:commandButton value="Parar" ajax="true" actionListener="#{globalCounter.parar}" /&gt;			
		&lt;/h:form&gt;
		&lt;p:socket onMessage="handleMessage" channel="/counter" /&gt;  
	&lt;/h:body&gt;
&lt;/f:view&gt;
&lt;/html&gt;
Criado 20 de janeiro de 2013
Ultima resposta 15 de fev. de 2013
Respostas 4
Participantes 2