【发布时间】:2021-02-19 02:53:52
【问题描述】:
我打算用 project-reactor 库编写一个 process() 方法
process() 方法以字节数组为参数,经过以下步骤。假设每个步骤的所有其他方法都已编写好并可以使用。
- 将字节数组反序列化为 Message 对象
- 从 Message 对象中提取 userID、userStatus 和 userAddress
- 根据 userId 从数据库中检索记录
- 如果从 Message 对象中提取的这两个值不是 Null,则使用 userStatus 和 userAddress 更新记录。
- 将记录保存在数据库中
@Component
public class UserService {
@Autowired
private Repository repo;
//this is the method I want to fix
public Mono<User> process(byte[] byteArray) {
Message msg = deserialize(byteArray).block(); --> Question #1
String userId = extractUserId(msg);
String userStatus = extractUserStatus(msg);
String userAddress = extractUserAddress(msg);
return repo.find(userId)
.switchIfEmpty(Mono.defer(() -> {
log.error("Error Message");
return Mono.empty();
}))
.map(user -> {
if(userStatus != null) {
user.setStatus(userStatus);
}
if(userAddress != null) {
user.setAddress(userAddress);
}
})
.flatmap(repo::save);
}
private Mono<Message> deserialize(byte[] byteArray) {
//assume this method is written and is ready to be invoked;
}
private String extractUserId(Message msg) {
//assume this method is written and is ready to be invoked;
}
private String extractUserStatus(Message msg) {
//assume this method is written and is ready to be invoked;
}
private String extractUserAddress(Message msg) {
//assume this method is written and is ready to be invoked;
}
}
public class Repository {
public Mono<User> find (String id) {
//assume this method is written and is ready to be invoked;
}
public Mono<User> save(User user) {
//assume this method is written and is ready to be invoked;
}
}
问题 1:我不应该阻止它,但我必须从中提取 ID 以从数据库中检索记录,并在以后使用它来提取 userStatus 和地址。
问题 2:extractUserId、extractUserStatus 和 extractUserAddress 方法是否应该返回 Mono?
【问题讨论】:
标签: java reactive-programming project-reactor