Coder Social home page Coder Social logo

cola's Issues

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

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

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

自从把做了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找不到对应的扩展类。

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?

EventBus使用问题

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

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

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无法运行

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

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

事务如何实现呢?

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

cola-extension 不存在

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

Event扩展

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

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

问题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)

建议未来提供EventSouring的支持

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

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

关于@Entity的使用疑问

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

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

本框架高度依赖 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以及**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);
	}
}

demo可以更丰富点

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

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

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;

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.