如何在 spring 中实现对同一个数据对象,实现流式处理? 即,定义某一接口,同时定义多个处理类来实现这个接口,在处理数据时,依次(并行)调用这些处理类,在处理类内部,根据业务需求,判断是否需要进行处理,不处理的直接 return 。
现在的方式是使用策略模式,通过 Autowired 自动注入这些处理类,放入 map ,根据业务类型取出不同的处理类进行处理。
不知这是否是在 spring boot 中的最佳实现方式? 如果同时需要多个处理类进行处理(如上所述),是否只能在自动注入时放入一个 List 中,进行遍历处理?
public interface Strategy { Integer getBizCode(); public int doOperation(int num1, int num2); } @Component public class OperationAdd implements Strategy{ @Override public Integer getBizCode() { return 1; } @Override public int doOperation(int num1, int num2) { return num1 + num2; } } @Component public class OperationSubtract implements Strategy{ @Override public Integer getBizCode() { return 2; } @Override public int doOperation(int num1, int num2) { return num1 - num2; } } public class StrategyPatternDemo { HashMap<Integer, Strategy> strategyMap = new HashMap<>(); @Autowired public StrategyPatternDemo(List<Strategy> strategies){ for (Strategy strategy : strategies) { strategyMap.put(strategy.getCode(),strategy); } } public void test(int type, int num1, int num2) { Strategy strategy = strategyMap.get(type); int result = strategy.doOperation(num1, num2); System.out.println(result); } }
1 yjll9102 2022-07-19 15:12:58 +08:00 ![]() 看看是否可以使用责任链来处理 |
2 shaneflane 2022-07-19 15:15:49 +08:00 ![]() |
3 damai0419 2022-07-19 15:19:01 +08:00 ![]() 感觉也是责任链模式,听起来比较符合。 |
4 NLL OP |
5 damai0419 2022-07-19 15:36:24 +08:00 |
6 zmal 2022-07-19 15:52:03 +08:00 数据结构可以选择一个支持并发的队列。 你可以说一下具体的场景,感觉像是一个 A-B 问题。 |
7 vvtf 2022-07-19 16:21:04 +08:00 ![]() ```java interface Rule<T extends S> { T run(T... args); default boolean enabled() { return true; } default boolean async() { return false; } } @Order(0) @Component class RuleA implements Rule<SomeA> { T run(T... args) { // TODO } boolean async() {return true;} } @Component class RuleChain { @Autowired private List<Rule> rules; static ExecutorService pool = xxxx; public void run(T... args) { rules.stream().filter(Rule::enabled).filter(Rule::async).forEach(rule -> pool.execute(rule.run());); rules.stream().filter(Rule::enabled).filter(rule -> !rule.async()).forEach(Rule::run); } } ``` |
8 NLL OP |
10 zmal 2022-07-19 16:33:56 +08:00 如果你的执行函数可以不区分前后,那还叫流式处理吗? 真实场景到底是什么?建议讲清楚。 |
![]() | 11 genesys 2022-07-19 16:38:31 +08:00 via iPhone “ 依次(并行)调用这些处理类” 到底是依次还是并行,差别很大的。 如果是并行的话,首先要选择如何实现并行。具体并行下执行的 task ,也许你可以考虑策略模式之类的。 |
12 NLL OP |
![]() | 13 genesys 2022-07-19 18:33:17 +08:00 via iPhone ![]() @zhijiansha 没关系。多提问挺好,这也是对自己提问能力的锻炼,提问能力是工作中很重要的一项技能。 |
![]() | 14 kytrun 2022-07-19 18:35:09 +08:00 ![]() 如果不需要拿到每一步的结果,直接 @ Async 完事儿 |
![]() | 15 0xLittleFi 2022-07-19 19:07:53 +08:00 ![]() 可以搜下开源的 easyflow 是咋实现的 |
16 zhangleshiye 2022-07-19 19:18:43 +08:00 @zhijiansha 根据 8 楼的信息 , 我感觉楼主是不是想要响应式编程的那种链式编程?类似 rxjava observable.zip<A,B,C>(getDataA(),getDataB) .(new subscribtion(A a,B ,b){ return ConvertC(a,b) }) 这样? 好久没用 rxjava 了 , 大概意思是这样.. |