当前位置: 首页 > 知识库问答 >
问题:

关于如何将遗留Java代码转换为Reactive with Project-React库的问题

仲孙奇
2023-03-14

我打算用projectreactor库编写一个process()方法

process()方法将字节数组作为参数,并执行以下步骤。假设每个步骤的所有其他方法都已编写并准备好使用。

  1. 将字节数组反序列化为消息对象
  2. 从消息对象提取用户ID、用户状态和用户地址
  3. 从数据库中按用户ID检索记录
  4. 如果从消息对象提取的这两个值不为Null,则使用userStatus和userAddress更新记录
  5. 将记录保存到数据库中
@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个答案

马朝斑
2023-03-14

问题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的工具(虽然可能不正确,但是可以)。任何人都可以通过建议这些工具的名称来帮助我。 问题答案: 免责声明: 没有工具是完美的。 但是