留个纪念:可初始化的 Initializable

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.amoros.hawkeye.service.send;

import java.util.concurrent.atomic.AtomicBoolean;

/**
* 可初始化的
*
* @author 陶攀峰
* @date 2022-04-28 06:00
*/
public interface Initializable {

/**
* 是否完成初始化
*/
AtomicBoolean FINISHED = new AtomicBoolean();

/**
* 进行一些初始化的工作
*/
default void init() {
// 已初始化
if (FINISHED.get()) {
return;
}

// 未初始化
if (FINISHED.compareAndSet(false, true)) {
doInit();
}
}

/**
* 做初始化工作
*/
void doInit();

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.amoros.hawkeye.service.send;

import cn.hutool.extra.spring.SpringUtil;
import com.amoros.hawkeye.enums.ActionRelType;
import com.amoros.hawkeye.generator.domain.ActionRelDetail;
import com.amoros.hawkeye.generator.domain.TenantActionRel;
import com.amoros.hawkeye.generator.domain.custom.RelDetailIds;
import com.amoros.hawkeye.generator.service.ActionRelDetailService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
* 发送服务
*
* @author 陶攀峰
* @date 2022-04-11 18:19
*/
@Slf4j
@Component
public class SendService implements InitializingBean {

@Autowired
private static ActionRelDetailService actionRelDetailService;

private static Map<ActionRelType, HandlerAdapter> handlerAdapterMap;

/**
* 成员变量初始化 => 从 BeanFactory 中获取
*/
@Override
public void afterPropertiesSet() throws Exception {
handlerAdapterMap = SpringUtil.getBeansOfType(HandlerAdapter.class).values().stream()
.collect(Collectors.toMap(HandlerAdapter::getType, Function.identity()));
}

/**
* 发送:在 Drools 中调用
*/
public static void send(TenantActionRel tenantActionRel) {
// 查询关联详情列表:消息、任务、...
List<Long> relDetailIds = RelDetailIds.list(tenantActionRel.getRelDetailIds());
List<ActionRelDetail> actionRelDetailList = actionRelDetailService.list(Wrappers.lambdaQuery(ActionRelDetail.class)
.in(ActionRelDetail::getId, relDetailIds)
);

// 依次处理
for (ActionRelDetail actionRelDetail : actionRelDetailList) {
HandlerAdapter handlerAdapter = handlerAdapterMap.get(actionRelDetail.getActionRelType());
handlerAdapter.handler(tenantActionRel, actionRelDetail);
}
}

}