如何配置Tomcat和HAProxy以使用WebSocket框架?

如何配置Tomcat和HAProxy以使用WebSocket框架?,tomcat,websocket,servlet-3.0,haproxy,atmosphere,Tomcat,Websocket,Servlet 3.0,Haproxy,Atmosphere,我有一个Java应用程序运行在Tomcat7上,它使用。Atmosphere是一个Websocket框架。我使用了来自的示例应用程序。 我的问题是,我没有得到连接器以及运行Websocket应用程序的正确配置 我的问题是: 我必须如何配置HAProxy 我必须如何配置我的Tomcat服务器 如何为APR和NIO连接器配置Tomcat 我是否必须更改应用程序中的某些内容(例如,我的web.xml) 如何修复以下错误 这是我的HAProxy配置: defaults mode http log glo

我有一个Java应用程序运行在Tomcat7上,它使用。Atmosphere是一个Websocket框架。我使用了来自的示例应用程序。 我的问题是,我没有得到连接器以及运行Websocket应用程序的正确配置

我的问题是:

  • 我必须如何配置HAProxy
  • 我必须如何配置我的Tomcat服务器
  • 如何为APR和NIO连接器配置Tomcat
  • 我是否必须更改应用程序中的某些内容(例如,我的web.xml)
  • 如何修复以下错误
  • 这是我的HAProxy配置:

    defaults
    mode http
    log global
    option httplog
    option  http-server-close
    option  dontlognull
    option  redispatch
    option  contstats
    retries 3
    backlog 10000
    timeout client      25s
    timeout connect     5s
    timeout server      25s
    # timeout tunnel available in ALOHA 5.5 or HAProxy 1.5-dev10 and higher
    #   timeout tunnel  3600s
    timeout http-keep-alive 1s
    timeout http-request        15s
    timeout queue        30s
    timeout tarpit      60s
    default-server inter 3s rise 2 fall 3
    option forwardfor
    
    
    frontend ft_web
      bind *:80 name http
      maxconn 60000
    
      acl host_testhostdev  hdr(host) -i www.testhost.com
    
      use_backend apache-8080 if host_testhostdev
    
      default_backend apache-8080
    
    
    backend apache-8080
      balance roundrobin
    
      server websrv1 localhost:8080 maxconn 8000 weight 10 cookie websrv1 check
    
    my Atmosphere Servlet的web.xml部分:

    <async-supported>true</async-supported>
    <init-param>
       <param-name>org.atmosphere.useNative</param-name>
       <param-value>true</param-value>
    </init-param>   
    
    <init-param>
    <param-name>org.atmosphere.cpr.AtmosphereInterceptor</param-name>
        <param-value>org.atmosphere.interceptor.HeartbeatInterceptor,org.atmosphere.interceptor.AtmosphereResourceLifecycleInterceptor,org.atmosphere.client.TrackMessageSizeInterceptor</param-value>
    </init-param>
    
    <init-param>
       <param-name>org.atmosphere.cpr.broadcaster.shareableThreadPool</param-name>
       <param-value>true</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.cpr.broadcasterCacheClass</param-name>
       <param-value>org.atmosphere.cache.UUIDBroadcasterCache</param-value>
    </init-param>
    

    如果我使用IE8和IE9访问我的应用程序:

    2013-08-08 00:56:19,631 [http-nio-8080-exec-9] ERROR cpr.AtmosphereFramework  - AtmosphereFramework exception
    java.lang.IllegalStateException: Not supported.
        at org.atmosphere.cpr.AtmosphereRequest.startAsync(AtmosphereRequest.java:594)
        at org.atmosphere.container.Servlet30CometSupport.suspend(Servlet30CometSupport.java:130)
        at org.atmosphere.container.Servlet30CometSupport.service(Servlet30CometSupport.java:105)
        at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.doService(Tomcat7Servlet30SupportWithWebSocket.java:65)
        at org.atmosphere.container.TomcatWebSocketUtil.doService(TomcatWebSocketUtil.java:87)
        at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.service(Tomcat7Servlet30SupportWithWebSocket.java:61)
        at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1594)
        at org.atmosphere.cpr.AtmosphereServlet.doPost(AtmosphereServlet.java:176)
        at org.atmosphere.cpr.AtmosphereServlet.doGet(AtmosphereServlet.java:162)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:722)
    2013-08-08 00:56:19,670 [http-nio-8080-exec-2] ERROR cpr.AtmosphereFramework  - AtmosphereFramework exception
    java.lang.IllegalStateException: Not supported.
        at org.atmosphere.cpr.AtmosphereRequest.startAsync(AtmosphereRequest.java:594)
        at org.atmosphere.container.Servlet30CometSupport.suspend(Servlet30CometSupport.java:130)
        at org.atmosphere.container.Servlet30CometSupport.service(Servlet30CometSupport.java:105)
        at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.doService(Tomcat7Servlet30SupportWithWebSocket.java:65)
        at org.atmosphere.container.TomcatWebSocketUtil.doService(TomcatWebSocketUtil.java:87)
        at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.service(Tomcat7Servlet30SupportWithWebSocket.java:61)
        at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1594)
        at org.atmosphere.cpr.AtmosphereServlet.doPost(AtmosphereServlet.java:176)
        at org.atmosphere.cpr.AtmosphereServlet.doGet(AtmosphereServlet.java:162)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:722)
    

    好吧,这就是我要做的。在Tomcat服务器上安装APR连接器。这将加快生产环境。下载并按照安装说明在操作系统上编译。您不再需要NIO连接器

    编辑您的server.xml:

    <Connector port="8080" 
                protocol="org.apache.coyote.http11.Http11AprProtocol" 
                URIEncoding="UTF-8" 
                maxThreads="250"
                redirectPort="8443" />  
    
    
    
    不要使用org.atmosphere.interceptor.atmosphereSourceLifecycleInterceptor这会给我造成错误

    你的HAProxy配置很好。您还应该使用atmosphere-runtime-native.jar而不是atmosphere-runtime.jar

    可能会出现错误,因为您使用不支持WebSocket的浏览器连接到使用WebSocket的应用程序

     2013-08-02 11:03:11,384 [http-nio-8080-exec-26] ERROR test.ReflectionService  - 
     Service method exception in publishDataCreatedCount in service  ClientNotificationUpdateService
     java.lang.NullPointerException
    at org.atmosphere.cpr.AtmosphereRequest.setAttribute(AtmosphereRequest.java:569)
    at org.atmosphere.cpr.DefaultBroadcaster.executeAsyncWrite(DefaultBroadcaster.java:922)
    at org.atmosphere.util.SimpleBroadcaster.queueWriteIO(SimpleBroadcaster.java:192)
    at org.atmosphere.cpr.DefaultBroadcaster.deliverPush(DefaultBroadcaster.java:768)
    at org.atmosphere.cpr.DefaultBroadcaster.push(DefaultBroadcaster.java:666)
    at org.atmosphere.util.SimpleBroadcaster.broadcast(SimpleBroadcaster.java:133)
    at test.ClientUpdateService.sendToBoard(ClientUpdateService.groovy:46)
    at test.ClientNotificationUpdateService.publishDataCreatedCount(ClientNotificationUpdateService.groovy:179)
    at test.ReflectionService.callByConvention(ReflectionService.groovy:59)
    at test.ClientUpdateService.methodMissing(ClientUpdateService.groovy:65)
    at test.NotificationService.create(NotificationService.groovy:206)
    at test.HomeController.addAction(HomeController.groovy:402)
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)
    
    2013-08-08 00:56:19,631 [http-nio-8080-exec-9] ERROR cpr.AtmosphereFramework  - AtmosphereFramework exception
    java.lang.IllegalStateException: Not supported.
        at org.atmosphere.cpr.AtmosphereRequest.startAsync(AtmosphereRequest.java:594)
        at org.atmosphere.container.Servlet30CometSupport.suspend(Servlet30CometSupport.java:130)
        at org.atmosphere.container.Servlet30CometSupport.service(Servlet30CometSupport.java:105)
        at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.doService(Tomcat7Servlet30SupportWithWebSocket.java:65)
        at org.atmosphere.container.TomcatWebSocketUtil.doService(TomcatWebSocketUtil.java:87)
        at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.service(Tomcat7Servlet30SupportWithWebSocket.java:61)
        at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1594)
        at org.atmosphere.cpr.AtmosphereServlet.doPost(AtmosphereServlet.java:176)
        at org.atmosphere.cpr.AtmosphereServlet.doGet(AtmosphereServlet.java:162)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:722)
    2013-08-08 00:56:19,670 [http-nio-8080-exec-2] ERROR cpr.AtmosphereFramework  - AtmosphereFramework exception
    java.lang.IllegalStateException: Not supported.
        at org.atmosphere.cpr.AtmosphereRequest.startAsync(AtmosphereRequest.java:594)
        at org.atmosphere.container.Servlet30CometSupport.suspend(Servlet30CometSupport.java:130)
        at org.atmosphere.container.Servlet30CometSupport.service(Servlet30CometSupport.java:105)
        at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.doService(Tomcat7Servlet30SupportWithWebSocket.java:65)
        at org.atmosphere.container.TomcatWebSocketUtil.doService(TomcatWebSocketUtil.java:87)
        at org.atmosphere.container.Tomcat7Servlet30SupportWithWebSocket.service(Tomcat7Servlet30SupportWithWebSocket.java:61)
        at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1594)
        at org.atmosphere.cpr.AtmosphereServlet.doPost(AtmosphereServlet.java:176)
        at org.atmosphere.cpr.AtmosphereServlet.doGet(AtmosphereServlet.java:162)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:722)
    
    <Connector port="8080" 
                protocol="org.apache.coyote.http11.Http11AprProtocol" 
                URIEncoding="UTF-8" 
                maxThreads="250"
                redirectPort="8443" />