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;