@Extension(desc = "下单扩展能力")
public interface OrderCreateSpi {
boolean isUseRedPacked(OrderCreateParam param);
Map<String, Object> getCustomOrderAttributes(OrderCreateParam param);
}- 默认实现
@ExtensionBase
public class BaseOrderCreateSpiImpl implements OrderCreateSpi {
@Override
public boolean isUseRedPacked(OrderCreateParam param) {
return false;
}
@Override
public Map<String, Object> getCustomOrderAttributes(OrderCreateParam param) {
return Collections.emptyMap();
}
}- 业务实现: 普通交易
@ExtensionBusiness(code = "normal", desc = "普通电商交易")
public class NormalOrderCreateSpiImpl extends BaseOrderCreateSpiImpl {
@Override
public boolean isUseRedPacked(OrderCreateParam param) {
return true;
}
@Override
public Map<String, Object> getCustomOrderAttributes(OrderCreateParam param) {
return Collections.singletonMap("order-source", "normal");
}
}- 业务实现: O2O交易
@ExtensionBusiness(code = "o2o", desc = "O2O交易")
public class O2OOrderCreateSpiImpl extends BaseOrderCreateSpiImpl {
@Override
public boolean isUseRedPacked(OrderCreateParam param) {
return false;
}
@Override
public Map<String, Object> getCustomOrderAttributes(OrderCreateParam param) {
return Collections.singletonMap("order-source", "o2o");
}
}public interface OrderCreateSpi {
boolean isUseRedPacked(OrderCreateParam param);
Map<String, Object> getCustomOrderAttributes(OrderCreateParam param);
}不再需要@Extension注解声明
- 默认实现
@Component
public class BaseOrderCreateSpiImpl implements OrderCreateSpi {
@Override
public boolean isUseRedPacked(OrderCreateParam param) {
return false;
}
@Override
public Map<String, Object> getCustomOrderAttributes(OrderCreateParam param) {
return Collections.emptyMap();
}
}不再需要@ExtensionBase注解, 但需要使用@Component注解声明为spring的bean
- 业务实现: 普通交易
@Component
public class NormalOrderCreateSpiImpl extends BaseOrderCreateSpiImpl {
@Override
public boolean isUseRedPacked(OrderCreateParam param) {
return true;
}
@Override
public Map<String, Object> getCustomOrderAttributes(OrderCreateParam param) {
return Collections.singletonMap("order-source", "normal");
}
}不再需要@ExtensionBusiness注解, 但需要使用@Component注解声明为spring的bean
- 业务实现: O2O交易
@Component
public class O2OOrderCreateSpiImpl extends BaseOrderCreateSpiImpl {
@Override
public boolean isUseRedPacked(OrderCreateParam param) {
return false;
}
@Override
public Map<String, Object> getCustomOrderAttributes(OrderCreateParam param) {
return Collections.singletonMap("order-source", "o2o");
}
}同上
<?xml version="1.0" encoding="utf-8"?>
<Extensions xmlns="https://www.alibaba.com/aventus/extension"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.alibaba.com/aventus/extension https://www.alibaba.com/aventus/extension.xsd">
<Extension class="com.alibaba.aventus.test.extension.spi.OrderCreateSpi" base="baseOrderCreateSpiImpl" desc="下单扩展能力">
<Business code="normal" type="bean" desc="普通电商交易">
<bean name="normalOrderCreateSpiImpl"/>
</Business>
<Business code="o2c" type="bean" desc="O2O交易">
<bean name="o2OOrderCreateSpiImpl"/>
</Business>
</Extension>
</Extensions>@Test
public void test() throws Exception {
// 业务身份解析
Extension.parse(DemoExtensionParser.class, new String[]{"base"});
OrderCreateParam param = new OrderCreateParam();
// 扩展点调用
boolean isUseRedPacket = Extension.execute(OrderCreateSpi.class, spi -> spi.isUseRedPacked(param));
System.out.println(isUseRedPacket);
List<Map<String, Object>> attributes = Extension.execute(OrderCreateSpi.class, spi -> spi.getCustomOrderAttributes(param), Reducers.collect());
for (Map<String, Object> attribute : attributes) {
System.out.println(attribute);
}
// 上下文清理
Extension.clear();
}- Bean配置
@Bean
public ExtensionSpringBean<OrderCreateSpi> orderCreateSpi() {
ExtensionSpringBean<OrderCreateSpi> springBean = new ExtensionSpringBean<>();
springBean.setExtension(OrderCreateSpi.class);
springBean.setReducer(Reducers.firstOf());
return springBean;
}- 发起调用
@Resource
private OrderCreateSpi orderCreateSpi;
@Test
public void test() throws Exception {
// 业务身份解析
Extension.parse(DemoExtensionParser.class, new String[]{"base"});
OrderCreateParam param = new OrderCreateParam();
// 扩展点调用
// boolean isUseRedPacket = Extension.execute(OrderCreateSpi.class, spi -> spi.isUseRedPacked(param));
boolean isUseRedPacket = orderCreateSpi.isUseRedPacked(param);
System.out.println(isUseRedPacket);
// List<Map<String, Object>> attributes = Extension.execute(OrderCreateSpi.class, spi -> spi.getCustomOrderAttributes(param), Reducers.collect());
Map<String, Object> attributes = orderCreateSpi.getCustomOrderAttributes(param);
System.out.println(attributes);
// 上下文清理
Extension.clear();
}实现ExtensionParser接口, 覆盖parseExtensionCode方法
public class DemoExtensionParser implements ExtensionParser<String[]> {
@Override
public String parseExtensionCode(String[] args) {
return args[0];
}
}仅支持xml方式配置(扩展点声明与实现可以与注解方式配置)
<bean id="ORDER-CREATE-FLOW" class="com.alibaba.aventus.flow.Flow">
<constructor-arg name="name" value="ORDER-CREATE"/>
<constructor-arg name="nodes">
<util:list>
<bean class="com.alibaba.aventus.test.flow.node.OrderCreateNode1"/>
<bean class="com.alibaba.aventus.test.flow.node.OrderCreateNode2"/>
<bean class="com.alibaba.aventus.test.flow.node.OrderCreateNode2"/>
<bean class="com.alibaba.aventus.test.flow.node.OrderCreateNode2"/>
<bean class="com.alibaba.aventus.test.flow.node.OrderCreateNode2"/>
<bean class="com.alibaba.aventus.test.flow.node.OrderCreateNode2"/>
<bean class="com.alibaba.aventus.test.flow.node.OrderCreateNode2"/>
<bean class="com.alibaba.aventus.test.flow.node.OrderCreateNode3"/>
</util:list>
</constructor-arg>
</bean>@Resource
private Flow<OrderCreateContext, Long> flow;
@Test
public void test()throws Throwable{
OrderCreateContext input=new OrderCreateContext();
input.setItemId(new Random().nextInt());
long bizOrderId=flow.execute(input);
System.out.println("bizOrderId = "+bizOrderId);
}- 已经适配logback、log4j2两种日志系统
- 执行日志地址:
${user.home}/logs/aventus- 扩展执行日志: ${user.home}/logs/aventus/extension.log
- 流程执行日志: ${user.home}/logs/aventus/flow.log

