MyServlet という名前のサーブレットがあります。このサーブレットは、私の web.xml ファイルにバインドされています。このサーブレットは私の Grails サービスを繰り返し処理し、ListenerService で終わるサービスを監視します。その場合、このサービスの新しいサーブレットを初期化します。
次のリスナー サービスがあります。
ChatListenerService
NotificationListenerService
ThirdListenerService
これは、MyServlet によって生成された 3 つのサーブレットを取得する必要があることを意味します。出力を見ると、最初のサーブレットが 3 回生成され、2 番目が 2 回、3 番目のサービスが 1 回生成されていることがわかります。
これが私が得る出力です:
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: test.ChatListenerService@41028653
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: test.NotificationListenerService@70b005e0
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: test.ThirdListenerService@4cba9be9
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
ここで何がうまくいかなかったのですか?各サービスを 1 回だけ反復するため、サービスが複数回生成される理由はわかりません。何を修正する必要がありますか?
私の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)
...
}
...
}