diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/listener/AbstractWeixinServerStartupListener.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/listener/AbstractWeixinServerStartupListener.java new file mode 100644 index 00000000..ed9b6c85 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/listener/AbstractWeixinServerStartupListener.java @@ -0,0 +1,122 @@ +package com.foxinmy.weixin4j.listener; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import com.foxinmy.weixin4j.dispatcher.BeanFactory; +import com.foxinmy.weixin4j.handler.DebugMessageHandler; +import com.foxinmy.weixin4j.startup.WeixinServerBootstrap; +import com.foxinmy.weixin4j.util.AesToken; + +/** + * 监听器方式新线程启动微信服务(适用于与web集成 + * + * @className AbstractWeixinServerStartupListener + * @author jinyu + * @date Jun 28, 2017 + * @since JDK 1.6 + * @see + */ +public abstract class AbstractWeixinServerStartupListener implements ServletContextListener { + /** + * 服务监听端口,目前微信只支持80端口,可以考虑用nginx做转发到此端口 + * + * @return + */ + protected int getPort() { + return 30000; + } + + /** + * 明文模式:String aesToken = ""; 密文模式:AesToken aesToken = new + * AesToken("公众号appid", "公众号token","公众号加密/解密消息的密钥"); + */ + protected AesToken getToken() { + return new AesToken("weixin4j"); + } + + /** + * 处理微信消息的全限包名(也可通过addHandler方式一个一个添加) + */ + abstract String[] getHandlerToScan(); + + /** + * 拦截微信消息的全限包名(也可通过addInterceptor方式一个一个添加) + * + * @return + */ + public String[] getInterceptorToScan() { + return null; + } + + /** + * bean容器 + * + * @param sc + * servlet上下文 + * @return + */ + abstract BeanFactory getBeanFactory(ServletContext sc); + + /** + * 当没有匹配到消息处理时输出空白回复(公众号不会出现「该公众号无法提供服务的提示」) + * + * @return + */ + protected boolean getOpenAlwaysResponse() { + return true; + } + + /** + * 打开调试回复 + * + * @return + */ + protected boolean getOpenDebugResponse() { + return true; + } + + /** + * 服务启动 + */ + private WeixinServerBootstrap bootstrap; + + @Override + public void contextInitialized(ServletContextEvent sce) { + final int port = getPort(); + final AesToken aesToken = getToken(); + final String[] handlerPackage = getHandlerToScan(); + final String[] interceptorPackage = getInterceptorToScan(); + final BeanFactory beanFactory = getBeanFactory(sce.getServletContext()); + final boolean openAlwaysResponse = getOpenAlwaysResponse(); + final boolean openDebugResponse = getOpenDebugResponse(); + /** + * 线程启动服务 + */ + new Thread(new Runnable() { + @Override + public void run() { + bootstrap = new WeixinServerBootstrap(aesToken) // 指定开发者token信息 + .handlerPackagesToScan(handlerPackage); // 扫描处理消息的包 + if (interceptorPackage != null) // 扫描拦截消息的包 + bootstrap.interceptorPackagesToScan(interceptorPackage); + if (beanFactory != null) + bootstrap.resolveBeanFactory(beanFactory); // 声明处理消息类由Bean容器去实例化 + if (openDebugResponse) + bootstrap.addHandler(DebugMessageHandler.global); // 当没有匹配到消息处理时输出调试信息,开发环境打开 + if (openAlwaysResponse) + bootstrap.openAlwaysResponse(); // 是否总是返回响应,正式环境打开 + bootstrap.startup(port); // 绑定服务的端口号,即对外暴露(微信服务器URL地址)的服务端口 + } + }).start(); + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + /** + * 关闭服务 + */ + bootstrap.shutdown(true); + } +}