2014-01-20 2 views
1

Я недавно начал работу с атмосферы. Мне нужно его реализовать в приложении Spring MVC.Весна MVC с атмосферой

До сих пор мне удалось интегрировать его с Spring MVC.

Мне просто нужно выполнить очень простую задачу. У меня есть счетчик переменной экземпляра, как только он достигает 10, ответ должен быть передан в пользовательский интерфейс.

Может ли кто-нибудь мне помочь, как написать код для этого в контроллере.

У меня есть ресурс Atmosphere в контроллере.

AtmosphereArgumentResolver.java

public class AtmosphereArgumentResolver implements HandlerMethodArgumentResolver { 

    //@Override 
    public boolean supportsParameter(MethodParameter parameter) { 
     return AtmosphereResource.class.isAssignableFrom(parameter.getParameterType()); 
    } 

    //@Override 
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception 
    { 
     HttpServletRequest httpServletRequest= webRequest.getNativeRequest(HttpServletRequest.class); 
     return Meteor.build(httpServletRequest).getAtmosphereResource(); 
    } 
} 

HomeController.java

@Controller 
    public class HomeController { 

     private int counter = 0; 

     private final BroadcasterFactory bf; 


    public BroadcasterFactory broadcasterFactory() 
    { 
     return BroadcasterFactory.getDefault(); 
    } 

     for(int i=0; i<=15; i++) 
    { 
     counter ++; 
    } 

    // As soon as the counter reaches 10 I need to send a broadcast message to the UI. 



} 

Может кто-нибудь, пожалуйста, помогите? Скелетный код также поможет в том, как использовать метод Atmosphere для этого?

ответ

0

Я скопирует/мимо кода я использую в моем приложении:

Контроллер:

@ManagedService(path = "/websocket/*") 
@Singleton 
public class LanesWebSocket { 

    private final Logger logger = LoggerFactory.getLogger(LanesWebSocket.class); 

// private ScheduledExecutorService scheduledExecutorService; 

    private Future<?> scheduleFixedBroadcast; 

    private final ObjectMapper mapper = new ObjectMapper(); 

    private SupervisionCenterService supervisionCenterService; 


    @Ready 
    public void onReady(final AtmosphereResource resource) { 

     if (this.supervisionCenterService == null) 
      supervisionCenterService = SpringApplicationContext.getBean(SupervisionCenterService.class); 

     Broadcaster bc = BroadcasterFactory.getDefault().lookup("lanes",true); 

     bc.addAtmosphereResource(resource); 

      scheduleFixedBroadcast = bc.scheduleFixedBroadcast(new Callable<String>() { 

       @Override 
       public String call() throws Exception { 
        try { 
         return mapper.writeValueAsString(supervisionCenterService.findCenterData()); 
        } catch (Exception e) { 
         scheduleFixedBroadcast.cancel(true); 
         e.printStackTrace(); 
         return null; 
        } 
       } 
      }, 1, TimeUnit.SECONDS); 

    } 

И вы также должны зарегистрировать атмосферу сервлет:

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

[...] 

    @Override 
     protected void registerDispatcherServlet(ServletContext servletContext) { 
      super.registerDispatcherServlet(servletContext); 
      initAtmosphereServlet(servletContext); 
     } 

     private void initAtmosphereServlet(ServletContext servletContext) { 
      AtmosphereServlet servlet = new AtmosphereServlet(); 
      Field frameworkField = ReflectionUtils.findField(AtmosphereServlet.class, "framework"); 
      ReflectionUtils.makeAccessible(frameworkField); 
      ReflectionUtils.setField(frameworkField, servlet, new NoAnalyticsAtmosphereFramework()); 
      ServletRegistration.Dynamic atmosphereServlet = 
        servletContext.addServlet("atmosphereServlet", servlet); 

      atmosphereServlet.setInitParameter("org.atmosphere.cpr.packages", "com.myclient.theproduct.supervision.websocket"); 
      atmosphereServlet.setInitParameter("org.atmosphere.cpr.broadcasterCacheClass", UUIDBroadcasterCache.class.getName()); 
      atmosphereServlet.setInitParameter("org.atmosphere.cpr.broadcaster.shareableThreadPool", "true"); 
      atmosphereServlet.setInitParameter("org.atmosphere.cpr.broadcaster.maxProcessingThreads", "10"); 
      atmosphereServlet.setInitParameter("org.atmosphere.cpr.broadcaster.maxAsyncWriteThreads", "10"); 
      servletContext.addListener(new org.atmosphere.cpr.SessionSupport()); 

      atmosphereServlet.addMapping("/websocket/*"); 
      atmosphereServlet.setLoadOnStartup(3); 
      atmosphereServlet.setAsyncSupported(true); 
     } 

    public class NoAnalyticsAtmosphereFramework extends AtmosphereFramework { 

     public NoAnalyticsAtmosphereFramework() { 
      super(); 
     } 

     @Override 
     protected void analytics() { 
      // nothing 
     } 
    } 
} 

Не спросите меня о причине класса NoAnalyticsAtmosphereFramework, он не сможет работать.

Надеюсь, это вам поможет!

+0

Когда клиент подключается к сервлете websocket, мой контроллер отправляет данные каждую секунду через задание – stephane06

Смежные вопросы