package com.java110.core.event.init; import com.java110.utils.factory.ApplicationContextFactory; import com.java110.core.event.app.AppEvent; import com.java110.core.event.app.AppEventPublishing; import com.java110.core.event.app.AppListener; import com.java110.core.event.listener.common.CommonDispatchListener; import org.apache.commons.lang3.StringUtils; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationContext; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.support.PropertiesLoaderUtils; import javax.naming.ConfigurationException; import java.util.Properties; /** * 系统启动时加载信息 * Created by wuxw on 2017/4/14. */ public class SystemStartUpInit /*implements ApplicationListener*/ { /** * 默认 事件配置路径classpath:/ */ private final String DEFAULT_EVENT_PATH = "config/"; /** * 默认 文件名称 .properties */ private final String DEFAULT_FILE_NAME = "event.properties"; /** * 订单调度处理侦听 */ private final static String DISPATCH_LISTER = "java110.event.properties.orderDispatchListener"; /** * 订单调度事件 */ private final static String DISPATCH_EVENT = "java110.event.properties.orderDispatchEvent"; /** * 服务 */ private final static String LISTENER_SERVICE = "java110.event.properties.listener.service"; /** * 加载配置文件,将侦听初始化 * @param event */ // @Override public void onApplicationEvent(ApplicationReadyEvent event){ //加载配置文件,注册订单处理侦听 try { ApplicationContextFactory.setApplicationContext(event.getApplicationContext()); Properties properties = this.load(DEFAULT_EVENT_PATH,DEFAULT_FILE_NAME); registerListener(properties); //注册事件 registerEvent(properties); //注册服务 registerService(properties); } catch (Exception ex) { throw new IllegalStateException("system init error", ex); } } public void initSystemConfig(ApplicationContext context){ //加载配置文件,注册订单处理侦听 try { ApplicationContextFactory.setApplicationContext(context); Properties properties = this.load(DEFAULT_EVENT_PATH,DEFAULT_FILE_NAME); registerListener(properties); //注册事件 registerEvent(properties); //注册服务 registerService(properties); } catch (Exception ex) { throw new IllegalStateException("system init error", ex); } } /** * 加载文件 * @param location * @param filename * @param */ private Properties load(String location,String filename) throws Exception{ Properties properties = PropertiesLoaderUtils.loadProperties(new ClassPathResource(location+filename)); return properties; } /** * 注册侦听 * @param properties */ private void registerListener(Properties properties) throws Exception{ String[] listeners = properties.getProperty(DISPATCH_LISTER).split("\\,"); for(String listener : listeners){ //这里不能直接反射,这样 IXXXService 无法注入,所以直接从spring 中获取已经注入的 //AppListener appListener = (AppListener)Class.forName(listener).newInstance(); AppListener appListener = (AppListener) ApplicationContextFactory.getBean(listener); //将 listener 放入 AppEventPublishing 中方便后期操作 //注册侦听 AppEventPublishing.addListenner(appListener); } } /** * 注册事件 * @param properties * @throws Exception */ private void registerEvent(Properties properties) throws Exception{ String[] events = properties.getProperty(DISPATCH_EVENT).split("\\,"); for (String event : events){ if(StringUtils.isBlank(event) || !event.contains("::")){ throw new ConfigurationException("配置错误,["+DISPATCH_EVENT+"= "+events+"] 当前 [event = "+event+"],不存在 :: ,配置格式为 A::B"); } String[] tmpEvent = event.split("::"); if(tmpEvent.length > 2){ throw new ConfigurationException("配置错误,["+DISPATCH_EVENT+"= "+events+"] 当前 [event = "+event+"],只能有一个 :: ,配置格式为 A::B"); } Class clazz = (Class) Class.forName(tmpEvent[1]); AppEventPublishing.addEvent(tmpEvent[0],clazz); } } /** * 注册服务 * @param properties * @throws Exception */ private void registerService(Properties properties) throws Exception{ String[] services = properties.getProperty(LISTENER_SERVICE).split("\\,"); for(String service : services){ if(StringUtils.isBlank(service) || !service.contains("::")){ throw new ConfigurationException("配置错误,["+LISTENER_SERVICE+"= "+services+"] 当前 [event = "+service+"],不存在 :: ,配置格式为 A::B"); } String[] tmpService = service.split("::"); if(tmpService.length > 2){ throw new ConfigurationException("配置错误,["+LISTENER_SERVICE+"= "+services+"] 当前 [event = "+service+"],只能有一个 :: ,配置格式为 A::B"); } CommonDispatchListener.addService(tmpService[0],tmpService[1]); } } }