使用CDI的axon框架搭建

来源:互联网 发布:企业网络机房建设方案 编辑:程序博客网 时间:2024/05/13 23:31

一直在看DDD,自己感觉也可以搭建一个基本的开发环境了。但还是想综合看一下别人的成果。axonframwork看了几天了,感觉比isis更好上手,更加专注于领域模型,其他的事不管,挺好,而isis还有它自己定义的界面方案,不知道怎么摘出来,可能是我不够熟悉isis吧,感觉用的不舒服。之前读了axon的quickstart和那个 addressbook例子。addressbook使用的是spring。可是我一直不用spring了(因为那个恶心的数据源死锁问题),而是使用CDI来做注入之类的事情。我想把addressbook移植到CDI上,废了不少周折才基本可用,下面就是我主要的改动,自己做个记录。

   主要问题:@CommandHandler,@EventHandler这种注解,可以直接放到一个pojo类的某个方法上,这样就没法通过普通的@Produces进行初始化,基本的java方式只能是用实现CommandHandler接口来做,但这样需要创建的handler类太多了。

   另外,spring管理事务的功能肯定不能在cdi中使用了。

  自己瞎鼓捣一阵子,基本注入都可以了,但是@CommandHandler和@EventHandler这种注解没搞定,忽然从他的mailing list中看到有人写了个axon-cdi的实现,在github上,能够帮我解决不少问题,自己写的话,CDI又要深入研究几天了。多谢作者!如果你要找这个实现,直接去github上搜就行了。

下面说说我关键几个地方的配置情况,使用maven:

首先,在pom.xml中配置库的地址:

<repositories>   <repository>            <id>osc-repo</id>            <url>http://maven.oschina.net/content/groups/public/</url>        </repository>        <repository>            <id>public-repo2</id>            <url>http://repo2.maven.org/maven2/</url>            </repository>   <repository>        <id>jitpack.io</id>        <url>https://jitpack.io</url>        <name>Jitpack.io Repository</name>        <releases>            <enabled>true</enabled>        </releases>        <snapshots>            <enabled>true</enabled>        </snapshots>    </repository>    </repositories>

其中主要是jitpack.io这个库地址的配置,其他都是我自己配置的。这个配置允许从它的库中下载这个依赖,然后加上依赖的配置:

<dependency>      <groupId>com.github.kamaladafrica</groupId>      <artifactId>axon-cdi</artifactId>      <version>1.0-SNAPSHOT</version>    </dependency>

这个库我自己是直接下载的zip源代码,自己安装的,你也可以这样搞。

还有几个依赖,是cdi扩展:apache-deltaspike,用于事务控制,axon-cdi也使用了deltaspike,也要加上:

<dependency>    <groupId>org.apache.deltaspike.core</groupId>    <artifactId>deltaspike-core-api</artifactId>    <version>1.6.0</version>    <scope>compile</scope></dependency><dependency><groupId>org.apache.deltaspike.core</groupId><artifactId>deltaspike-core-impl</artifactId><version>1.6.0</version><scope>runtime</scope></dependency><dependency>    <groupId>org.apache.deltaspike.modules</groupId>    <artifactId>deltaspike-jpa-module-api</artifactId>    <version>1.6.0</version>    <scope>compile</scope></dependency><dependency><groupId>org.apache.deltaspike.modules</groupId><artifactId>deltaspike-jpa-module-impl</artifactId><version>1.6.0</version></dependency>

还有,axon-cdi自己有个例子,可以参照:axon-cdi-quickstart-master,同样也在github上,然后根据这个例子的AxonConfiguration.java中的配置,自己修改一些自己使用的东西,入repository,主要是axon-cdi的@AutoConfigure注解,是帮助程序自动解析@CommandHandler、@EventHandler之类注解生成bean实例的。


axon-cdi-quickstart-master这个例子使用deltaspike的启动和停止,直接运行的,但我的工程是个web工程(我把addressbook的api和webui工程整合到了一个工程里面),所以,需要使用容器中的CDI环境。axon-cdi使用的是cdi-api 1.1版本,所以必须使用JavaEE7应用服务器,我用的是WildFly8.2.0.Final。之前不清楚这个情况,在tomee1.7.4上部署,总没有效果,因为tomee目前只支持javaee6.


还有deltaspike-jpa-xxxx是cdi扩展,可以使用@Transactional注解来控制数据库事务。使用这种方式控制事务,需要注意EntityManager的生成方式:EntityManager的producer应该这样:

@ApplicationScopedpublic class EntityManagerProducer {@PersistenceUnit    private EntityManagerFactory entityManagerFactory;@Produces    @Default    @RequestScoped    public EntityManager create()    {        return this.entityManagerFactory.createEntityManager();    }    public void dispose(@Disposes @Default EntityManager entityManager)    {        if (entityManager.isOpen())        {            entityManager.close();        }    }}

使用EntityManagerFactory和@PersistenceUnit注解,在使用EntityManager的地方,应该使用@Inject注解,而不要直接使用@PersistenceContext注解,这种方式参考了官方文档。这样配置后,就可以在方法上直接加入@Transactional来指定事务控制了。


还有,我使用的是GenricJPARepository,例子原本用的是EventSourcedRepository,按照axon的要求聚合根必须使用jpa注解过的才可以,否则它不会保存数据到contactentry表

0 0
原创粉丝点击