app为简易开发框架,目的为减少开发工作量提供的企业开发方案。
app
├── frame-core-- 基础框架公共模块
├── frame-web --web框架公共模块
├── frame-web-service --用户、角色、菜单管理
├── frame-flow -- 业务组件流程引擎
├── frame-mq -- 集成原生rocketmq服务
├── frame-redis -- 集成原生redis服务
├── frame-file -- 文件上传下载
├── frame-batch -- 批量调度
├── procnode -- 计算节点示例
└── webapp -- web工程示例
技术 | 名称 | 官网 |
---|---|---|
Springboot | 基础框架 | http://projects.spring.io/spring-framework/ |
Apache Shiro | 安全框架 | http://shiro.apache.org/ |
MyBatis | ORM框架 | http://www.mybatis.org/mybatis-3/zh/index.html |
MyBatis Generator | 代码生成 | http://www.mybatis.org/generator/index.html |
PageHelper | MyBatis物理分页插件 | http://git.oschina.net/free/Mybatis_PageHelper |
Druid | 数据库连接池 | https://github.com/alibaba/druid |
Freemarker | 模板引擎 | |
Redis | 分布式缓存数据库 | https://redis.io/ |
RocketMQ | 消息队列 | http://activemq.apache.org/ |
Log4J | 日志组件 | http://logging.apache.org/log4j/1.2/ |
frame-core
frame-core 基础框架公共模块由springboot Redis mybatis 组成,包括 通用dao、数据库二级缓存、异常捕获、服务切面、雪花序列、工具类等。
frame-web
frame-web web框架公共模块由springboot shiro 组成,包括 通用filter、shiro集成。
frame-web-service
frame-web-service 用户权限管理、资源管理、菜单管理等功能。
frame-flow
frame-flow 业务组件编排和流程执行引擎。 (目前支持xml 后续会支持 json)
详细说明在完整示例下面:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:app="http://qulu.com/schema/flow"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://qulu.com/schema/flow http://qulu.com/schema/flow.xsd">
<app:flow id="serviceDemo" >
<!--下面的block开启数据库事务执行业务组件 -->
<app:block transaction="TRUE">
<!--调用 busi1 的execute方法 异步执行 不抛出异常 -->
<app:component beanId="busi1" method="execute()" asyn="true" throw="false" />
<!--调用 busi2 的execute方法 同步执行 抛出异常 -->
<app:component beanId="busi2" method="execute(backData)" />
<!--异步并发,并同步结果 allOf全部执行完成继续下面流程 anyOf 任意完成执行流程 nullOf 不同步结果直接执行 -->
<app:futures procMode="allOf" >
<app:future beanId="busi3" method="execute(backData1)" throw="false" />
<app:future beanId="busi4" method="execute()" throw="false" />
</app:futures>
</app:block>
<!--下面的block不开启数据库事务 -->
<app:block>
<!--调用 busi5 的execute方法 抛出异常 -->
<app:component beanId="busi5" method="execute()" />
</app:block>
<app:block>
<!--获取线程服务上下文 使用el表达式判断是否成立 如果成立则执行busi6 -->
<app:if expression=" data.value == '1'" >
<app:block>
<!--调用 busi6 的execute方法 抛出异常 -->
<app:component beanId="busi6" method="execute()" />
<app:stop expression=" data.value == '1'"/>
</app:block>
</app:if>
<app:if expression=" data.value == '2'" >
<app:block>
<!--调用 busi7 的execute方法 抛出异常 -->
<app:component beanId="busi7" method="execute()" />
</app:block>
</app:if>
</app:block>
<app:dataConvert id="backData" class="com.qulu.flow.step.StepOneInput">
<app:property resource="222" target="333"/>
</app:dataConvert>
<app:dataConvert id="backData1" class="com.qulu.flow.step.SteptwoInput">
<app:property resource="222" target="444" />
</app:dataConvert>
</app:flow>
</beans>
标签说明:
标签 | 作用 |
---|---|
app:flow | 定义业务流程顺序: 根据标签属性id生成bean,包含多个app:block |
app:block | 业务组件集合块:内包含多个业务组件和判断组件,通过transaction标签判断本业务块是否开启事务,本业务块执行完成则提交事物。 |
app:component | 业务组件:根据beanId 和method找到对应bean的方法,方法入参由app:dataConvert 从上下文中映射获得,属性asyn判断是否异步执行 |
app:futures | 并发异步组件:包含多个app:future 异步业务组件,由completableFutures实现 属性procMode和completableFutures阻塞模式相同,nullOf不阻塞 |
app:future | 异步组件:必须包含在app:futures内并发执行 参数和app:component相同 |
app:if | 逻辑判断组件:内包含多个业务组件集合块(app:block) 根据属性expression的表达式是否成立判断执行。 |
app:stop | 终止判断组件: 根据属性expression的表达式是否成立判断是否终止,expression为空则直接终止 |
frame-redis
frame-redis 自动集成 单例redis和集群jediscluster 服务,提供有序序列服务。
frame-feign(废弃)
spring boot引用 openfeign自认为上下文完全隔离和切换,感觉过重 ,但使用nacos为注册中心为feign动态获取服务列表需要用到ribbon,nacos在springboot组件里 并没有NacosServerList功能维护服务列表 所以不在继续封装,直接引用openfeign或者dubbo,后续可以为nacos-spring开发一个组件 。
frame-mq
frame-mq 远程rocketmq封装,使用示例如下:
消费端:集成AbstractRocketConsumer 启动时加载监听
public class DefRocketConsumer extends AbstractRocketConsumer {
@Value( "${rocketmq.def.topic}")
public String topic;
@Value( "${rocketmq.def.tags}")
public String tags;
@Value( "${rocketmq.def.consumerTitel}")
public String consumerTitel;
// 设置消费队列信息
@PostConstruct
public void init() {
super.init(topic, tags, consumerTitel, "1");
}
@Override
public void messageHander(MessageExt msg) {
log.info(msg.toString());
//业务处理
}
}
生产端:集成AbstractRocketProducer 配置多队列生产者
public class DefRocketProducer extends AbstractRocketProducer {
@Value("${rocketmq.namesrvAddr}")
String namesrvAddr;
@Value("${rocketmq.groupName}")
String groupName;
@PostConstruct
public void init() throws MQClientException {
super.init(groupName, namesrvAddr);
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。