Primefaces Push (Chat) WARNUNG: No Broadcaster matches...

UI Components for JSF
Post Reply
ridakbay
Posts: 1
Joined: 11 Apr 2013, 19:08

26 Feb 2014, 02:45

Hello to all Primefaces Funs,

I'm trying to implement since 2 weeks http://www.primefaces.org/showcase/push/chat.jsf and need your help :oops:

After login I get on the console:
org.atmosphere.cpr.MetaBroadcaster broadcast
WARNING: No Broadcaster matches /chat/. Message {"data":"Tester joined the channel."} WILL BE LOST. Make sure you cache it or make sure the Broadcaster exists before.


when I send something comes on the console;
org.atmosphere.cpr.MetaBroadcaster broadcast
WARNUNG: No Broadcaster matches /chat/[/a-zA-Z0-9-&.*=@_;\?]+. Message {"data":"Tester: test"} WILL BE LOST. Make sure you cache it or make sure the Broadcaster exists before.


I use:
atmosphere-compat-jbossweb-1.0.18.jar
atmosphere-compat-tomcat-0.5-SNAPSHOT.jar
atmosphere-compat-tomcat7-1.0.18.jar
atmosphere-compat-weblogic-0.8.7.jar
atmosphere-runtime-2.0.7.jar
primefaces-4.0.jar
primefaces-mobile-0.9.5-20130516.100321-1.jar
slf4j-api-1.6.6.jar
slf4j-jdk14-1.6.6.jar
slf4j-log4j12-1.6.6.jar
slf4j-simple-1.6.6.jar

with Apache Tomcat v7.0.52

web.xml

Code: Select all

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>ChatIn</display-name>
  <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>
    <servlet-name>Push Servlet</servlet-name>
    <servlet-class>org.primefaces.push.PushServlet</servlet-class>
    <init-param>
      <param-name>org.atmosphere.websocket.maxTextMessageSize</param-name>
      <param-value>0</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.AtmosphereInterceptor</param-name>
      <param-value>
             org.atmosphere.client.TrackMessageSizeInterceptor,
             org.atmosphere.interceptor.HeartbeatInterceptor,
             org.atmosphere.interceptor.BroadcastOnPostAtmosphereInterceptor
             </param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.CometSupport.maxInactiveActivity</param-name>
      <param-value>30000</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.Broadcaster.supportOutOfOrderBroadcast</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.broadcaster.maxProcessingThreads</param-name>
      <param-value>10</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.broadcaster.maxAsyncWriteThreads</param-name>
      <param-value>10</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.filter</param-name>
      <param-value>org.springframework.web.filter.DelegatingFilterProxy</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.filter.name</param-name>
      <param-value>springSecurityFilterChain</param-value>
    </init-param>
    <init-param>
      <param-name>filterMappingUrlPattern</param-name>
      <param-value>/*</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.broadcasterClass</param-name>
      <param-value>org.atmosphere.cpr.DefaultBroadcaster</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.broadcasterCacheClass</param-name>
      <param-value>org.atmosphere.cache.UUIDBroadcasterCache</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.resumeOnBroadcast</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.useNative</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.broadcastFilterClasses</param-name>
      <param-value>org.atmosphere.client.TrackMessageSizeFilter</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.sessionSupport</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.useWebSocket</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.useStream</param-name>
      <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>
  <context-param>
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
  </context-param>
  <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
  </context-param>
  <listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
  </listener>
</web-app>
faces-config.xml:

Code: Select all

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    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-facesconfig_2_0.xsd"
    version="2.0">

    <managed-bean>
        <managed-bean-name>chatView</managed-bean-name>
        <managed-bean-class>chatin.bean.ChatView</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
        <managed-property>
            <property-name>users</property-name>
            <value>#{chatUsers}</value>
        </managed-property>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>chatUsers</managed-bean-name>
        <managed-bean-class>chatin.clas.ChatUsers</managed-bean-class>
        <managed-bean-scope>application</managed-bean-scope>
    </managed-bean>
</faces-config>
ChatView.java

Code: Select all

package chatin.bean;

import javax.faces.application.FacesMessage;  
import javax.faces.context.FacesContext;  
import org.primefaces.context.RequestContext;  
import org.primefaces.push.PushContext;  
import org.primefaces.push.PushContextFactory;  
import chatin.clas.ChatUsers;
  
public class ChatView {  
	private final PushContext pushContext = PushContextFactory.getDefault().getPushContext();  
    private ChatUsers users;  
    private String privateMessage;  
    private String globalMessage;  
    private String username;  
    private boolean loggedIn;  
    private String privateUser;  
    private final static String CHANNEL = "/chat/";  
    
    public ChatView() {
    	this.loggedIn = false;
	}
	public void setUsers(ChatUsers users) {  
        this.users = users;  
    }  
    public String getPrivateUser() {  
        return privateUser;  
    }  
    public void setPrivateUser(String privateUser) {  
        this.privateUser = privateUser;  
    }  
    public String getGlobalMessage() {  
        return globalMessage;  
    }  
    public void setGlobalMessage(String globalMessage) {  
        this.globalMessage = globalMessage;  
    }  
    public String getPrivateMessage() {  
        return privateMessage;  
    }  
    public void setPrivateMessage(String privateMessage) {  
        this.privateMessage = privateMessage;  
    }  
    public String getUsername() {  
        return username;  
    }  
    public void setUsername(String username) {  
        this.username = username;  
    }  
    public boolean isLoggedIn() {  
        return loggedIn;  
    }  
    public void setLoggedIn(boolean loggedIn) {  
        this.loggedIn = loggedIn;  
    }  
    public void sendGlobal() {  
        pushContext.push(CHANNEL + "*", username + ": " + globalMessage);  
        globalMessage = null;  
    }  
    public void sendPrivate() {  
        pushContext.push(CHANNEL + privateUser, "[PM] " + username + ": " + privateMessage);  
        privateMessage = null;  
    }  
    public void login() {  
        RequestContext requestContext = RequestContext.getCurrentInstance();  
        if(users.contains(username)) {  
            loggedIn = false;  
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Username taken", "Try with another username."));  
            requestContext.update("growl");  
        }else{  
            users.addUser(username);  
            pushContext.push(CHANNEL, username + " joined the channel.");  
            requestContext.execute("subscriber.connect('/" + username + "')");  
            loggedIn = true;  
        }  
    }  
    public void disconnect() {  
        //remove user and update ui  
        users.removeUser(username);  
        RequestContext.getCurrentInstance().update("form:users");  
        //push leave information  
        pushContext.push(CHANNEL, username + " left the channel.");  
        //reset state  
        loggedIn = false;  
        username = null;  
    }  
}  
index.xhtml

Code: Select all

<?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:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui" >

	<h:head>
		<title>ChatIn</title>
	</h:head>
	
	<h:body >
		<p:growl id="growl" showDetail="true" />  
		<h:form id="form">  
		    <p:fieldset id="container" legend="PrimeChat" toggleable="true">  
		        <h:panelGroup rendered="#{chatView.loggedIn}">  
		            <h:panelGrid columns="2" columnClasses="publicColumn,usersColumn" style="width:100%">  
		                <p:outputPanel id="public" layout="block" styleClass="ui-corner-all ui-widget-content chatlogs" >

		                </p:outputPanel>  
		                <p:dataList id="users" var="user" value="#{chatUsers.users}" styleClass="usersList">  
		                    <f:facet name="header">  
		                        Users  
		                    </f:facet>  
		                    <p:commandButton title="Chat" icon="ui-icon-comment" oncomplete="PF('pChat').show()" update=":form:privateChatContainer">  
		                        <f:setPropertyActionListener value="#{user}" target="#{chatView.privateUser}" />  
		                    </p:commandButton>  
		                    #{user}  
		                </p:dataList>  
		            </h:panelGrid>  
		            <p:separator />  
		            <p:inputText value="#{chatView.globalMessage}" styleClass="messageInput" />  
		            <p:spacer width="5" />  
		            <p:commandButton value="Send" actionListener="#{chatView.sendGlobal}" oncomplete="$('.messageInput').val('').focus()"/>  
		            <p:spacer width="5" />  
		            <p:commandButton value="Disconnect" actionListener="#{chatView.disconnect}" global="false" update="container" />  
		        </h:panelGroup>  
		        <h:panelGroup rendered="#{not chatView.loggedIn}" >  
		            Username: <p:inputText value="#{chatView.username}" />  
		            <p:spacer width="5" />  
		            <p:commandButton value="Login" actionListener="#{chatView.login}" update="container"   
		                                icon="ui-icon-person" />  
		        </h:panelGroup>  
		    </p:fieldset>  
		    <p:dialog widgetVar="pChat" header="Private Chat" modal="true" showEffect="fade" hideEffect="fade">  
		        <h:panelGrid id="privateChatContainer" columns="2" columnClasses="vtop,vtop">  
		            <p:outputLabel for="pChatInput" value="To: #{chatView.privateUser}" />  
		            <p:inputTextarea id="pChatInput" value="#{chatView.privateMessage}" rows="5" cols="30" />  
		            <p:spacer />  
		            <p:commandButton value="Send" actionListener="#{chatView.sendPrivate}" oncomplete="PF('pChat').hide()" />  
		        </h:panelGrid>  
		    </p:dialog>  
		</h:form>  
		<p:socket onMessage="handleMessage" channel="/chat" autoConnect="false" widgetVar="subscriber"/>  
		<script type="text/javascript">  
		    function handleMessage(data) { 
		    	alert('test');
		        var chatContent = $(PrimeFaces.escapeClientId('form:public'));  
		        chatContent.append(data + '<br />');  
		  
		        //keep scroll  
		        chatContent.scrollTop(chatContent.height());  
		    }  
		</script>  
	</h:body>
</html>
:geek: thanks for your help.....

smithh032772
Posts: 6144
Joined: 10 Sep 2011, 21:10

26 Feb 2014, 06:55

you don't need all of these. all you need is the atmosphere-runtime-2.0.7.jar

Code: Select all

atmosphere-compat-jbossweb-1.0.18.jar
atmosphere-compat-tomcat-0.5-SNAPSHOT.jar
atmosphere-compat-tomcat7-1.0.18.jar
atmosphere-compat-weblogic-0.8.7.jar
atmosphere-runtime-2.0.7.jar
you don't need all of this.

Code: Select all

  <servlet>
    <servlet-name>Push Servlet</servlet-name>
    <servlet-class>org.primefaces.push.PushServlet</servlet-class>
    <init-param>
      <param-name>org.atmosphere.websocket.maxTextMessageSize</param-name>
      <param-value>0</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.AtmosphereInterceptor</param-name>
      <param-value>
             org.atmosphere.client.TrackMessageSizeInterceptor,
             org.atmosphere.interceptor.HeartbeatInterceptor,
             org.atmosphere.interceptor.BroadcastOnPostAtmosphereInterceptor
             </param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.CometSupport.maxInactiveActivity</param-name>
      <param-value>30000</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.Broadcaster.supportOutOfOrderBroadcast</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.broadcaster.maxProcessingThreads</param-name>
      <param-value>10</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.broadcaster.maxAsyncWriteThreads</param-name>
      <param-value>10</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.filter</param-name>
      <param-value>org.springframework.web.filter.DelegatingFilterProxy</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.filter.name</param-name>
      <param-value>springSecurityFilterChain</param-value>
    </init-param>
    <init-param>
      <param-name>filterMappingUrlPattern</param-name>
      <param-value>/*</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.broadcasterClass</param-name>
      <param-value>org.atmosphere.cpr.DefaultBroadcaster</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.broadcasterCacheClass</param-name>
      <param-value>org.atmosphere.cache.UUIDBroadcasterCache</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.resumeOnBroadcast</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.useNative</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.broadcastFilterClasses</param-name>
      <param-value>org.atmosphere.client.TrackMessageSizeFilter</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.cpr.sessionSupport</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.useWebSocket</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>org.atmosphere.useStream</param-name>
      <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>
in my app, all i have is the following (make sure you look at the order):

Code: Select all

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

    <servlet>
        <servlet-name>Push Servlet</servlet-name>
        <servlet-class>org.primefaces.push.PushServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
        <init-param>
            <param-name>org.atmosphere.cpr.broadcasterCacheClass</param-name>
            <param-value>org.atmosphere.cache.UUIDBroadcasterCache</param-value>
        </init-param>
        <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>Push Servlet</servlet-name>
        <url-pattern>/primepush/*</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
Howard

PrimeFaces 6.0, Extensions 6.0.0, Push (Atmosphere 2.4.0)
TomEE+ 1.7.4 (Tomcat 7.0.68), MyFaces Core 2.2.9, JDK8
JUEL 2.2.7 | OmniFaces | EclipseLink-JPA/Derby | Chrome

Java EE 6 Tutorial|NetBeans|Google|Stackoverflow|PrimeFaces|Apache

suikast42
Posts: 17
Joined: 03 Jul 2012, 08:41

28 Mar 2014, 16:54

Hi,
did you solve the problem? I have the same issue. https://github.com/suikast42/websockettest

Post Reply

Return to “PrimeFaces”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 33 guests