diff --git a/mpush-tools/src/main/java/com/shinemo/mpush/tools/spi/ServiceContainer.java b/mpush-tools/src/main/java/com/shinemo/mpush/tools/spi/ServiceContainer.java index 6210b2a4..1b4a267d 100644 --- a/mpush-tools/src/main/java/com/shinemo/mpush/tools/spi/ServiceContainer.java +++ b/mpush-tools/src/main/java/com/shinemo/mpush/tools/spi/ServiceContainer.java @@ -3,13 +3,17 @@ import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Enumeration; +import java.util.Iterator; +import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.concurrent.ConcurrentMap; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; public class ServiceContainer { @@ -36,23 +40,74 @@ public static T getInstance(Class clazz) { SPI spi = clazz.getAnnotation(SPI.class); String instanceName = spi.value(); - - if(StringUtils.isBlank(instanceName)){ + + if (StringUtils.isBlank(instanceName)) { instanceName = toLowerCaseFirstOne(clazz.getName()); } - + return getInstance(clazz, instanceName); } @SuppressWarnings("unchecked") - public static T getInstance(Class clazz, String key) { + public static List getInstances(Class clazz){ ConcurrentMap objMap = objectsCachedMap.get(clazz); if (objMap == null) { objMap = Maps.newConcurrentMap(); objectsCachedMap.put(clazz, objMap); } objMap = objectsCachedMap.get(clazz); + if(!objMap.isEmpty()){ + return Lists.newArrayList((List)objMap.values()); + } + + Map> clazzMap = getClazzMap(clazz); + if (clazzMap == null) { + log.warn("[ getInstance ] getInstances is null:" + clazz); + throw new IllegalStateException("Failed getInstance class(interface: " + clazz); + } + if (!clazzMap.isEmpty()) { //防止一个实例对象被初始化多次 + synchronized (clazz) { + try { + + if(!objMap.isEmpty()){ + return Lists.newArrayList((List)objMap.values()); + } + + Iterator>> iter = clazzMap.entrySet().iterator(); + while (iter.hasNext()) { + Entry> entry = iter.next(); + String key = entry.getKey(); + Class val = entry.getValue(); + + Object newObj = val.newInstance(); + objMap.putIfAbsent(key, newObj); + } + + return Lists.newArrayList((List)objMap.values()); + } catch (Exception e) { + log.warn("[ getInstance ] error:" + clazz, e); + } + } + } + + throw new IllegalStateException("Failed getInstance class(interface: " + clazz); + + } + + @SuppressWarnings("unchecked") + public static T getInstance(Class clazz, String key) { + ConcurrentMap objMap = objectsCachedMap.get(clazz); + if (objMap == null) { + objMap = Maps.newConcurrentMap(); + synchronized (clazz) { + objMap = objectsCachedMap.get(clazz); + if(objMap==null){ + objectsCachedMap.put(clazz, objMap); + } + } + } + objMap = objectsCachedMap.get(clazz); T obj = (T) objMap.get(key); @@ -60,28 +115,40 @@ public static T getInstance(Class clazz, String key) { return obj; } - Map> clazzMap = clazzCacheMap.get(clazz); - if (clazzMap == null) { - loadFile(clazz); - } - clazzMap = clazzCacheMap.get(clazz); + Map> clazzMap = getClazzMap(clazz); if (clazzMap == null) { log.warn("[ getInstance ] clazzMap is null:" + clazz + "," + key); - throw new IllegalStateException("Failed getInstance class(interface: " + clazz + ", key: " + key + ")"); + throw new IllegalStateException("Failed getInstance class(interface: " + clazz + ", key: " + key + ")"); } Class realClazz = clazzMap.get(key); - if (realClazz != null) { - try { - Object newObj = realClazz.newInstance(); - Object preObj = objMap.putIfAbsent(key, newObj); - return null == preObj ? (T) newObj : (T) preObj; - } catch (Exception e) { - log.warn("[ getInstance ] error:" + clazz + "," + key, e); + if (realClazz != null) { // 防止一个实例对象被初始化多次 + synchronized (realClazz) { + try { + obj = (T) objMap.get(key); + if (obj != null) { + return obj;// 已经初始化完毕 + } + + Object newObj = realClazz.newInstance(); + Object preObj = objMap.putIfAbsent(key, newObj); + return null == preObj ? (T) newObj : (T) preObj; + } catch (Exception e) { + log.warn("[ getInstance ] error:" + clazz + "," + key, e); + } } } - - throw new IllegalStateException("Failed getInstance class(interface: " + clazz + ", key: " + key + ")"); + throw new IllegalStateException("Failed getInstance class(interface: " + clazz + ", key: " + key + ")"); + + } + + private static Map> getClazzMap(Class clazz) { + Map> clazzMap = clazzCacheMap.get(clazz); + if (clazzMap == null) { + loadFile(clazz); + } + clazzMap = clazzCacheMap.get(clazz); + return clazzMap; } private static void loadFile(Class type) { @@ -140,13 +207,12 @@ private static void loadFile(Class type) { } clazzCacheMap.put(type, map); } - - public static String toLowerCaseFirstOne(String s) - { - if(Character.isLowerCase(s.charAt(0))) - return s; - else - return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString(); - } + + public static String toLowerCaseFirstOne(String s) { + if (Character.isLowerCase(s.charAt(0))) + return s; + else + return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString(); + } } diff --git a/mpush-tools/src/main/java/com/shinemo/mpush/tools/spi/test/TestService.java b/mpush-tools/src/main/java/com/shinemo/mpush/tools/spi/test/TestService.java new file mode 100644 index 00000000..f5b753a8 --- /dev/null +++ b/mpush-tools/src/main/java/com/shinemo/mpush/tools/spi/test/TestService.java @@ -0,0 +1,11 @@ +package com.shinemo.mpush.tools.spi.test; + +import com.shinemo.mpush.tools.spi.SPI; + + +@SPI("test1") +public interface TestService { + + public String sayHi(String name); + +} diff --git a/mpush-tools/src/main/java/com/shinemo/mpush/tools/spi/test/TestServiceImpl.java b/mpush-tools/src/main/java/com/shinemo/mpush/tools/spi/test/TestServiceImpl.java new file mode 100644 index 00000000..f69aa6bb --- /dev/null +++ b/mpush-tools/src/main/java/com/shinemo/mpush/tools/spi/test/TestServiceImpl.java @@ -0,0 +1,19 @@ +package com.shinemo.mpush.tools.spi.test; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TestServiceImpl implements TestService { + + private static final Logger log = LoggerFactory.getLogger(TestServiceImpl.class); + + public TestServiceImpl() { + log.warn("init"); + } + + @Override + public String sayHi(String name) { + return "TestServiceImpl1 hi,"+name; + } + +} diff --git a/mpush-tools/src/main/java/com/shinemo/mpush/tools/spi/test/TestServiceImpl2.java b/mpush-tools/src/main/java/com/shinemo/mpush/tools/spi/test/TestServiceImpl2.java new file mode 100644 index 00000000..dc8be260 --- /dev/null +++ b/mpush-tools/src/main/java/com/shinemo/mpush/tools/spi/test/TestServiceImpl2.java @@ -0,0 +1,20 @@ +package com.shinemo.mpush.tools.spi.test; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class TestServiceImpl2 implements TestService { + + private static final Logger log = LoggerFactory.getLogger(TestServiceImpl.class); + + public TestServiceImpl2() { + log.warn("init"); + } + + @Override + public String sayHi(String name) { + return "TestServiceImpl2 hi,"+name; + } + +} diff --git a/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/KickConnection.java b/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/KickConnection.java deleted file mode 100644 index 1d89324c..00000000 --- a/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/KickConnection.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.shinemo.mpush.tools.zk; - -public class KickConnection { - -} diff --git a/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/ZkRegister.java b/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/ZkRegister.java new file mode 100644 index 00000000..ebabfb53 --- /dev/null +++ b/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/ZkRegister.java @@ -0,0 +1,37 @@ +package com.shinemo.mpush.tools.zk; + +import java.util.List; + +import org.apache.curator.framework.CuratorFramework; + +import com.shinemo.mpush.tools.spi.SPI; + + +@SPI("zkRegister") +public interface ZkRegister { + + public void init(); + + public void close(); + + public void remove(String key); + + public void registerEphemeralSequential(String key); + + public void registerEphemeralSequential(String key, String value); + + public void registerEphemeral(String key, String value); + + public void update(String key, String value); + + public void registerPersist(String key, String value); + + public boolean isExisted(String key); + + public List getChildrenKeys(String key); + + public String get(String key); + + public CuratorFramework getClient(); + +} diff --git a/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/curator/services/ZkRegisterManager.java b/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/curator/services/ZkRegisterManager.java new file mode 100644 index 00000000..e01800a2 --- /dev/null +++ b/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/curator/services/ZkRegisterManager.java @@ -0,0 +1,285 @@ +package com.shinemo.mpush.tools.zk.curator.services; + +import java.nio.charset.Charset; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.framework.CuratorFrameworkFactory; +import org.apache.curator.framework.CuratorFrameworkFactory.Builder; +import org.apache.curator.framework.api.ACLProvider; +import org.apache.curator.framework.recipes.cache.ChildData; +import org.apache.curator.framework.recipes.cache.TreeCache; +import org.apache.curator.retry.ExponentialBackoffRetry; +import org.apache.curator.utils.CloseableUtils; +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.ZooDefs; +import org.apache.zookeeper.data.ACL; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.shinemo.mpush.tools.ConfigCenter; +import com.shinemo.mpush.tools.zk.ZkConfig; +import com.shinemo.mpush.tools.zk.ZkRegister; +import com.shinemo.mpush.tools.zk.ZkUtil; + +public class ZkRegisterManager implements ZkRegister { + + private static final Logger LOGGER = LoggerFactory.getLogger(ZkUtil.class); + + private ZkConfig zkConfig; + + private CuratorFramework client; + private TreeCache cache; + + public ZkConfig getZkConfig() { + return zkConfig; + } + + @Override + public CuratorFramework getClient() { + return client; + } + + /** + * 初始化 + */ + @Override + public void init() { + zkConfig = new ZkConfig(ConfigCenter.INSTANCE.getZkServer(), ConfigCenter.INSTANCE.getZkNamespace()); + LOGGER.warn("start registry zk, server lists is: {}.", zkConfig.getIpLists()); + Builder builder = CuratorFrameworkFactory.builder().connectString(zkConfig.getIpLists()) + .retryPolicy(new ExponentialBackoffRetry(zkConfig.getMinTime(), zkConfig.getMaxRetry(), zkConfig.getMaxTime())).namespace(zkConfig.getNamespace()); + if (zkConfig.getConnectionTimeout() > 0) { + builder.connectionTimeoutMs(zkConfig.getConnectionTimeout()); + } + if (zkConfig.getSessionTimeout() > 0) { + builder.sessionTimeoutMs(zkConfig.getSessionTimeout()); + } + if (StringUtils.isNoneBlank(zkConfig.getDigest())) { + builder.authorization("digest", zkConfig.getDigest().getBytes(Charset.forName("UTF-8"))).aclProvider(new ACLProvider() { + + @Override + public List getDefaultAcl() { + return ZooDefs.Ids.CREATOR_ALL_ACL; + } + + @Override + public List getAclForPath(final String path) { + return ZooDefs.Ids.CREATOR_ALL_ACL; + } + }); + } + client = builder.build(); + client.start(); + try { + client.blockUntilConnected(); + cacheData(); + } catch (final Exception ex) { + LOGGER.error("zk connection error" + ToStringBuilder.reflectionToString(zkConfig, ToStringStyle.DEFAULT_STYLE)); + } + + } + + // 本地缓存 + private void cacheData() throws Exception { + cache = new TreeCache(client, zkConfig.getLocalCachePath()); + cache.start(); + } + + private void waitClose() { + try { + Thread.sleep(600); + } catch (final InterruptedException ex) { + Thread.currentThread().interrupt(); + } + } + + /** + * 关闭 + */ + @Override + public void close() { + if (null != cache) { + cache.close(); + } + waitClose(); + CloseableUtils.closeQuietly(client); + } + + /** + * 获取数据,先从本地获取,本地找不到,从远程获取 + * + * @param key + * @return + */ + @Override + public String get(final String key) { + if (null == cache) { + return null; + } + ChildData resultIncache = cache.getCurrentData(key); + if (null != resultIncache) { + return null == resultIncache.getData() ? null : new String(resultIncache.getData(), Charset.forName("UTF-8")); + } + return getFromRemote(key); + } + + /** + * 从远程获取数据 + * + * @param key + * @return + */ + public String getFromRemote(final String key) { + try { + return new String(client.getData().forPath(key), Charset.forName("UTF-8")); + } catch (final Exception ex) { + LOGGER.error("getDirectly" + ToStringBuilder.reflectionToString(key, ToStringStyle.DEFAULT_STYLE), ex); + return null; + } + } + + /** + * 获取子节点 + * + * @param key + * @return + */ + @Override + public List getChildrenKeys(final String key) { + try { + List result = client.getChildren().forPath(key); + Collections.sort(result, new Comparator() { + + @Override + public int compare(final String o1, final String o2) { + return o2.compareTo(o1); + } + }); + return result; + } catch (final Exception ex) { + LOGGER.error("getChildrenKeys" + ToStringBuilder.reflectionToString(key, ToStringStyle.DEFAULT_STYLE), ex); + return Collections.emptyList(); + } + } + + /** + * 判断路径是否存在 + * + * @param key + * @return + */ + @Override + public boolean isExisted(final String key) { + try { + return null != client.checkExists().forPath(key); + } catch (final Exception ex) { + LOGGER.error("isExisted" + ToStringBuilder.reflectionToString(key, ToStringStyle.DEFAULT_STYLE), ex); + return false; + } + } + + /** + * 持久化数据 + * + * @param key + * @param value + */ + @Override + public void registerPersist(final String key, final String value) { + try { + if (!isExisted(key)) { + client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath(key, value.getBytes()); + } else { + update(key, value); + } + } catch (final Exception ex) { + LOGGER.error("persist" + key + "," + value, ex); + } + } + + /** + * 更新数据 + * + * @param key + * @param value + */ + @Override + public void update(final String key, final String value) { + try { + client.inTransaction().check().forPath(key).and().setData().forPath(key, value.getBytes(Charset.forName("UTF-8"))).and().commit(); + } catch (final Exception ex) { + LOGGER.error("update" + key + "," + value, ex); + } + } + + /** + * 注册临时数据 + * + * @param key + * @param value + */ + @Override + public void registerEphemeral(final String key, final String value) { + try { + if (isExisted(key)) { + client.delete().deletingChildrenIfNeeded().forPath(key); + } + client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(key, value.getBytes(Charset.forName("UTF-8"))); + } catch (final Exception ex) { + LOGGER.error("persistEphemeral" + key + "," + value, ex); + } + } + + /** + * 注册临时顺序数据 + * + * @param key + */ + @Override + public void registerEphemeralSequential(final String key, final String value) { + try { + client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath(key, value.getBytes()); + } catch (final Exception ex) { + LOGGER.error("persistEphemeralSequential" + key, ex); + } + } + + /** + * 注册临时顺序数据 + * + * @param key + */ + @Override + public void registerEphemeralSequential(final String key) { + try { + client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath(key); + } catch (final Exception ex) { + LOGGER.error("persistEphemeralSequential" + key, ex); + } + } + + /** + * 删除数据 + * + * @param key + */ + @Override + public void remove(final String key) { + try { + client.delete().deletingChildrenIfNeeded().forPath(key); + } catch (final Exception ex) { + LOGGER.error("remove" + key, ex); + } + } + + public TreeCache getCache() { + return cache; + } + +} diff --git a/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/queue/BaseQueue.java b/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/queue/BaseQueue.java deleted file mode 100644 index 9b2a5b83..00000000 --- a/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/queue/BaseQueue.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.shinemo.mpush.tools.zk.queue; - -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.recipes.queue.QueueConsumer; -import org.apache.curator.framework.recipes.queue.QueueSerializer; -import org.apache.curator.framework.state.ConnectionState; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.shinemo.mpush.tools.Jsons; -import com.shinemo.mpush.tools.zk.consumer.ConsumerCallBack; - -public class BaseQueue { - - private static final Logger log = LoggerFactory.getLogger(BaseQueue.class); - - public static QueueSerializer createQueueSerializer(final Class clazz) { - return new QueueSerializer() { - - @Override - public byte[] serialize(T item) { - return Jsons.toJson(item).getBytes(); - } - - @Override - public T deserialize(byte[] bytes) { - return Jsons.fromJson(bytes, clazz); - } - - }; - } - - public static QueueConsumer createQueueConsumer(final Class clazz,final ConsumerCallBack callBack) { - - return new QueueConsumer() { - - @Override - public void consumeMessage(T message) throws Exception { - callBack.handler(message); - log.warn("consume one message:"+message); - } - - @Override - public void stateChanged(CuratorFramework client, ConnectionState newState) { - log.warn("connection new state:"+newState.name()); - } - - }; - - } - - -} diff --git a/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/queue/Consumer.java b/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/queue/Consumer.java deleted file mode 100644 index 22302c25..00000000 --- a/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/queue/Consumer.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.shinemo.mpush.tools.zk.queue; - -import org.apache.curator.framework.recipes.queue.DistributedQueue; -import org.apache.curator.framework.recipes.queue.QueueBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.shinemo.mpush.tools.zk.ZkUtil; -import com.shinemo.mpush.tools.zk.consumer.ConsumerCallBack; - -public class Consumer extends BaseQueue{ - - private static final Logger log = LoggerFactory.getLogger(Consumer.class); - - private DistributedQueue queue = null; - private String path; - - public Consumer(String path,final Class clazz,final ConsumerCallBack callBack){ - QueueBuilder builder = QueueBuilder.builder(ZkUtil.instance.getClient(), - createQueueConsumer(clazz,callBack), createQueueSerializer(clazz), path); - queue = builder.buildQueue(); - this.path = path; - } - - public void start() throws Exception{ - queue.start(); - log.warn("consumer start:"+path); - } - -} diff --git a/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/queue/Provider.java b/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/queue/Provider.java deleted file mode 100644 index 6d5ecf7b..00000000 --- a/mpush-tools/src/main/java/com/shinemo/mpush/tools/zk/queue/Provider.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.shinemo.mpush.tools.zk.queue; - -import org.apache.curator.framework.recipes.queue.DistributedQueue; -import org.apache.curator.framework.recipes.queue.QueueBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.shinemo.mpush.tools.zk.ZkUtil; - -public class Provider extends BaseQueue{ - - private static final Logger log = LoggerFactory.getLogger(Provider.class); - - private DistributedQueue queue = null; - - private String path; - - - public Provider(String path,final Class clazz){ - - QueueBuilder builder = QueueBuilder.builder(ZkUtil.instance.getClient(), - null, createQueueSerializer(clazz), path).lockPath(path); - queue = builder.buildQueue(); - this.path = path; - } - - public void start() throws Exception{ - queue.start(); - log.warn("provider start:"+path); - } - - public void put(T item) throws Exception{ - queue.put(item); - log.warn("provider put:"+item+","+path); - } - -} diff --git a/mpush-tools/src/main/resources/META-INF/mpush/services/com.shinemo.mpush.tools.spi.TestService b/mpush-tools/src/main/resources/META-INF/mpush/services/com.shinemo.mpush.tools.spi.TestService new file mode 100644 index 00000000..cdf8099c --- /dev/null +++ b/mpush-tools/src/main/resources/META-INF/mpush/services/com.shinemo.mpush.tools.spi.TestService @@ -0,0 +1,2 @@ +test1=com.shinemo.mpush.tools.spi.TestServiceImpl +test2=com.shinemo.mpush.tools.spi.TestServiceImpl2 \ No newline at end of file diff --git a/mpush-tools/src/test/java/com/shinemo/mpush/tools/spi/TestService.java b/mpush-tools/src/test/java/com/shinemo/mpush/tools/spi/TestService.java deleted file mode 100644 index 73a0700a..00000000 --- a/mpush-tools/src/test/java/com/shinemo/mpush/tools/spi/TestService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.shinemo.mpush.tools.spi; - - -@SPI("test1") -public interface TestService { - - public void sayHi(String name); - -} diff --git a/mpush-tools/src/test/java/com/shinemo/mpush/tools/spi/TestServiceImpl.java b/mpush-tools/src/test/java/com/shinemo/mpush/tools/spi/TestServiceImpl.java deleted file mode 100644 index 2310a043..00000000 --- a/mpush-tools/src/test/java/com/shinemo/mpush/tools/spi/TestServiceImpl.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.shinemo.mpush.tools.spi; - -public class TestServiceImpl implements TestService { - - public TestServiceImpl() { - System.out.println("1111111"); - } - - @Override - public void sayHi(String name) { - System.out.println("TestServiceImpl hi,"+name); - } - -} diff --git a/mpush-tools/src/test/java/com/shinemo/mpush/tools/spi/TestServiceImpl2.java b/mpush-tools/src/test/java/com/shinemo/mpush/tools/spi/TestServiceImpl2.java deleted file mode 100644 index ae9a4c32..00000000 --- a/mpush-tools/src/test/java/com/shinemo/mpush/tools/spi/TestServiceImpl2.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.shinemo.mpush.tools.spi; - - -public class TestServiceImpl2 implements TestService { - - public TestServiceImpl2() { - System.out.println("2222222"); - } - - - @Override - public void sayHi(String name) { - System.out.println("TestServiceImpl2 hi,"+name); - } - -} diff --git a/mpush-tools/src/test/java/com/shinemo/mpush/tools/spi/TestSpi.java b/mpush-tools/src/test/java/com/shinemo/mpush/tools/spi/TestSpi.java deleted file mode 100644 index 00038d47..00000000 --- a/mpush-tools/src/test/java/com/shinemo/mpush/tools/spi/TestSpi.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.shinemo.mpush.tools.spi; - -public class TestSpi { - - public static void main(String[] args) { - - TestService testService = ServiceContainer.getInstance(TestService.class); - testService.sayHi("huang"); - - } - -} -