yinjihuan / elastic-job-spring-boot-starter Goto Github PK
View Code? Open in Web Editor NEWElastic-Job Spring Boot 自动集成,只需要一个注解即可发布Job
Elastic-Job Spring Boot 自动集成,只需要一个注解即可发布Job
@configuration
@ConditionalOnBean(annotation = EnableElasticJob.class)
public class JobParserAutoConfiguration {}
跟springboot budduo集成 jar 包冲突
找不到节点,这个错误怎么解决???com.dangdang.ddframe.job.reg.exception.RegExceptionHandler.handleException:48 Elastic job: ignored exception for: KeeperErrorCode = NoNode for /elasticJob/MySimpleJob/sharding
你好,我遇到一个问题,报错信息如下
***************************
APPLICATION FAILED TO START
***************************
Description:
The bean 'SpringJobScheduler', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
按错误信息提示,配置一下spring.main.allow-bean-definition-overriding=true就可以了。我是注解与 properties 两种形式混用的,不同的 JOB。而且 job name 也没有重复,不知为何出现这个报错
有没有像quartz一样的可以手动立即触发的功能
首先非常感谢你这个项目,,但是我们有这样一个需求,就是 开发环境下面 不想用elasticsearch ,测试环境才用,这个时候自然想到了用profile ,但是这里有个问题就是,只要我pom 引用了你的项目,那么就会自动先去连zookeeper 如果没有启动的话,就报错了。然后springboot就退出。所以是否能支持我在真正操作的时候才去看zookeeper 是否连接上,,或者是我用了 指定的profile才生效。。
JobController.addJob方法中,if ("ScriptJob".equals(job.getJobType())) {} 中的常量"ScriptJob"是不是应该改为“SCRIPT”?
2.0以上版本不支持驼峰参数,需要修改为"-"方式
@ConfigurationProperties(prefix = "elasticJob.zk")
public class ZookeeperProperties {}
可以修改为
@ConfigurationProperties(prefix = "elastic-job.zk")
@component
@configuration
public class JobConfParser implements ApplicationContextAware {
private String prefix = "elasticJob.";
}
可以修改为:
@component
@configuration
public class JobConfParser implements ApplicationContextAware {
private String prefix = "elastic-job.";
}
类JobController动态添加SCRIPT任务54行if ("ScriptJob".equals(job.getJobType())) {},应该修改为if ("ScriptJob".equals(job.getJobType())) {}
1.0.5版本的release的pom里面版本写的是1.0.4,我这边有些地方会将他识别成1.0.4版本,最终1.0.5版本的会提示找不到
README.md下
增加Zookeeper注册中心的配置
elasticJob.zk.serverLists=192.168.10.47:2181
elasticJob.zk.namespace=cxytiandi_job2
对应elastic-job-spring-boot-starter version: 1.0.4
配置前缀错误,未更新为 elastic.job.zk
JobParserAutoConfiguration在@EnableElasticJob中@import、META-INF中spring.factories还有JobParserAutoConfiguration中的@configuration三个地方注入,导入@EnableElasticJob不加还是能正常使用
JobConfParser注册完任务后,会触发zk的监听,监听器会重复执行任务内的注册
#1问题描述
JobConfParser 实现了 ApplicationContextAware接口,spring启动的时候会调用setApplicationContext方法,在该方法里完成对注解ElasticJobConf解析,同时注册任务,假如系统应用中额外定义Aware标注接口,自定义BeanPostProcessor处理器发现实现了ApplicationContextAware就注入ApplicationContext,那么会导致setApplicationContext方法重复调用,任务重复注册。
建议修复改造一下就行。
您好,我下载elastic-job-spring-boot-example后,只保留MySimpleJob任务相关配置,报错java.lang.IllegalStateException,详细报错如下:
2018-04-20 12:34:00.967 ERROR 2120 --- [ain-EventThread] o.a.c.framework.recipes.cache.TreeCache :
java.lang.IllegalStateException: instance must be started before calling this method
at com.google.common.base.Preconditions.checkState(Preconditions.java:173) ~[guava-18.0.jar:na]
at org.apache.curator.framework.imps.CuratorFrameworkImpl.getChildren(CuratorFrameworkImpl.java:391) ~[curator-framework-2.10.0.jar:na]
at org.apache.curator.framework.recipes.cache.TreeCache$TreeNode.doRefreshChildren(TreeCache.java:263) ~[curator-recipes-2.10.0.jar:na]
at org.apache.curator.framework.recipes.cache.TreeCache$TreeNode.refreshChildren(TreeCache.java:251) ~[curator-recipes-2.10.0.jar:na]
at org.apache.curator.framework.recipes.cache.TreeCache$TreeNode.process(TreeCache.java:351) ~[curator-recipes-2.10.0.jar:na]
at org.apache.curator.framework.imps.NamespaceWatcher.process(NamespaceWatcher.java:62) [curator-framework-2.10.0.jar:na]
at org.apache.zookeeper.ClientCnxn$EventThread.processEvent(ClientCnxn.java:522) [zookeeper-3.4.6.jar:3.4.6-1569965]
at org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:498) [zookeeper-3.4.6.jar:3.4.6-1569965]
2018-04-20 12:34:00.967 INFO 2120 --- [ain-EventThread] org.apache.zookeeper.ClientCnxn : EventThread shut down
2018-04-20 12:34:00.967 ERROR 2120 --- [tor-TreeCache-1] o.a.c.framework.recipes.cache.TreeCache :
com.dangdang.ddframe.job.reg.exception.RegException: java.lang.IllegalStateException: instance must be started before calling this method
at com.dangdang.ddframe.job.reg.exception.RegExceptionHandler.handleException(RegExceptionHandler.java:52) ~[elastic-job-common-core-2.1.5.jar:na]
at com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter.getDirectly(ZookeeperRegistryCenter.java:162) ~[elastic-job-common-core-2.1.5.jar:na]
at com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter.get(ZookeeperRegistryCenter.java:137) ~[elastic-job-common-core-2.1.5.jar:na]
at com.dangdang.ddframe.job.lite.internal.storage.JobNodeStorage.getJobNodeData(JobNodeStorage.java:72) ~[elastic-job-lite-core-2.1.5.jar:na]
at com.dangdang.ddframe.job.lite.internal.config.ConfigurationService.load(ConfigurationService.java:54) ~[elastic-job-lite-core-2.1.5.jar:na]
at com.dangdang.ddframe.job.lite.internal.failover.FailoverListenerManager.isFailoverEnabled(FailoverListenerManager.java:70) ~[elastic-job-lite-core-2.1.5.jar:na]
at com.dangdang.ddframe.job.lite.internal.failover.FailoverListenerManager.access$000(FailoverListenerManager.java:39) ~[elastic-job-lite-core-2.1.5.jar:na]
at com.dangdang.ddframe.job.lite.internal.failover.FailoverListenerManager$JobCrashedJobListener.dataChanged(FailoverListenerManager.java:78) ~[elastic-job-lite-core-2.1.5.jar:na]
at com.dangdang.ddframe.job.lite.internal.listener.AbstractJobListener.childEvent(AbstractJobListener.java:44) ~[elastic-job-lite-core-2.1.5.jar:na]
at org.apache.curator.framework.recipes.cache.TreeCache$2.apply(TreeCache.java:732) [curator-recipes-2.10.0.jar:na]
at org.apache.curator.framework.recipes.cache.TreeCache$2.apply(TreeCache.java:726) [curator-recipes-2.10.0.jar:na]
at org.apache.curator.framework.listen.ListenerContainer$1.run(ListenerContainer.java:93) [curator-framework-2.10.0.jar:na]
at com.google.common.util.concurrent.MoreExecutors$DirectExecutorService.execute(MoreExecutors.java:299) [guava-18.0.jar:na]
at org.apache.curator.framework.listen.ListenerContainer.forEach(ListenerContainer.java:85) [curator-framework-2.10.0.jar:na]
at org.apache.curator.framework.recipes.cache.TreeCache.callListeners(TreeCache.java:725) [curator-recipes-2.10.0.jar:na]
at org.apache.curator.framework.recipes.cache.TreeCache.access$1400(TreeCache.java:71) [curator-recipes-2.10.0.jar:na]
at org.apache.curator.framework.recipes.cache.TreeCache$4.run(TreeCache.java:843) [curator-recipes-2.10.0.jar:na]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_144]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_144]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_144]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_144]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_144]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_144]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_144]
Caused by: java.lang.IllegalStateException: instance must be started before calling this method
at com.google.common.base.Preconditions.checkState(Preconditions.java:173) ~[guava-18.0.jar:na]
at org.apache.curator.framework.imps.CuratorFrameworkImpl.getData(CuratorFrameworkImpl.java:375) ~[curator-framework-2.10.0.jar:na]
at com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter.getDirectly(ZookeeperRegistryCenter.java:158) ~[elastic-job-common-core-2.1.5.jar:na]
... 22 common frames omitted
注解@ElasticJobConf,有个属性“distributedListener”,现在继承AbstractDistributeOnceElasticJobListener类,想在所有分片执行前执行某个操作(即重写方法doBeforeJobExecutedAtLastStarted),发现在控制台进行调用,这个方法持交替性的执行多次,而非单个主节点执行(如:第一次执行了,doBeforeJobExecutedAtLastStarted执行一次,第二次执行了,doBeforeJobExecutedAtLastStarted执行两次,之后交替重复执行 。此现象测试来源于10台机器,分20片得到的结果)
不知道这个情况,其它小伙伴们遇到没有?
application.yml中配置任务信息,应用起不来,配置如下
elastic:
job:
job1:
cron: * 0/5 * * * ?
description: 任务1
disabled: false
failover: true
jobParameter: 1800000,300000
misfire: false
monitorExecution: false
overwrite: true
shardingItemParameters: 0=0,1=1
shardingTotalCount: 1
在测试过程中,出现了定时执行正常,但手动触发执行会执行2次job的情况,经过debug发现JobService中应该是重复执行了springJobScheduler的init方法所致,但不明白为什么定时是不执行2次,解决方法是去掉JobService类中addJob方法中最后的springJobScheduler.init();就正常了,不知道作者遇到过没?
当把jo类删掉掉,启动找不到job导致启动失败,在case CHILD_ADDED里加了下面的改动:
if (ClassUtils.isPresent(job.getJobClass(), JobService.class.getClassLoader())) {
addJob(job);
} else {
removeJob(job.getJobName());
}
1.0.4 maven 下载不下来,仓库配了。
#1、问题
现有代码是通过判断计数器JOB_ADD_COUNT是否为1来决定是否执行addJob(job)方法,但是这样还是有例外场景。
#2、场景
比如有进程A,B,都需要执行同样的任务,先启动进程A,显示调用了addJob方法,此时在zk上完成任务的注册。待注册成功后启动进程B,没有显示调用addJob,那么monitorJobRegister方法启动监听,执行
case CHILD_ADDED的逻辑,但是在进程B中由于还没有执行对应job的addJob方法,此时的计数器还没有初始化,那么monitorJobRegister中的的动态注册任务是不会执行的。
#3、分析
正常情况下,进程启动后,由进程解析ElasticJobConf,然后注册任务(addJob),那么原有的逻辑是不会有问题的,但是存在一种例外情况,如上所述,启动进程B,在上下文中没有ElasticJobConf注解,纯碎是根据zk的注册信息,通过执行monitorJobRegister监听代码,完成任务的注册。
建议,可以综合考虑上述的两种情况,在JobService中维护一个任务注册器,只要任务已经注册了,就不调用addJob方法,否则就执行。
您好,使用中发现的小问题
1 代码位置: ElasticJobConf conf = (ElasticJobConf)clz.getAnnotation(ElasticJobConf.class);
使用cglib的时候直接是代理类,就取不到 这个注解
2 代码位置: String jobTypeName = clzz.getInterfaces()[0].getSimpleName();
如果任务类抽出一层父类,父类实现任务接口,子类继承父类,就无法直接取到获取到 interfaces 了
com.xiaoju.automarket.elasticjobstarter.dynamic.service.JobService#monitorJobRegister
方法的实现里面有一行获取监听到节点的配置。
String config = new String((byte[])client.getData().forPath(data.getPath() + "/config"));
这一行直接去读取config节点。
看了下jobx的源码里面新任务注册的逻辑。
com.xiaoju.automarket.elastic.job.lite.internal.config.ConfigurationService#persist
com.xiaoju.automarket.elastic.job.lite.internal.storage.JobNodeStorage#replaceJobNode
com.xiaoju.automarket.elastic.job.reg.base.RegistryCenter#persist
client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath(key, value.getBytes(Charsets.UTF_8));
创建/xxx/MyJob/config节点之前,会先创建/xxx/MyJob节点。
在极端情况下,/xxx/MyJob创建之后,/xxx/MyJob/config节点创建之前,监听逻辑读取config节点报错。
org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /xxx/MyJob/config
curator里面的创建任务节点相关代码见
org.apache.curator.framework.imps.CreateBuilderImpl#pathInForeground
会根据org.apache.curator.framework.imps.CreateBuilderImpl#createParentsIfNeeded判断是否创建父节点,如果该值为true,会先创建父节点,再创建子节点。
定时任务的名称是写死的,建议加一下从properties读取配置的功能。
A,B两个实例 ,A实例启动后正常执行任务,随后B实例启动报错,A实例报错如下:
java.lang.IllegalStateException: instance must be started before calling this method
2020-10-09 18:28:20.917 ERROR 1388 --- [tor-TreeCache-0] o.a.c.framework.recipes.cache.TreeCache :
com.dangdang.ddframe.job.reg.exception.RegException: java.lang.IllegalStateException: instance must be started before calling this method
at com.dangdang.ddframe.job.reg.exception.RegExceptionHandler.handleException(RegExceptionHandler.java:52)
at com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter.getDirectly(ZookeeperRegistryCenter.java:162)
at com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter.get(ZookeeperRegistryCenter.java:143)
at com.dangdang.ddframe.job.lite.internal.storage.JobNodeStorage.getJobNodeData(JobNodeStorage.java:72)
at com.dangdang.ddframe.job.lite.internal.config.ConfigurationService.load(ConfigurationService.java:54)
at com.dangdang.ddframe.job.lite.internal.failover.FailoverListenerManager.isFailoverEnabled(FailoverListenerManager.java:70)
at com.dangdang.ddframe.job.lite.internal.failover.FailoverListenerManager.access$000(FailoverListenerManager.java:39)
at com.dangdang.ddframe.job.lite.internal.failover.FailoverListenerManager$JobCrashedJobListener.dataChanged(FailoverListenerManager.java:78)
at com.dangdang.ddframe.job.lite.internal.listener.AbstractJobListener.childEvent(AbstractJobListener.java:44)
at org.apache.curator.framework.recipes.cache.TreeCache$2.apply(TreeCache.java:732)
at org.apache.curator.framework.recipes.cache.TreeCache$2.apply(TreeCache.java:726)
at org.apache.curator.framework.listen.ListenerContainer$1.run(ListenerContainer.java:93)
at com.google.common.util.concurrent.MoreExecutors$DirectExecutorService.execute(MoreExecutors.java:296)
at org.apache.curator.framework.listen.ListenerContainer.forEach(ListenerContainer.java:85)
at org.apache.curator.framework.recipes.cache.TreeCache.callListeners(TreeCache.java:725)
at org.apache.curator.framework.recipes.cache.TreeCache.access$1400(TreeCache.java:71)
at org.apache.curator.framework.recipes.cache.TreeCache$4.run(TreeCache.java:843)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalStateException: instance must be started before calling this method
at com.google.common.base.Preconditions.checkState(Preconditions.java:444)
at org.apache.curator.framework.imps.CuratorFrameworkImpl.getData(CuratorFrameworkImpl.java:375)
at com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter.getDirectly(ZookeeperRegistryCenter.java:158)
... 22 common frames omitted
B实例报错如下:
java.lang.NullPointerException: null
at com.dangdang.ddframe.job.lite.internal.failover.FailoverListenerManager$JobCrashedJobListener.dataChanged(FailoverListenerManager.java:80)
at com.dangdang.ddframe.job.lite.internal.listener.AbstractJobListener.childEvent(AbstractJobListener.java:44)
at org.apache.curator.framework.recipes.cache.TreeCache$2.apply(TreeCache.java:732)
at org.apache.curator.framework.recipes.cache.TreeCache$2.apply(TreeCache.java:726)
at org.apache.curator.framework.listen.ListenerContainer$1.run(ListenerContainer.java:93)
at com.google.common.util.concurrent.MoreExecutors$DirectExecutorService.execute(MoreExecutors.java:296)
at org.apache.curator.framework.listen.ListenerContainer.forEach(ListenerContainer.java:85)
at org.apache.curator.framework.recipes.cache.TreeCache.callListeners(TreeCache.java:725)
at org.apache.curator.framework.recipes.cache.TreeCache.access$1400(TreeCache.java:71)
at org.apache.curator.framework.recipes.cache.TreeCache$4.run(TreeCache.java:843)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobConfParser' defined in com.cxytiandi.elasticjob.autoconfigure.JobParserAutoConfiguration: Initialization of bean failed; nested exception is com.dangdang.ddframe.job.exception.JobSystemException: org.quartz.SchedulerException: The Scheduler has been shutdown.
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:134)
at ai.shanshu.shuhaisc.ShuhaiscFrApplication.main(ShuhaiscFrApplication.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: com.dangdang.ddframe.job.exception.JobSystemException: org.quartz.SchedulerException: The Scheduler has been shutdown.
at com.dangdang.ddframe.job.lite.internal.schedule.JobScheduleController.scheduleJob(JobScheduleController.java:57)
at com.dangdang.ddframe.job.lite.api.JobScheduler.init(JobScheduler.java:111)
at com.cxytiandi.elasticjob.parser.JobConfParser.setApplicationContext(JobConfParser.java:154)
at org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:121)
at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:97)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1620)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
... 19 common frames omitted
Caused by: org.quartz.SchedulerException: The Scheduler has been shutdown.
at org.quartz.core.QuartzScheduler.validateState(QuartzScheduler.java:795)
at org.quartz.core.QuartzScheduler.checkExists(QuartzScheduler.java:1542)
at org.quartz.impl.StdScheduler.checkExists(StdScheduler.java:564)
at com.dangdang.ddframe.job.lite.internal.schedule.JobScheduleController.scheduleJob(JobScheduleController.java:52)
... 26 common frames omitted
@ElasticJobConf(name = "MySimpleJob", cron = "0/10 * * * * ?", shardingTotalCount = 2, shardingItemParameters = "0=0,1=1", description = "简单任务")
System.out.println("分片参数:" + shardParamter);
分片参数 一直是1
现在的配置都是写死在注解里的,能否考虑从数据库读取配置呢?您是否有思路?
com.dangdang.ddframe.job.exception.JobConfigurationException: Cannot find script command line for job 'screenAdExpireJob', job is not executed.
@ElasticJobConf(name = "MySimpleJob",shardingTotalCount=5)
在execute 时发现 shardingTotalCount 是default 1
只有在配置文件赋值才有效
Failed to instantiate [com.dangdang.ddframe.job.lite.spring.api.SpringJobScheduler] 配置OK的
第一步添加仓库地址:
jitpack.io https://jitpack.ioA declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.