我打算用projectreactor库编写一个process()方法
process()方法将字节数组作为参数,并执行以下步骤。假设每个步骤的所有其他方法都已编写并准备好使用。
@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和address。
问题2:extractUserId、extractUserStatus和extractUserAddress方法是否应该返回Mono?
问题1:我不应该阻止它,但是。。。
这并不是说你不应该这么做,但你不能阻止它(除非你采取一些策略,比如为链中没有其他选择的特定部分旋转线程池,这是混乱的,通常表明你还没有准备好移动到一个完全反应的堆栈)在一个完全反应的链中,任何块都会杀死死链,捆绑住宝贵的事件循环线程并削弱性能。
相反,您应该将其保留为Mono
return deserialize(byteArray)
.flatMap(
msg -> {
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);
});
提取用户ID、提取用户状态和提取用户地址方法是否应该返回Mono?
这取决于那些方法需要做什么。如果他们不返回单核细胞增多症,他们会阻止吗?如果是,那么他们应该返回Mono(而不是阻塞。)如果他们不需要阻塞,那么他们就没有理由返回mono(事实上他们不应该,因为这可能会导致开发人员对这些方法做出错误的假设)。)
请注意,您的
反序列化()
方法也是如此。如果它采用字节数组,则可能不需要执行任何阻塞操作(反序列化阻塞的通常原因是因为它从inputstream或类似文件读取,而不是因为实际的反序列化本身。)
我必须对遗留代码应用Spring AOP,而不改变现有代码中的任何内容。没有bean概念,对象是使用new关键字创建的,因此没有使用ApplicationContext.getBean(“Beanname”)的范围。此外,切入点将被作为来自最终用户的输入,并且将有一个公共方面类。 此外,如果使用Spring AOP是不可能的,那么如何在运行时使用AspectJ。
问题内容: 我正在将Java库移植到C#。我使用的是Visual Studio 2008,因此没有停止使用的Microsoft Java语言转换助手程序(JLCA)。 我的方法是创建一个与Java库具有类似项目结构的新解决方案,然后将Java代码复制到ac#文件中,并将其逐行转换为有效的c#。考虑到我觉得Java易于阅读,两种语言之间的细微差别使我感到惊讶。 有些事情很容易移植(命名空间,继承等)
问题内容: Web服务团队为我提供了此C#代码,该代码公开了一些我计划使用的Web服务。我的密码需要使用此代码进行加密,以便Web服务知道如何在其末尾对其进行解密。 我正在使用Java来使用此Web服务,现在,在将#C代码转换为Java代码时遇到问题,因为该Web服务无法正确解密我的密码。 这是我目前的失败尝试: 我做错什么了?非常感谢。 2013-08-07-更新 我在阅读此网站时,意识到我的模
我必须将下面的Java代码转换成一个UML图,但是我不确定是否正确地完成了类之间的关联。请你告诉我UML图是否正确。
问题内容: 我有一个用Scala编写的应用程序,我的一些团队成员希望使用Java版本。这是一个演示应用程序,可以使用用Scala编写的另一个API,并且他们希望该应用程序的Java版本能够使用Java中的API。但是,该应用程序有些大,我不想用Java手动重排代码(他们也不想学习Scala)。是否有任何工具可以从Scala代码自动生成(可读)Java代码? 问题答案: 他们希望应用程序的Java版
问题内容: 任何人都可以通过建议将C#代码转换为Java代码的转换器的名称来帮助我。实际上,我有一个用C#代码编写的工具,我正在尝试对其进行修改。由于我对C#和.NET框架一无所知,因此我似乎很难自行转换大型代码。我从一些网络信息中发现,存在一些可以将C#转换为Java的工具(虽然可能不正确,但是可以)。任何人都可以通过建议这些工具的名称来帮助我。 问题答案: 免责声明: 没有工具是完美的。 但是