Search in sources :

Example 6 with FilterEntry

use of org.redkale.boot.ClassFilter.FilterEntry in project redkale by redkale.

the class Application method runServers.

// private void clearPersistData() {
// File cachedir = new File(home, "cache");
// if (!cachedir.isDirectory()) return;
// File[] lfs = cachedir.listFiles();
// if (lfs != null) {
// for (File file : lfs) {
// if (file.getName().startsWith("persist-")) file.delete();
// }
// }
// }
// private void signalHandle() {
// //http://www.comptechdoc.org/os/linux/programming/linux_pgsignals.html
// String[] sigs = new String[]{"HUP", "TERM", "INT", "QUIT", "KILL", "TSTP", "USR1", "USR2", "STOP"};
// List<sun.misc.Signal> list = new ArrayList<>();
// for (String sig : sigs) {
// try {
// list.add(new sun.misc.Signal(sig));
// } catch (Exception e) {
// }
// }
// sun.misc.SignalHandler handler = new sun.misc.SignalHandler() {
// 
// private volatile boolean runed;
// 
// @Override
// public void handle(Signal sig) {
// if (runed) return;
// runed = true;
// logger.info(Application.this.getClass().getSimpleName() + " stoped\r\n");
// System.exit(0);
// }
// };
// for (Signal sig : list) {
// try {
// Signal.handle(sig, handler);
// } catch (Exception e) {
// }
// }
// }
@SuppressWarnings("unchecked")
private void runServers(CountDownLatch timecd, final List<AnyValue> serconfs) throws Exception {
    this.servicecdl = new CountDownLatch(serconfs.size());
    CountDownLatch sercdl = new CountDownLatch(serconfs.size());
    final AtomicBoolean inited = new AtomicBoolean(false);
    final Map<String, Class<? extends NodeServer>> nodeClasses = new HashMap<>();
    for (final AnyValue serconf : serconfs) {
        Thread thread = new Thread() {

            {
                setName("Redkale-" + serconf.getValue("protocol", "Server").toUpperCase().replaceFirst("\\..+", "") + ":" + serconf.getIntValue("port") + "-Thread");
                this.setDaemon(true);
            }

            @Override
            public void run() {
                try {
                    // Thread ctd = Thread.currentThread();
                    // ctd.setContextClassLoader(new URLClassLoader(new URL[0], ctd.getContextClassLoader()));
                    final String protocol = serconf.getValue("protocol", "").replaceFirst("\\..+", "").toUpperCase();
                    NodeServer server = null;
                    if ("SNCP".equals(protocol)) {
                        server = NodeSncpServer.createNodeServer(Application.this, serconf);
                    } else if ("WATCH".equalsIgnoreCase(protocol)) {
                        DefaultAnyValue serconf2 = (DefaultAnyValue) serconf;
                        DefaultAnyValue rest = (DefaultAnyValue) serconf2.getAnyValue("rest");
                        if (rest == null) {
                            rest = new DefaultAnyValue();
                            serconf2.addValue("rest", rest);
                        }
                        rest.setValue("base", WatchServlet.class.getName());
                        server = new NodeWatchServer(Application.this, serconf);
                    } else if ("HTTP".equalsIgnoreCase(protocol)) {
                        server = new NodeHttpServer(Application.this, serconf);
                    } else {
                        if (!inited.get()) {
                            synchronized (nodeClasses) {
                                if (!inited.getAndSet(true)) {
                                    // 加载自定义的协议,如:SOCKS
                                    ClassFilter profilter = new ClassFilter(classLoader, NodeProtocol.class, NodeServer.class, (Class[]) null);
                                    ClassFilter.Loader.load(home, classLoader, ((excludelibs != null ? (excludelibs + ";") : "") + serconf.getValue("excludelibs", "")).split(";"), profilter);
                                    final Set<FilterEntry<NodeServer>> entrys = profilter.getFilterEntrys();
                                    for (FilterEntry<NodeServer> entry : entrys) {
                                        final Class<? extends NodeServer> type = entry.getType();
                                        NodeProtocol pros = type.getAnnotation(NodeProtocol.class);
                                        String p = pros.value().toUpperCase();
                                        if ("SNCP".equals(p) || "HTTP".equals(p))
                                            continue;
                                        final Class<? extends NodeServer> old = nodeClasses.get(p);
                                        if (old != null && old != type) {
                                            throw new RuntimeException("Protocol(" + p + ") had NodeServer-Class(" + old.getName() + ") but repeat NodeServer-Class(" + type.getName() + ")");
                                        }
                                        nodeClasses.put(p, type);
                                    }
                                }
                            }
                        }
                        Class<? extends NodeServer> nodeClass = nodeClasses.get(protocol);
                        if (nodeClass != null)
                            server = NodeServer.create(nodeClass, Application.this, serconf);
                    }
                    if (server == null) {
                        logger.log(Level.SEVERE, "Not found Server Class for protocol({0})", serconf.getValue("protocol"));
                        System.exit(0);
                    }
                    servers.add(server);
                    server.init(serconf);
                    if (!singletonMode && !compileMode) {
                        server.start();
                    } else if (compileMode) {
                        server.getServer().getPrepareServlet().init(server.getServer().getContext(), serconf);
                    }
                    timecd.countDown();
                    sercdl.countDown();
                } catch (Exception ex) {
                    logger.log(Level.WARNING, serconf + " runServers error", ex);
                    Application.this.serversLatch.countDown();
                }
            }
        };
        thread.start();
    }
    sercdl.await();
}
Also used : DefaultAnyValue(org.redkale.util.AnyValue.DefaultAnyValue) FilterEntry(org.redkale.boot.ClassFilter.FilterEntry) DefaultAnyValue(org.redkale.util.AnyValue.DefaultAnyValue)

Example 7 with FilterEntry

use of org.redkale.boot.ClassFilter.FilterEntry in project redkale by redkale.

the class PrepareCompiler method run.

// public static void main(String[] args) throws Exception {
// new PrepareCompiler().run();
// }
public Application run() throws Exception {
    final Application application = new Application(false, true, Application.loadAppConfig());
    application.init();
    for (ApplicationListener listener : application.listeners) {
        listener.preStart(application);
    }
    for (ApplicationListener listener : application.listeners) {
        listener.preCompile(application);
    }
    application.start();
    final boolean hasSncp = application.getNodeServers().stream().filter(v -> v instanceof NodeSncpServer).findFirst().isPresent();
    final String[] exlibs = (application.excludelibs != null ? (application.excludelibs + ";") : "").split(";");
    final ClassFilter<?> entityFilter = new ClassFilter(application.getClassLoader(), Entity.class, Object.class, (Class[]) null);
    final ClassFilter<?> beanFilter = new ClassFilter(application.getClassLoader(), Bean.class, Object.class, (Class[]) null);
    final ClassFilter<?> filterFilter = new ClassFilter(application.getClassLoader(), null, FilterBean.class, (Class[]) null);
    ClassFilter.Loader.load(application.getHome(), application.getClassLoader(), exlibs, entityFilter, beanFilter, filterFilter);
    for (FilterEntry en : entityFilter.getFilterEntrys()) {
        Class clz = en.getType();
        if (clz.isInterface() || Modifier.isAbstract(clz.getModifiers()))
            continue;
        try {
            application.dataSources.forEach(source -> source.compile(clz));
            JsonFactory.root().loadEncoder(clz);
            if (hasSncp)
                BsonFactory.root().loadEncoder(clz);
            Decodeable decoder = JsonFactory.root().loadDecoder(clz);
            if (hasSncp)
                BsonFactory.root().loadDecoder(clz);
            decoder.convertFrom(new JsonReader("{}"));
        } catch (Exception e) {
        // JsonFactory.loadDecoder可能会失败,因为class可能包含抽象类字段,如ColumnValue.value字段
        }
    }
    for (FilterEntry en : beanFilter.getFilterEntrys()) {
        Class clz = en.getType();
        if (clz.isInterface() || Modifier.isAbstract(clz.getModifiers()))
            continue;
        try {
            JsonFactory.root().loadEncoder(clz);
            if (hasSncp)
                BsonFactory.root().loadEncoder(clz);
            Decodeable decoder = JsonFactory.root().loadDecoder(clz);
            if (hasSncp)
                BsonFactory.root().loadDecoder(clz);
            decoder.convertFrom(new JsonReader("{}"));
        } catch (Exception e) {
        // JsonFactory.loadDecoder可能会失败,因为class可能包含抽象类字段,如ColumnValue.value字段
        }
    }
    for (FilterEntry en : filterFilter.getFilterEntrys()) {
        Class clz = en.getType();
        if (clz.isInterface() || Modifier.isAbstract(clz.getModifiers()))
            continue;
        try {
            FilterNodeBean.load(clz);
        } catch (Exception e) {
        }
    }
    for (ApplicationListener listener : application.listeners) {
        listener.postCompile(application);
    }
    application.shutdown();
    return application;
}
Also used : Decodeable(org.redkale.convert.Decodeable) FilterEntry(org.redkale.boot.ClassFilter.FilterEntry)

Aggregations

FilterEntry (org.redkale.boot.ClassFilter.FilterEntry)7 DefaultAnyValue (org.redkale.util.AnyValue.DefaultAnyValue)6 Annotation (java.lang.annotation.Annotation)2 java.lang.reflect (java.lang.reflect)2 java.net (java.net)2 java.util (java.util)2 Level (java.util.logging.Level)2 javax.annotation (javax.annotation)2 RESNAME_SNCP_ADDR (org.redkale.boot.Application.RESNAME_SNCP_ADDR)2 org.redkale.net (org.redkale.net)2 org.redkale.net.http (org.redkale.net.http)2 Sncp (org.redkale.net.sncp.Sncp)2 org.redkale.service (org.redkale.service)2 org.redkale.util (org.redkale.util)2 org.redkale.watch (org.redkale.watch)2 CountDownLatch (java.util.concurrent.CountDownLatch)1 Stream (java.util.stream.Stream)1 ClusterAgent (org.redkale.cluster.ClusterAgent)1 Decodeable (org.redkale.convert.Decodeable)1 MessageAgent (org.redkale.mq.MessageAgent)1