2013-10-25 11 views
3

У меня есть сервлет, который называется MyServlet. Этот сервлет связан в моем файле web.xml. Этот сервлет выполняет итерацию по моим службам Grails и следит за тем, чтобы службы заканчивались ListenerService. Если это так, он инициализирует новый сервлет для этой службы.Сервлет инициализируется более одного раза?

У меня есть следующие услуги: Listener

ChatListenerService 
NotificationListenerService 
ThirdListenerService 

Это означает, что я должен получить три сервлетов, сгенерированные MyServlet. Когда вы смотрите на вывод, вы видите, что первый сервлет генерируется три раза, второй генерируется дважды, а третий - один раз.

Вот выход я получаю:

2013-10-25 13:05:50,460 [localhost-startStop-1] INFO cpr.AtmosphereServlet - AtmosphereServlet with native support for Tomcat 6/7 and JBossWeb Installed. 
>>>>>>>>>>>>>>> been: [email protected] 
2013-10-25 13:05:50,577 [localhost-startStop-1] INFO handler.ReflectorServletProcessor - Installing Servlet test.ChatListenerService 
2013-10-25 13:05:50,577 [localhost-startStop-1] INFO test.MyServlet - registered chatListener as handler for /atmosphere/chat/* 
>>>>>>>>>>>>>>> been: [email protected] 
2013-10-25 13:05:50,582 [localhost-startStop-1] INFO handler.ReflectorServletProcessor - Installing Servlet test.NotificationListenerService 
2013-10-25 13:05:50,582 [localhost-startStop-1] INFO handler.ReflectorServletProcessor - Installing Servlet test.ChatListenerService 
2013-10-25 13:05:50,582 [localhost-startStop-1] INFO test.MyServlet - registered notificationListener as handler for /atmosphere/notification/* 
>>>>>>>>>>>>>>> been: [email protected] 
2013-10-25 13:05:50,587 [localhost-startStop-1] INFO handler.ReflectorServletProcessor - Installing Servlet test.NotificationListenerService 
2013-10-25 13:05:50,587 [localhost-startStop-1] INFO handler.ReflectorServletProcessor - Installing Servlet test.ChatListenerService 
2013-10-25 13:05:50,587 [localhost-startStop-1] INFO handler.ReflectorServletProcessor - Installing Servlet test.ThirdListenerService 
2013-10-25 13:05:50,587 [localhost-startStop-1] INFO test.MyServlet - registered pedigreeListener as handler for /atmosphere/third/* 
2013-10-25 13:05:50,587 [localhost-startStop-1] INFO test.MyServlet - Initialized MyServlet 

Что пошло не так? Поскольку я перебираю каждую Сервис только один раз, я не вижу, почему услуги генерируются более одного раза. Что мне нужно исправить?

мой web.xml:

<servlet> 
    <description>MyServlet</description> 
    <servlet-name>MyServlet</servlet-name> 
    <servlet-class>test.MyServlet</servlet-class> 
    <load-on-startup>0</load-on-startup> 

    <!-- If you want to use Servlet 3.0 --> 
    <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.AtmosphereResourceLifecycleInterceptor,org.atmosphere.interceptor.HeartbeatInterceptor,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.useWebSocketAndServlet3</param-name> 
      <param-value>true</param-value> 
    </init-param> 

    <init-param> 
     <param-name>org.atmosphere.cpr.Broadcaster.writeTimeout</param-name> 
     <param-value>30000</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> 
</servlet> 
<servlet-mapping> 
    <servlet-name>MyServlet</servlet-name> 
    <url-pattern>/atmosphere/*</url-pattern> 
</servlet-mapping> 

мой MyService класс:

class MyServlet extends MeteorServlet { 

    @Override 
    void init(ServletConfig sc) throws ServletException { 
     super.init(sc) 

     def webApplicationContext = WebApplicationContextUtils.getWebApplicationContext sc.servletContext 

     def grailsApplication = webApplicationContext.getBean("grailsApplication") 

     def services = grailsApplication.getArtefacts "Service" 

     def suffix = "Listener" 

     services.each { serviceClass -> 
      def serviceName = serviceClass.logicalPropertyName 
      if(serviceName.endsWith(suffix)) { 
       def prefix = serviceName - suffix 

       def bean = webApplicationContext.getBean(serviceClass.clazz) 

       def servlet = serviceClass.clazz 

       String servletClass = bean.class.getName() 
       ReflectorServletProcessor rsp = new ReflectorServletProcessor(bean) 
       rsp.setServletClassName(servletClass) 

       framework.addAtmosphereHandler("/atmosphere/${prefix}/*", rsp).initAtmosphereHandler(sc)   

       log.info "registered $serviceName as handler for /atmosphere/${prefix}/*" 
      } 
     } 

     log.info "Initialized MyServlet" 

    } 

Мой ChatListenerService (другой выглядеть примерно):

class ChatListenerService extends HttpServlet { 


    static transactional = false 

     @Override 
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 
      Meteor meteor = Meteor.build(request) 
      ... 
     } 

    @Override 
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { 
      Meteor meteor = Meteor.build(request) 
      ... 
     } 
... 
} 

ответ

1

Вы звоните initAtmosphereHandler каждый время

framework.addAtmosphereHandler("/atmosphere/${prefix}/*", rsp).initAtmosphereHandler(sc)   

Метод addAtmosphereHandler() просто регистрирует службы. Вызов initAtmosphereHandler фактически создает их. Джавадок просто говорит

Инициализировать AtmosphereServletProcessor.

Итак, первая итерация цикла, у вас есть один зарегистрированный сервис. На второй итерации у вас есть две зарегистрированные службы. На третьей итерации у вас есть три зарегистрированных сервиса. На каждой итерации все службы создаются.

Избавьтесь от вызова initAtmosphereHandler и сделайте это за пределами цикла each.

+0

Отличный ответ спасибо! –

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