From 4ccc11d8cfaca66e21f7c3fe16ec0580b0a5035d Mon Sep 17 00:00:00 2001 From: jinyu Date: Wed, 28 Jun 2017 19:15:31 +0800 Subject: [PATCH] listener --- .../example/server/Weixin4jServerStartup.java | 3 +- ...ava => Weixin4jServerStartupListener.java} | 52 ++++++++++--------- .../main/resources/spring-weixin4j-server.xml | 23 +------- .../src/main/webapp/WEB-INF/web.xml | 3 ++ .../startup/WeixinServerBootstrap.java | 19 +++++-- 5 files changed, 48 insertions(+), 52 deletions(-) rename weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/server/{Weixin4jServerStartupWithThread.java => Weixin4jServerStartupListener.java} (73%) diff --git a/weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/server/Weixin4jServerStartup.java b/weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/server/Weixin4jServerStartup.java index 3af42678..068caee1 100644 --- a/weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/server/Weixin4jServerStartup.java +++ b/weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/server/Weixin4jServerStartup.java @@ -36,9 +36,8 @@ public final class Weixin4jServerStartup { * assembly%E6%89%93%E5%8C%85 * * @param args - * @throws WeixinException */ - public static void main(String[] args) throws WeixinException { + public static void main(String[] args){ new WeixinServerBootstrap(new AesToken("wxa652fc930afe9b22", "weixin4j", "3XItJRSSkTqH7etjBUbLfLBecLdFfGjbGPfmIHuGftD")) // 指定开发者token信息。 .handlerPackagesToScan(handlerPackage) // 扫描处理消息的包。 .addHandler(DebugMessageHandler.global) // 当没有匹配到消息处理时输出调试信息,开发环境打开。 diff --git a/weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/server/Weixin4jServerStartupWithThread.java b/weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/server/Weixin4jServerStartupListener.java similarity index 73% rename from weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/server/Weixin4jServerStartupWithThread.java rename to weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/server/Weixin4jServerStartupListener.java index bd2b0c00..e8e11063 100644 --- a/weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/server/Weixin4jServerStartupWithThread.java +++ b/weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/server/Weixin4jServerStartupListener.java @@ -1,17 +1,16 @@ package com.foxinmy.weixin4j.example.server; -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.springframework.context.ApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; -import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.handler.DebugMessageHandler; import com.foxinmy.weixin4j.spring.SpringBeanFactory; import com.foxinmy.weixin4j.startup.WeixinServerBootstrap; import com.foxinmy.weixin4j.util.AesToken; -import io.netty.util.internal.logging.InternalLoggerFactory; - /** * 微信消息服务:需要另外开启一个线程去启动服务,这里值得注意的时:weixin4j-serve本身是作为一个单独的服务来启动的,可以不依赖Spring容器, * 但考虑到目前都是Spring mvc的架构,这里就需要使用一个独立的线程去启动服务,其实本身没有使用spring mvc的API, @@ -22,7 +21,7 @@ import io.netty.util.internal.logging.InternalLoggerFactory; * @date 2015年5月7日 * @since JDK 1.6 */ -public class Weixin4jServerStartupWithThread implements ApplicationContextAware { +public class Weixin4jServerStartupListener implements ServletContextListener { /** * 服务监听的端口号,目前微信只支持80端口,可以考虑用nginx做转发到此端口 */ @@ -39,30 +38,22 @@ public class Weixin4jServerStartupWithThread implements ApplicationContextAware * 处理微信消息的全限包名(也可通过addHandler方式一个一个添加) */ private final String handlerPackage; - /** - * 用spring去获取bean - */ - private ApplicationContext applicationContext; - private Weixin4jServerStartupWithThread(int port, AesToken aesToken, String handlerPackage) { - this.port = port; - this.aesToken = aesToken; - this.handlerPackage = handlerPackage; - } - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - this.applicationContext = applicationContext; + public Weixin4jServerStartupListener() { + // 可以考虑通过参数获取 + this.port = 30000; + this.aesToken = new AesToken("weixin4j"); + this.handlerPackage = "com.foxinmy.weixin4j.example.server.handler"; } private WeixinServerBootstrap bootstrap; /** - * 启动函数 + * 启动服务 * - * @throws WeixinException + * @param applicationContext */ - public void start() { + public void start(final ApplicationContext applicationContext) { new Thread(new Runnable() { @Override public void run() { @@ -76,7 +67,20 @@ public class Weixin4jServerStartupWithThread implements ApplicationContextAware }).start(); } + /** + * 关闭服务 + */ public void stop() { - bootstrap.shutdown(); + bootstrap.shutdown(true); + } + + @Override + public void contextInitialized(ServletContextEvent sce) { + start(WebApplicationContextUtils.getRequiredWebApplicationContext(sce.getServletContext())); + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + stop(); } } diff --git a/weixin4j-example/src/main/resources/spring-weixin4j-server.xml b/weixin4j-example/src/main/resources/spring-weixin4j-server.xml index 3133dd3e..30dbea47 100644 --- a/weixin4j-example/src/main/resources/spring-weixin4j-server.xml +++ b/weixin4j-example/src/main/resources/spring-weixin4j-server.xml @@ -11,28 +11,7 @@ weixin4j-serve本身是作为一个单独的服务来启动的,可以不依赖 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> - - - - - - - - - - - - - - - - - + diff --git a/weixin4j-example/src/main/webapp/WEB-INF/web.xml b/weixin4j-example/src/main/webapp/WEB-INF/web.xml index e5f287a8..dbcead78 100644 --- a/weixin4j-example/src/main/webapp/WEB-INF/web.xml +++ b/weixin4j-example/src/main/webapp/WEB-INF/web.xml @@ -42,4 +42,7 @@ org.springframework.web.util.IntrospectorCleanupListener + + com.foxinmy.weixin4j.example.server.Weixin4jServerStartupListener + \ No newline at end of file diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java index 15410e81..6e5bd75c 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java @@ -219,17 +219,28 @@ public final class WeixinServerBootstrap { } catch (InterruptedException e) { throw new RuntimeException(e); } finally { - shutdown(); + shutdown(false); } } - public boolean shutdown() { + /** + * 关闭微信服务 + * + * @param blocking + * 阻塞关闭 + * @return + */ + public boolean shutdown(boolean blocking) { if (bootstrap == null) { return false; } ServerBootstrapConfig c = bootstrap.config(); - c.group().shutdownGracefully(); - c.childGroup().shutdownGracefully(); + Future bossF = c.group().shutdownGracefully(); + Future workerF = c.childGroup().shutdownGracefully(); + if (blocking) { + bossF.awaitUninterruptibly(); + workerF.awaitUninterruptibly(); + } messageHandlerList = null; messageInterceptorList = null; messageDispatcher = null;