alibaba / cola Goto Github PK
View Code? Open in Web Editor NEW🥤 COLA: Clean Object-oriented & Layered Architecture
License: GNU Lesser General Public License v2.1
🥤 COLA: Clean Object-oriented & Layered Architecture
License: GNU Lesser General Public License v2.1
例如 com.alibaba.craftsman.dto.clientobject.ATAMetricCO
,而不是使用 VO 结尾?
正常情况下,VO 不是更加通用吗?
通过提供的文档,生成了 demo 代码,无法直接运行,因为从远程仓库找不到 cola-framework 相关依赖,只能先将 framework mvn install 安装到本地, 但是 test 模块无法安装,提示找不到 com.sun.tools:jar:1.8。 这个应该是 system 级别的,maven **仓库应该没有,有也是低版本的(我的 maven 配置有问题?)。
建议通过 archetype 生成的代码能够直接运行起来,减少些入门成本
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
lombok升级版本为1.6.22,且依赖中的scope设置为provided可解决这个问题。
自从把做了8年的j2ee 系统改造到 clojure . 越来越觉得,面向对象是个不好的方向.
(https://github.com/marick/Midje 这个写单元测试 非常好用)
BizScenario.getUniqueIdentity方法useCase、scenario为空则使用默认值,这样子doRegistration方法调用BizScenario.getUniqueIdentity,useCase、scenario为空返回是xxx.defaultUseCase.defaultScenario。而ExtensionExecutor.loopTry方法在解析bizScenario时对useCase、scenario进行截取,并不会补充useCase、scenario的默认值,这样导致locateComponent找不到对应的扩展类。
This COLA framework seems nice but a lot of documentation use images that cannot be google translated.
Could you please provide documentation for COLA in english?
demo里的DomainEventPublisher,实现的publish调用的是 eventBus的fire方法。我看了源代码,fire只执行了第一个handler。然后另外提供了一个fireAll和asyncFire。
我想问的是
在集成dubbo的时候,扩展类没有实现序列化
Caused by: java.lang.RuntimeException: Serialized class com.alibaba.cola.extension.BizScenario must implement java.io.Serializable Java field: private com.alibaba.cola.extension.BizScenario com.alibaba.cola.dto.Command.bizScenario at com.alibaba.com.caucho.hessian.io.JavaSerializer$FieldSerializer.serialize(JavaSerializer.java:299) at com.alibaba.com.caucho.hessian.io.JavaSerializer.writeInstance(JavaSerializer.java:279) at com.alibaba.com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:246) at com.alibaba.com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:383) at com.alibaba.dubbo.common.serialize.support.hessian.Hessian2ObjectOutput.writeObject(Hessian2ObjectOutput.java:77) at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec.encodeRequestData(DubboCodec.java:175) at c
现在的COLA中找不到rule目录以及相关的类了。是用其他的东西替换了这个概念吗?
Class<?> superClass = commandClass.getSuperclass();
while (Command.class.isAssignableFrom(superClass)) {
Iterables.concat(commandItr, (pre ? commandHub.getPreInterceptors() : commandHub.getPostInterceptors()).get(commandClass));
superClass = superClass.getSuperclass();
}
This field is never used.
1.是否已经安装核心core到本地maven?
已经执行 mvn install:install-file
2.java运行版本
基于甲骨文java1.8
3.idea的language level 8-lambdas
4.需要修改pom才能运行
5.是否修改其中源码
暂无修改,基于官方文档生成的demo
6.错误信息
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'domainEventPublisher': Unsatisfied dependency expressed through field 'eventBus'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'eventBus': Unsatisfied dependency expressed through field 'eventHub'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'eventHub': Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [com.alibaba.cola.event.EventHub] from ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:596)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:374)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1395)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:849)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
at com.alibaba.sample.Application.main(Application.java:19)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'eventBus': Unsatisfied dependency expressed through field 'eventHub'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'eventHub': Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [com.alibaba.cola.event.EventHub] from ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:596)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:374)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1395)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1247)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1167)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593)
... 18 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'eventHub': Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [com.alibaba.cola.event.EventHub] from ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:265)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1253)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1168)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1247)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1167)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593)
... 31 common frames omitted
Caused by: java.lang.IllegalStateException: Failed to introspect Class [com.alibaba.cola.event.EventHub] from ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2]
at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:686)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:583)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:568)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:248)
... 43 common frames omitted
Caused by: java.lang.NoClassDefFoundError: com/google/common/collect/ListMultimap
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.getDeclaredMethods(Class.java:1975)
at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:668)
... 46 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.google.common.collect.ListMultimap
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 50 common frames omitted
Process finished with exit code 1
@PreInterceptor(commands = {cmd.class, cmd.class})????
自定义无法调用????
application层是系统用例模型的反映,拼装各种Domain层业务逻辑,事务应该配置在*CmdExe的方法上吧
框架项目中没有发现 这个项目 cola-extension,但是生成的项目中又有这个依赖
在调用DataTunnelI获取数据这里, 是要在内部再来注入mapper来调用方法实现从DB获取数据吗, 还是可以直接用xml mapper实现对应的接口
COLA Framework2.0 中没有cola-extension模块,而archetype中又指定依赖了cola-extension:jar:2.0.0
问题:
[WARNING] The POM for com.alibaba.cola:cola-extension:jar:2.0.0 is missing, no dependency information available
数据库文件可以提供一下吗
问题1:exe与领域边界疑问?
我看sample中app模块下的exe service做的事情无非两类:1、调用领域层,2协调数据。调用领域的目的是为了完成业务,协调数据是为了服务领域。这里exe更像是一个指挥,但是指挥实际也属于业务的一部分,至少在本业务中算是本业务中的业务了。既然有指挥官存在的话,如何划分清楚exe与领域的业务边界呢?
问题2:领域为何不直接操作数据?
也是由于问题1,也或许是由于洋葱圈架构的设计。我看sample中的domain都没有直接操作数据,都是被赋值以后再做业务处理,或者将数据返回以后在repository中完成写操作。我想知道,为何不在domain中直接操作数据呢?当然我说的直接操作也是遵循依赖倒置原则,domain依赖资源抽象而不直接依赖具体资源,可类似于Command实现。
使用命令创建demo,或者直接对samle进行mvn install 都报错,是maven中心库缺少包了么?
麻烦帮忙看看,谢谢
[INFO] craftsman.all ...................................... SUCCESS [ 0.213 s] [INFO] craftsman-client ................................... FAILURE [ 2.795 s] [INFO] craftsman-infrastructure ........................... SKIPPED [INFO] craftsman-domain ................................... SKIPPED [INFO] craftsman-app ...................................... SKIPPED [INFO] craftsman-controller ............................... SKIPPED [INFO] start .............................................. SKIPPED [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.349 s [INFO] Finished at: 2019-12-05T09:28:13+08:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal on project craftsman-client: Could not resolve dependencies for project com.alibaba.craftsman:craftsman-client:jar:1.0.0-SNAPSHOT: Could not find artifact com.alibaba.cola:cola-common:jar:2.0.0 in central (https://repo.maven.apache.org/maven2) -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal on project craftsman-client: Could not resolve dependencies for project com.alibaba.craftsman:craftsman-client:jar:1.0.0-SNAPSHOT: Could not find artifact com.alibaba.cola:cola-common:jar:2.0.0 in central (https://repo.maven.apache.org/maven2)
源码提供的cola-test版本是1.0.1-SNAPSHOT,生产的demo项目依赖1.0.0-SNAPSHOT
1、CommandInvocation直接处理了异常,这里为什么不抛出异常,让controller层再统一处理呢?
比如批量操作,分页,连表查询?
因为没有框架的文档,大概看了一下代码。感觉 cmd和event的关系及在框架中的定位不是特别明确。本来我以为 cmd是由调用端(client)发起,cmd 转化为 领域事件,事件处理器消化更改状态,持久化并发出消息,消息响应调用端。但是不知道框架是不是这么设计的或者未来是否准备支持?因为如果要支持EventSouring的话,领域对象才能通过回放事件来恢复状态。只有事件被持久化。如果cmd处理器也涉及领域状态,就没有办法实现这个需求了。也不好控制回放和恢复。
cmd(client/consumer)->event(only domain model)->message(consumer/subscriber)
主要是 extension相关的,最好有实际也用中的使用方式便于理解
The path split symbol problem is different for different operating systems. Hard-coded file separators should not be used. Instead, use a platform-independent API provided by the language library,such as java.io.File.separator or java.lang.System.getProperty("file.separator")
如题:
@Component
public class EventHub {
@Getter
@Setter
private Map<Class, EventHandlerI> eventRepository = new HashMap<>();
@Getter
private Map<Class, Class> responseRepository = new HashMap<>();
该实现利用 lombok 将底层的 Map 暴露了,这样就给外部用户提供了动态注册的路径。建议不要通过 public 暴露,并且尽可能的线程安全 Map
几乎所有 *Hub
实现均存在以上问题。
sample 中的domain包下面的 领域模型 为什么都没有用@entity标识为一个bean呢?
想问一下:
领域模型到底应该被标识为一个bean吗?
领域模型的行为可以依赖repository吗?
领域模型的行为可以依赖外部的service吗?
<dependency>
<groupId>com.alibaba.cola</groupId>
<artifactId>cola-common</artifactId>
<version>2.0.0</version>
</dependency>
本框架高度依赖 Spring Framework 4.3+ 和 Spring Boot 1.4+ ,建议直接使用底层实现,比如:
ValidatorI
-> org.springframework.validation.Validator
ConvertorI
-> org.springframework.core.convert.converter.Converter
或者 org.springframework.core.convert.converter.GenericConverter
ErrorCodeI
-> org.springframework.validation.Errors
以上只是举例部分内容,我的看法是应该重心放在核心的特性上。
如:ColaContext类
// 所有应用需要的Context信息,通过SofaContext的map进行维护,每个context都是一个独立的Threadlocal
private static Map<Class<? extends ColaContextSupprot>,ThreadLocal<ColaContextSupprot>> map = new ConcurrentHashMap<>(4);
/**
* 设置个别上下文
* @param context
*/
public static void setContext(ColaContextSupprot... context){
for(ColaContextSupprot sofaContext : context){
/*
if(map.get(sofaContext.getClass()) == null){
synchronized (ColaContext.class){
if(map.get(sofaContext.getClass()) == null){
map.put(sofaContext.getClass(), new ThreadLocal<>());
}
}
}
*/
if(map.get(sofaContext.getClass()) == null){
map.putIfAbsent(sofaContext.getClass(), new ThreadLocal<>());
}
map.get(sofaContext.getClass()).set(sofaContext);
}
}
在simple 模块下,我理解的craftsman-client是打包成jar包提供给其他RPC服务调用,那自身领域服务下的restful接口也依赖craftsman-client?
service业务的互相调用怎么实现呢,扩展点之类的有什么使用规范呢?谢谢啦
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:3.0.1:generate (default-cli) on project sofa-framework-archetype: The desired archetype does not exist (com:sofa-framework-archetype:1) -> [Help 1]
Error happens when I run the comand 'mvn archetype:generate -DgroupId=com.alibaba.crm -DartifactId=demo -Dversion=1.0.0-SNAPSHOT -Dpackage=com.alibaba.crm.demo -DarchetypeArtifactId=sofa-framework-archetype -DarchetypeGroupId=com.alibaba.sofa -DarchetypeVersion=1.0.0-SNAPSHOT
' according to the README
--- c/sofa-framework/sofa-core/src/main/java/com/alibaba/sofa/boot/CommandRegister.java
+++ w/sofa-framework/sofa-core/src/main/java/com/alibaba/sofa/boot/CommandRegister.java
@@ -73,13 +73,13 @@ public class CommandRegister implements RegisterI, ApplicationContextAware {
/**
* add command自己专属的Interceptors
*/
- Iterables.concat(commandItr, (pre ? commandHub.getPreInterceptors() : commandHub.getPostInterceptors()).get(commandClass));
+ commandItr = Iterables.concat(commandItr, (pre ? commandHub.getPreInterceptors() : commandHub.getPostInterceptors()).get(commandClass));
/**
* add parents的Interceptors
*/
Class<?> superClass = commandClass.getSuperclass();
while (Command.class.isAssignableFrom(superClass)) {
- Iterables.concat(commandItr, (pre ? commandHub.getPreInterceptors() : commandHub.getPostInterceptors()).get(commandClass));
+ commandItr = Iterables.concat(commandItr, (pre ? commandHub.getPreInterceptors() : commandHub.getPostInterceptors()).get(commandClass));
superClass = superClass.getSuperclass();
}
return commandItr;
A 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.