Coder Social home page Coder Social logo

cola's Introduction

🥤 COLA v4

Fast CI Multiply Java versions CI License Java support Maven Central GitHub Releases GitHub Stars GitHub Forks user repos GitHub issues GitHub Contributors gitpod: Ready to Code

COLA 是 Clean Object-Oriented and Layered Architecture的缩写,代表“整洁面向对象分层架构”。 目前COLA已经发展到COLA v4

COLA分为两个部分,COLA架构和COLA组件。

一、COLA架构

COLA 概述

架构意义 就是 要素结构:

  • 要素 是 组成架构的重要元素;
  • 结构 是 要素之间的关系。

应用架构意义 就在于

  • 定义一套良好的结构;
  • 治理应用复杂度,降低系统熵值;
  • 从随心所欲的混乱状态,走向井井有条的有序状态。

arch why

COLA架构就是为此而生,其核心职责就是定义良好的应用结构,提供最佳应用架构的最佳实践。通过不断探索,我们发现良好的分层结构,良好的包结构定义,可以帮助我们治理混乱不堪的业务应用系统。

cure

经过多次迭代,我们定义出了相对稳定、可靠的应用架构:COLA v4

cola arch

COLA Archetypes

好的应用架构,都遵循一些共同模式,不管是六边形架构、洋葱圈架构、整洁架构、还是COLA架构,都提倡以业务为核心,解耦外部依赖,分离业务复杂度和技术复杂度等

COLA架构区别于这些架构的地方,在于除了**之外,我们还提供了可落地的工具和实践指导。

为了能够快速创建满足COLA架构的应用,我们提供了两个archetype,位于cola-archetypes目录下:

  1. cola-archetype-service:用来创建纯后端服务的archetype
  2. cola-archetype-web:用来创建adapter和后端服务一体的web应用archetype

二、COLA组件

此外,我们还提供了一些非常有用的通用组件,这些组件可以帮助我们提升研发效率。

这些功能组件被收拢在cola-components目录下面。到目前为止,我们已经沉淀了以下组件:

组件名称 功能 依赖
cola-component-dto 定义了DTO格式,包括分页
cola-component-exception 定义了异常格式,
主要有BizExceptionSysException
cola-component-statemachine 状态机组件
cola-component-domain-starter Spring托管的领域实体组件
cola-component-catchlog-starter 异常处理和日志组件 exceptiondto组件
cola-component-extension-starter 扩展点组件
cola-component-test-container 测试容器组件

三、如何使用COLA

1. 创建应用

执行以下命令:

mvn archetype:generate \
    -DgroupId=com.alibaba.cola.demo.web \
    -DartifactId=demo-web \
    -Dversion=1.0.0-SNAPSHOT \
    -Dpackage=com.alibaba.demo \
    -DarchetypeArtifactId=cola-framework-archetype-web \
    -DarchetypeGroupId=com.alibaba.cola \
    -DarchetypeVersion=4.3.2

命令执行成功的话,会看到如下的应用代码结构:

demo struture

2. 运行应用

  • 项目目录下运行mvn install(如果不想运行测试,可以加上-DskipTests参数)。
  • 进入start目录,执行mvn spring-boot:run
    运行成功的话,可以看到SpringBoot启动成功的界面。
  • 生成的应用中,已经实现了一个简单的Rest请求,可以在浏览器中输入 http://localhost:8080/helloworld 进行测试。

如果要生成不是web工程而是service工程也类似,执行的是下面的命令:

mvn archetype:generate \
    -DgroupId=com.alibaba.cola.demo.service \
    -DartifactId=demo-service \
    -Dversion=1.0.0-SNAPSHOT \
    -Dpackage=com.alibaba.demo \
    -DarchetypeArtifactId=cola-framework-archetype-service \
    -DarchetypeGroupId=com.alibaba.cola \
    -DarchetypeVersion=4.3.2

版本迭代

4.0.0 版本

https://blog.csdn.net/significantfrank/article/details/110934799

3.1.0 版本

https://blog.csdn.net/significantfrank/article/details/109529311

  1. 进一步简化了cola-core,只保留了扩展能力。
  2. exceptioncola-core移入到cola-common
  3. archetype中的分包逻辑进行重构,改成按照domain做划分。
  4. cola-archetype-web中的controller改名为adapter,为了呼应六边形架构的命名。

3.0.0 版本

https://blog.csdn.net/significantfrank/article/details/106976804

2.0.0 版本

https://blog.csdn.net/significantfrank/article/details/100074716

1.0.0 版本

https://blog.csdn.net/significantfrank/article/details/85785565

cola's People

Contributors

binghx avatar byd-android-2017 avatar chenggwang avatar chenhui0212 avatar dependabot[bot] avatar dudiao avatar eltociear avatar fanyi-zhao avatar frankwang-zf avatar fushun1990 avatar geyingqi777 avatar heihei180 avatar hnxiaoyuan avatar ivan97 avatar jutem avatar kun1988 avatar likaer avatar meishenme avatar merthmagic avatar n2xk avatar oldratlee avatar piaolingxue avatar richardstark avatar robbietree8 avatar shenjianeng avatar significantfrank avatar sinopower avatar whitebookman1994 avatar wzslw avatar xyz0001 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cola's Issues

BizScenario must implement java.io.Serializable

在集成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

依赖缺失问题

使用命令创建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)

Please provide English documentation

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?

ColaContext以及**Hub类中的HashMap是否能替换为ConcurrentHashMap

如: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);
	}
}

建议未来提供EventSouring的支持

因为没有框架的文档,大概看了一下代码。感觉 cmd和event的关系及在框架中的定位不是特别明确。本来我以为 cmd是由调用端(client)发起,cmd 转化为 领域事件,事件处理器消化更改状态,持久化并发出消息,消息响应调用端。但是不知道框架是不是这么设计的或者未来是否准备支持?因为如果要支持EventSouring的话,领域对象才能通过回放事件来恢复状态。只有事件被持久化。如果cmd处理器也涉及领域状态,就没有办法实现这个需求了。也不好控制回放和恢复。
cmd(client/consumer)->event(only domain model)->message(consumer/subscriber)

CommandRegister中command自己专属的、父类Interceptors均没注册成功

--- 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;

通过archetype生成的测试代码无法直接运行

通过提供的文档,生成了 demo 代码,无法直接运行,因为从远程仓库找不到 cola-framework 相关依赖,只能先将 framework mvn install 安装到本地, 但是 test 模块无法安装,提示找不到 com.sun.tools:jar:1.8。 这个应该是 system 级别的,maven **仓库应该没有,有也是低版本的(我的 maven 配置有问题?)。
建议通过 archetype 生成的代码能够直接运行起来,减少些入门成本

减少重复建设的建议和看法

本框架高度依赖 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

以上只是举例部分内容,我的看法是应该重心放在核心的特性上。

EventBus使用问题

demo里的DomainEventPublisher,实现的publish调用的是 eventBus的fire方法。我看了源代码,fire只执行了第一个handler。然后另外提供了一个fireAll和asyncFire。
我想问的是

  1. 我有多个handler 是不是要自己实现一个frieall的publisher。
    2.既有异步又有同步的话,是不是要既要调用fireall 又要调用asyncfire

事务如何实现呢?

application层是系统用例模型的反映,拼装各种Domain层业务逻辑,事务应该配置在*CmdExe的方法上吧

cola-extension 不存在

框架项目中没有发现 这个项目 cola-extension,但是生成的项目中又有这个依赖

demo可以更丰富点

service业务的互相调用怎么实现呢,扩展点之类的有什么使用规范呢?谢谢啦

@PreInterceptor

@PreInterceptor(commands = {cmd.class, cmd.class})????
自定义无法调用????

面向对象的**似乎有根本性的问题

自从把做了8年的j2ee 系统改造到 clojure . 越来越觉得,面向对象是个不好的方向.

  • 面试近五六百人, "把工作中常用到的设计模式说下", 几乎没用.
  • 系统由团队来开发,不同的人/小组 开发不同的模块, 独立开发、独立部署, 用面向对象来统一,会死板,僵化.
  • 单元测试 用面向对象**来写,好像带着一个枷锁.
  • 函数式编程 + 微服务, 每个模块的写法规范比较好统一, 多个数据库 crud 全面分装为底层api. 核心流程,封
    装为高级api . 这样只要有api的权限,随时随地都可以在自己模块编写代码,而不影响整个系统的其他模块

(https://github.com/marick/Midje 这个写单元测试 非常好用)

locateComponent获取不到循环对象。

BizScenario.getUniqueIdentity方法useCase、scenario为空则使用默认值,这样子doRegistration方法调用BizScenario.getUniqueIdentity,useCase、scenario为空返回是xxx.defaultUseCase.defaultScenario。而ExtensionExecutor.loopTry方法在解析bizScenario时对useCase、scenario进行截取,并不会补充useCase、scenario的默认值,这样导致locateComponent找不到对应的扩展类。

关于@Entity的使用疑问

sample 中的domain包下面的 领域模型 为什么都没有用@entity标识为一个bean呢?
想问一下:
领域模型到底应该被标识为一个bean吗?
领域模型的行为可以依赖repository吗?
领域模型的行为可以依赖外部的service吗?

生成的demo无法运行

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

*Hub 线程安全问题和设计建议

如题:

@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 实现均存在以上问题。

两个疑问,期待回复. ^_^

问题1:exe与领域边界疑问?
我看sample中app模块下的exe service做的事情无非两类:1、调用领域层,2协调数据。调用领域的目的是为了完成业务,协调数据是为了服务领域。这里exe更像是一个指挥,但是指挥实际也属于业务的一部分,至少在本业务中算是本业务中的业务了。既然有指挥官存在的话,如何划分清楚exe与领域的业务边界呢?
问题2:领域为何不直接操作数据?
也是由于问题1,也或许是由于洋葱圈架构的设计。我看sample中的domain都没有直接操作数据,都是被赋值以后再做业务处理,或者将数据返回以后在repository中完成写操作。我想知道,为何不在domain中直接操作数据呢?当然我说的直接操作也是遵循依赖倒置原则,domain依赖资源抽象而不直接依赖具体资源,可类似于Command实现。

The desired archetype does not exist (com:sofa-framework-archetype:1)

[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

Event扩展

  • 建议EventBus支持同步和异步混合执行EventHandler,可在EventHandler execute配置同步或异步执行模式。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.