本文主要研究一下PowerJob的UserService
tech/powerjob/server/core/service/UserService.java
@Service
public class UserService {
@Resource
private UserInfoRepository userInfoRepository;
/**
* 保存/修改 用户
* @param userInfoDO user
*/
public void save(UserInfoDO userInfoDO) {
userInfoDO.setGmtCreate(new Date());
userInfoDO.setGmtModified(userInfoDO.getGmtCreate());
userInfoRepository.saveAndFlush(userInfoDO);
}
/**
* 根据用户ID字符串获取用户信息详细列表
* @param userIds 逗号分割的用户ID信息
* @return 用户信息详细列表
*/
public List<UserInfoDO> fetchNotifyUserList(String userIds) {
if (StringUtils.isEmpty(userIds)) {
return Lists.newLinkedList();
}
// 去重
Set<Long> userIdList = Splitter.on(",").splitToList(userIds).stream().map(Long::valueOf).collect(Collectors.toSet());
List<UserInfoDO> res = userInfoRepository.findByIdIn(Lists.newLinkedList(userIdList));
res.forEach(x -> x.setPassword(null));
return res;
}
}
UserService提供了save及fetchNotifyUserList方法,基于UserInfoRepository来实现
tech/powerjob/server/persistence/remote/model/UserInfoDO.java
@Data
@Entity
@Table(indexes = {
@Index(name = "uidx01_user_info", columnList = "username"),
@Index(name = "uidx02_user_info", columnList = "email")
})
public class UserInfoDO {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
@GenericGenerator(name = "native", strategy = "native")
private Long id;
private String username;
private String password;
/**
* 手机号
*/
private String phone;
/**
* 邮箱地址
*/
private String email;
/**
* webHook
*/
private String webHook;
/**
* 扩展字段
*/
private String extra;
private Date gmtCreate;
private Date gmtModified;
}
UserInfoDO定义了username、email两个唯一键
tech/powerjob/server/persistence/remote/repository/UserInfoRepository.java
public interface UserInfoRepository extends JpaRepository<UserInfoDO, Long> {
List<UserInfoDO> findByUsernameLike(String username);
List<UserInfoDO> findByIdIn(List<Long> userIds);
}
UserInfoRepository基于JpaRepository,声明了findByUsernameLike、findByIdIn方法
tech/powerjob/server/core/instance/InstanceManager.java
private void alert(Long instanceId, String alertContent) {
InstanceInfoDO instanceInfo = instanceInfoRepository.findByInstanceId(instanceId);
JobInfoDO jobInfo;
try {
jobInfo = instanceMetadataService.fetchJobInfoByInstanceId(instanceId);
} catch (Exception e) {
log.warn("[InstanceManager-{}] can't find jobInfo, alarm failed.", instanceId);
return;
}
JobInstanceAlarm content = new JobInstanceAlarm();
BeanUtils.copyProperties(jobInfo, content);
BeanUtils.copyProperties(instanceInfo, content);
List<UserInfoDO> userList = SpringUtils.getBean(UserService.class).fetchNotifyUserList(jobInfo.getNotifyUserIds());
if (!StringUtils.isEmpty(alertContent)) {
content.setResult(alertContent);
}
alarmCenter.alarmFailed(content, AlarmUtils.convertUserInfoList2AlarmTargetList(userList));
}
InstanceManager的alert会根据jobInfo.getNotifyUserIds()区查找fetchNotifyUserList出来的userList,最后通过alarmCenter.alarmFailed给指定用户发送报警信息
UserService提供了save及fetchNotifyUserList方法,基于UserInfoRepository来实现;InstanceManager的alert会根据jobInfo.getNotifyUserIds()区查找fetchNotifyUserList出来的userList,最后通过alarmCenter.alarmFailed给指定用户发送报警信息。