0

I'm completely new using cometd and I'm trying to use it to enable push messages in my web application. After testing successfully with jetty 8, I'm trying to plug cometd directly to my web application, so I've changed my web.xml this way:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="http://java.sun.com/xml/ns/javaee"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     id="erp-hm" version="3.0">
<display-name>ERP HM</display-name>
<welcome-file-list>
    <welcome-file>inicio.xhtml</welcome-file>
</welcome-file-list>
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet>
    <servlet-name>Logout Servlet</servlet-name>
    <servlet-class>com.hrgi.web.seguranca.ControladorLogout</servlet-class>
    <load-on-startup>3</load-on-startup>
</servlet>
<servlet>
    <servlet-name>push</servlet-name>
    <servlet-class>org.cometd.server.CometdServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
</servlet>
<servlet>
    <servlet-name>Download Servlet</servlet-name>
    <servlet-class>com.hrgi.web.erp.DownloadArquivoServlet</servlet-class>
    <load-on-startup>4</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Logout Servlet</servlet-name>
    <url-pattern>/j_spring_security_logout</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>push</servlet-name>
    <url-pattern>/push/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Download Servlet</servlet-name>
    <url-pattern>*.pdf</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value>
</context-param>
<context-param>
    <param-name>com.sun.faces.enableMissingResourceLibraryDetection</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/appContext.xml</param-value>
</context-param>
<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>server</param-value>
</context-param>
<context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Production</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
</context-param>
<context-param>
    <param-name>org.apache.myfaces.ERROR_HANDLING</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
    <param-value>/inicio.xhtml</param-value>
</context-param>
<listener>
    <listener-class>com.hrgi.web.erp.DataServletContextListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <async-supported>true</async-supported>
</filter>
<filter>
    <filter-name>filtroLimpadorCache</filter-name>
    <filter-class>com.hrgi.web.seguranca.FiltroLimpadorCache</filter-class>
    <async-supported>true</async-supported>
</filter>
<filter-mapping>
    <filter-name>filtroLimpadorCache</filter-name>
    <url-pattern>/login*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
<error-page>
    <error-code>403</error-code>
    <location>/acesso_negado.xhtml</location>
</error-page>
<error-page>
    <error-code>404</error-code>
    <location>/endereco_invalido.xhtml</location>
</error-page>
<session-config>
    <session-timeout>600</session-timeout>
</session-config>
</web-app> 

The first time javascript client try to connect I get 400 error:

jQuery(document).ready(function ($) {
cometd = $.cometd;
cometd.configure('https://localhost:8181/erp-web/push/');   
cometd.handshake();
});

when java client try to publish in the channel, I get this:

[#|2012-12-05T19:54:35.543+0000|INFO|oracle-glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=122;_ThreadName=Thread-8;|05/12/2012 - 19:54:35 [HttpClient-122] INFO org.cometd.client.BayeuxClient.2002219263 - Messages failed [{id=12, supportedConnectionTypes=[long-polling], channel=/meta/handshake, version=1.0}]
java.net.ProtocolException: Unexpected response 302: TransportExchange@5f331f10=POST//localhost:8181/erp-web/push/handshake#CONTENT(1ms)->COMPLETED(0ms)sent=22ms
at org.cometd.client.BayeuxClient$PublishTransportListener.onProtocolError(BayeuxClient.java:1161)
at org.cometd.client.transport.LongPollingTransport$TransportExchange.onResponseComplete(LongPollingTransport.java:324)
at org.eclipse.jetty.client.HttpExchange$Listener.onResponseComplete(HttpExchange.java:1158)
at org.eclipse.jetty.client.HttpExchange.setStatus(HttpExchange.java:305)
at org.eclipse.jetty.client.AbstractHttpConnection$Handler.messageComplete(AbstractHttpConnection.java:337)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:861)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
at org.eclipse.jetty.client.AsyncHttpConnection.handle(AsyncHttpConnection.java:133)
at org.eclipse.jetty.io.nio.SslConnection.handle(SslConnection.java:196)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:722)
|#]

Is there something I can do to solve it?? Or I should use jetty to implement cometd server??

brevleq
  • 2,081
  • 10
  • 53
  • 97

1 Answers1

1

For the JS client problem, I suspect you should disable WebSocket on the client, because Glassfish does not support WebSocket and CometD only works with Jetty's WebSocket implementation. See here for how to configure the JS client WebSocket transport.

For the Java client problem, if you get a 302 is probably because the URL you used to configure the BayeuxClient is not the CometD URL. The CometD servlet never replies with a 302, so you must be hitting the wrong URL.

sbordet
  • 16,856
  • 1
  • 50
  • 45
  • After I disable websocket, didn't got 400 error anymore, but when it try to connect primefaces blocks the browser whith his global ajax component. So, I'll use it in jetty, its easier. :) – brevleq Dec 06 '12 at 11:09