2017-07-26 43 views
0

我有一个春季启动应用到我设法整合大气聊天应用程序作为证据的概念,要看到,豆类和CONFIGS是实际工作。Java的大气框架 - 客户端的onMessage从来没有所谓的

奇怪的是,如果我用@ManagedService设置类注释有点不同,我不能获得Javascript request.onMessage函数触发。

我试过用类似@Resume,@Suspend等不同的Atmosphere Services注解类的方法,但客户端的onMessage函数从未被解雇。 (空浏览器控制台)

这是我的bean配置文件AtmosphereConfig.java

package my.poc.com; 

import java.util.Collections;  
import javax.servlet.ServletContext; 
import javax.servlet.ServletException;  
import org.atmosphere.cpr.AtmosphereServlet; 
import org.atmosphere.cpr.ContainerInitializer; 
import org.springframework.boot.web.servlet.ServletContextInitializer; 
import org.springframework.boot.web.servlet.ServletRegistrationBean; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.core.Ordered; 
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 

@Configuration 
public class AtmosphereConfig { 
    @Bean 
    public EmbeddedAtmosphereInitializer atmosphereInitializer() { 
     return new EmbeddedAtmosphereInitializer(); 
    } 

    @Bean 
    public ServletRegistrationBean atmosphereServlet() { 
     ServletRegistrationBean registration = new ServletRegistrationBean(
       new AtmosphereServlet(), "/atmurl/*"); 

     registration.addInitParameter("org.atmosphere.interceptor.HeartbeatInterceptor" 
       + ".clientHeartbeatFrequencyInSeconds", "10"); 

     registration.setLoadOnStartup(0); 
     // Need to occur before the EmbeddedAtmosphereInitializer 
     registration.setOrder(Ordered.HIGHEST_PRECEDENCE); 
     return registration; 
    } 

    @Configuration 
    static class MvcConfiguration extends WebMvcConfigurerAdapter { 
     @Override 
     public void addViewControllers(ViewControllerRegistry registry) { 
      registry.addViewController("/poc.html"); 
     } 
    } 

    private static class EmbeddedAtmosphereInitializer extends ContainerInitializer 
      implements ServletContextInitializer { 
     @Override 
     public void onStartup(ServletContext servletContext) throws ServletException { 
      onStartup(Collections.<Class<?>> emptySet(), servletContext); 
     } 

    } 
} 

这是我@ManagedService类:

package my.poc.com 

import org.atmosphere.config.service.Get; 
import org.atmosphere.config.service.ManagedService; 
import org.atmosphere.cpr.AtmosphereResource; 
import org.atmosphere.cpr.AtmosphereResourceEvent; 
import org.atmosphere.cpr.AtmosphereResourceEventListenerAdapter; 

@ManagedService(path = "/atmurl") 
public class AtmosphereService2 { 

    @Get 
    public void myGetImpl(final AtmosphereResource resource) { 
     System.out.println("@Get method called by: " + resource.uuid()); 
     AtmosphereResource currentRes = resource; 
     System.out.println(currentRes); 
     resource.addEventListener(new AtmosphereResourceEventListenerAdapter() { 
      @Override 
      public void onSuspend(final AtmosphereResourceEvent event) { 
       System.out.println("resource suspended: " + event.getResource()); 
      } 
      @Override 
      public void onResume(final AtmosphereResourceEvent event) { 
       System.out.println("resource resumed: " + event.getResource()); 
      } 
      @Override 
      public void onDisconnect(final AtmosphereResourceEvent event) { 
       if (event.isCancelled()) { 
        System.out.println("resource onDisconnect cancelled: " + event.getResource().uuid()); 
       } else if (event.isClosedByClient()) { 
        System.out.println("resource onDisconnect closedByClient: " + event.getResource().uuid()); 
       } 
      } 
     }); 
    } 
} 

这是我poc.html

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Poc</title> 
<script type="text/javascript" src="js/atmosphere/jquery-2.0.3.js"></script> 
<script type="text/javascript" src="js/atmosphere/atmosphere.js"></script> 
<script type="text/javascript" src="js/atmosphere/myAtmosphereApp.js"></script> 
</head> 
<body> 
</body> 
</html> 

而且最后我的myAtmosphereApp.js

$(function() { 
    "use strict"; 
    console.log("application_2.js start"); 

    var socket = atmosphere; 
    var subSocket; 
    // Websocket does not work with AJP. 
    if (window.EventSource) { 
     var transport = 'sse'; 

    } else { 
     var transport = 'long-polling'; 
    } 

    var request = { 
     url : document.location.protocol + "//" + document.location.host + '/atmurl', 
     contentType : "application/json", 
     logLevel : 'debug', 
     transport : transport, 
     trackMessageLength : true, 
     enableProtocol : false, 
     fallbackTransport : 'long-polling' 
    }; 

    request.onOpen = function(response) { 
     console.log("request.onOpen called"); 
    } 

    request.onMessage = function(response) { 
     console.log("request.onMessage called"); 
    } 

    request.onClose = function(response) { 
     console.log("request.onClose called"); 
    } 

    subSocket = socket.subscribe(request); 
}); 

回答

0

调查该问题进一步后,我发现,为了扳机的后端代码执行,一个必须调用的前端JavaScript方法subSocket.push(xxx)预先在客户侧。

我结束了在myAtmosphereApp.js将在客户端验证码:

function triggerBackend() { 
    subSocket.push(someDataCollectedInFrontend); 
} 
setInterval(triggerBackend, 1000); 

该客户端代码将触发onResume每秒一次。

相关问题