11 Replies Latest reply: Jan 17, 2012 6:14 AM by Lukáš Fryč RSS

a4j:push topic 'pushTest' is not configured

Brendan Healey Master

I'm trying to get a4j:push working with CDI events on 4.1.0.Final. I have:

 

<a4j:push address="pushTest"

                ondataavailable="alert(event.rf.data)"/>

 

@Inject

@Push(topic = "pushTest")

private Event<String> pushEvent;

 

public void sendMessage() throws Exception {

        pushEvent.fire("let's see if this works 2");

}

 

web.xml

<context-param>

        <param-name>org.richfaces.push.jms.disable</param-name>

        <param-value>true</param-value>

</context-param>

 

pom.xml

<dependency>

            <groupId>org.atmosphere</groupId>

            <artifactId>atmosphere-runtime</artifactId>

</dependency>

 

When I load the page containing a4j:push, I get an alert saying topic 'pushTest' is not configured. When

I call the sendMessage() method the alert isn't opened by a4j:push. In the server log I see this output when

I deploy the application:

 

server log:

INFO: SESSION CREATED ID: 901939c9b5c1f6777c0ca6a844d2

INFO: Atmosphere is using async support: org.atmosphere.container.Servlet30CometSupportWithWebSocket running under container: "" with WebSocket enabled.

INFO: Installed AtmosphereHandler null mapped to context-path: /*

INFO: Installing Servlet null

INFO: Installing Filter PushHandlerFilter

INFO: Using broadcaster class: org.atmosphere.cpr.DefaultBroadcaster

INFO: Atmosphere Framework 0.8.0-RC1 started.

 

Is there any additional configuration required? I'm using glassfish 3.1.1 and have enabled comet.

 

Update: I've added a simple listener and changed the code to use HelloEvent, and the event is getting

fired successfully, so there must be something I'm missing on the a4j:push side of things.

 

@Stateless

public class HelloListener {

    public void listenToHello(@Observes HelloEvent helloEvent){

        SQLog.log("HelloEvent: " + helloEvent.getMessage());

    }

}

 

Update 2: when the page containing a4j:push loads I get the javascript alert box with the 'pushTest is not

configured' message referred to above, I ok this an then see this error in the javascript console (chrome browser):

 

  1. GET https://localhost:8181/uk.co.sportquest_SportQuest_war_1.0.0/rfRes/org.richfaces.resource.PushResource.xhtml?__richfacesPushAsync=1&pushSessionId=a0c5e133-80a9-4310-ae6c-f37e3c4c8964 500 (Internal Server Error)
    1. executeRequestjquery-atmosphere.js.xhtml:281
    2. subscribejquery-atmosphere.js.xhtml:91
    3. richfaces.Push.pushSessionIdRequestHandlerpush.js.xhtml:112
    4. jQuery.extend._Deferred.deferred.resolveWithjquery.js.xhtml:1016
    5. donejquery.js.xhtml:7247
    6. jQuery.ajaxTransport.send.callbackjquery.js.xhtml:8028

 

Thanks,

Brendan.

  • 1. Re: a4j:push topic 'pushTest' is not configured
    Brendan Healey Master

    bump - Hi, I'm keen to know if I'm looking at a Glassfish/Weld problem here, or a more general issue.

    Is anyone using a4j:push with 4.1.0.Final, if so with CDI events?

     

    Regards,

    Brendan.

  • 3. Re: a4j:push topic 'pushTest' is not configured
    Brendan Healey Master

    Thanks Ibrahim, this is very helpful. I still have a problem because I'm running into this IllegalArgumentException:

     

    WARNING: StandardWrapperValve[FacesServlet]: PWC1406: Servlet.service() for servlet FacesServlet threw exception

    java.lang.IllegalArgumentException

              at org.richfaces.resource.PushResource.encode(PushResource.java:85)

              at org.richfaces.resource.UserResourceWrapperImpl.encode(UserResourceWrapperImpl.java:188)

              at org.richfaces.resource.ResourceHandlerImpl.handleResourceRequest(ResourceHandlerImpl.java:222)

              at javax.faces.application.ResourceHandlerWrapper.handleResourceRequest(ResourceHandlerWrapper.java:125)

              at javax.faces.webapp.FacesServlet.service(FacesServlet.java:591)

              at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)

              at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)

              at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)

              at uk.co.sportquest.jsfbeans.helper.CacheFilterStatic.doFilter(CacheFilterStatic.java:138)

              at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)

              at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)

     

     

    Any ideas anyone? It's not exactly easy to use is it?

  • 4. Re: a4j:push topic 'pushTest' is not configured
    iabughosh Master

    is it working now and throws this exception ?, are you calling pushEvent.fire from EJB context ?, pleasae post your bean and xhtml page.

     

    also check this, i have some doubt about your filter (uk.co.sportquest.jsfbeans.helper.CacheFilterStatic.doFilter(CacheFilterStatic.java:138)) :

    http://stackoverflow.com/questions/7607780/java-jsf-strange-error-warning-standardwrappervalve-pwc1406-servlet-service

  • 5. Re: a4j:push topic 'pushTest' is not configured
    Brendan Healey Master

    Hi Ibrahim, this is what I've got:

     

    <a4j:log/>

    <h:outputText id="uid" value="uid: #{leagueMgrFixturesView.userIdentifier}"/>

    <a4j:push address="#{leagueMgrFixturesView.userIdentifier}@pushCdi"

              onerror="alert('error: ' + event.rf.data)"

              ondataavailable="alert('data: ' + event.rf.data)">

       <a4j:ajax event="dataavailable"/>

    </a4j:push>

    <a4j:commandButton value="push" action="#{leagueMgrFixturesView.sendMessage}"/>

     

    and the java:

     

    private static final String CDI_PUSH_TOPIC = "pushCdi";

        private String userIdentifier;

        @Inject

        @Push(topic = CDI_PUSH_TOPIC, subtopic = "#{leagueMgrFixturesView.userIdentifier}")

        private javax.enterprise.event.Event<String> pushEvent;

     

        @PostConstruct

        public void init() {

     

            if (userIdentifier == null) {

                userIdentifier = UUID.randomUUID().toString().replace("-", "");

            }

     

            TopicsContext topicsContext = TopicsContext.lookup();

            topicsContext.getOrCreateTopic(new TopicKey(CDI_PUSH_TOPIC, userIdentifier));

        }

     

     

        public void sendMessage() throws Exception {

            Log.log("sendMessage");

            pushEvent.fire("a test message");

            //pushEvent.fire(new HelloEvent("TEST"));

        }

     

    Regards,

    Brendan.

  • 6. Re: a4j:push topic 'pushTest' is not configured
    iabughosh Master

    did u check your filter code (uk.co.sportquest.jsfbeans.helper.CacheFilterStatic.doFilter(CacheFilterStatic.java:138)) : ?

     

    see this link for more information:

    http://stackoverflow.com/questions/7607780/java-jsf-strange-error-warning-standardwrappervalve-pwc1406-servlet-service

  • 7. Re: a4j:push topic 'pushTest' is not configured
    Brendan Healey Master

    I did, the filter simply sets headers and calls chain.doFilter(req,res); - but I'll try without it just to be sure...

  • 8. Re: a4j:push topic 'pushTest' is not configured
    Brendan Healey Master

    I've just tried with the filter removed but still get the exception. I found two other posts on here from people with the same

    problem, but no obvious solution. Hmmmm

  • 9. Re: a4j:push topic 'pushTest' is not configured
    Lukáš Fryč Master

    Hi Brendan, as I said in similar topic [1],

     

    the problem is the "pushTopic" is not propagated to the server.

     

    It should not happen in your code, unless your <a4j:push address="" />.

     

    It would be great if you could provide me maven app reproducing your issue so I can identify what's the problem.

     

    [1] https://community.jboss.org/message/646996#646996

  • 10. Re: a4j:push topic 'pushTest' is not configured
    Brendan Healey Master

    After a fair bit of messing about I've got it working and here, as far as I can tell, is everything relevant to getting

    this working. A few points to bear in mind:

     

    1. I'm using a servlet v3 container (web.xml: web-app version="3.0") so don't need to declare the push servlet

        explicitly in web.xml, but you might need to.

     

    2. I've seen some examples of a PushFilter in web.xml, this definitely was causing me problems and I only got

        it working after removing this.

     

    3. I've seen it suggested to use this in the web.xml but I haven't needed to:

     

       <context-param>

            <param-name>org.richfaces.push.handlerMapping</param-name>

            <param-value>/__richfaces_push</param-value>

       </context-param>

     

    4. There seems to be a problem with Atmosphere version later than (not including) 0.8.0-RC1

         that causes a NoClassDefFound error for WebSockets (something like that anyway). A big

         thanks to Vadim Si for figuring this out. The latest version 0.8.2 doesn't work.

     

    5. The lines relating to topicsContext in the java file are needed - that's what causes the "topic

         'topic-name' is not configured error". These are missing from the showcase example, but are

        referenced in the component guide.

     

    Regards,

    Brendan.

     

    pom.xml

     

    <dependency>

                <groupId>org.atmosphere</groupId>

                <artifactId>atmosphere-runtime</artifactId>

                <version>0.8.0-RC1</version>

                <type>jar</type>

    </dependency>

     

    domain.xml

     

    <jvm-options>-Dcom.sun.grizzly.http.asyncwrite.enabled=true</jvm-options>

    <jvm-options>-Dcom.sun.grizzly.http.asyncwrite.maxBufferPoolSize=10000</jvm-options>

     

    web.xml

     

    <context-param>

            <param-name>org.richfaces.push.jms.disable</param-name>

            <param-value>true</param-value>

        </context-param>

        <context-param>

            <param-name>org.atmosphere.useBlocking</param-name>

            <param-value>true</param-value>

    </context-param>

    <servlet>

            <description>AtmosphereServlet</description>

            <servlet-name>AtmosphereServlet</servlet-name>

            <servlet-class>org.atmosphere.cpr.AtmosphereServlet</servlet-class>

            <async-supported>true</async-supported>

    </servlet>

     

    test.xhtml

     

    <h:outputText id="uid" value="uid: #{testBean.userIdentifier}"/>

    <a4j:push address="#{testBean.userIdentifier}@pushCdi"

                   onerror="alert('error: ' + event.rf.data)"

                   ondataavailable="alert('data: ' + event.rf.data)">

        <a4j:ajax event="dataavailable"/>

    </a4j:push>

     

    TestBean.java

       

    @ViewScoped

    public class TestBean implements Serializable {

     

        private static final String CDI_PUSH_TOPIC = "pushCdi";

        private String userIdentifier;

        @Inject

        @Push(topic = CDI_PUSH_TOPIC, subtopic = "#{testBean.userIdentifier}")

        private javax.enterprise.event.Event<String> pushEvent;

     

        @PostConstruct

        public void init() {

     

            if (userIdentifier == null) {

                userIdentifier = UUID.randomUUID().toString().replace("-", "");

            }

     

            TopicsContext topicsContext = TopicsContext.lookup();

            topicsContext.getOrCreateTopic(new TopicKey(CDI_PUSH_TOPIC, userIdentifier));

        }

     

        public void sendMessage() throws Exception {

            Log.log("sendMessage");

            pushEvent.fire("a test message");

        }

     

        // add getters & setters

  • 11. Re: a4j:push topic 'pushTest' is not configured
    Lukáš Fryč Master

    Please refer to Starting with RichFaces Push on Various Servlet Containers .

     

    I would appreciate your feedback there.