我是第一次在Quarkus中使用Mutiny进行react 式编程. 我想编写一个REST API来异步读取一个文件(Romance.txt),对其应用一些转换,并将转换后的文本异步写入一个新文件(RomanceSigned.txt).

我写的代码如下:

@ApplicationScoped
public class ReactiveService {
    
    @Inject
    Vertx vertx;


    public Uni<Buffer> readFile () {
        
        String fileName = new String("src/main/resources/Romance.txt");

        Uni<Buffer> textReaded = 
            vertx.fileSystem().readFile(fileName);

        textReaded.onItem()
            .transform(item -> modifyText(item))
            .subscribe()
                .with(item -> writeRomanceOnNewFile(item));


        return textReaded;

    }


    private Buffer modifyText (Buffer buffer) {

        byte[] byteText = buffer.getBytes();
        String stringText = new String(byteText);
        String upperCaseStringText = stringText.toUpperCase();
        String textModifiedAndSigned = upperCaseStringText.concat(" Hello World");
        return Buffer.buffer(textModifiedAndSigned);

    }


    private void writeRomanceOnNewFile (Buffer item) {
        
        vertx.fileSystem()
            .writeFile("src/main/resources/RomanceSigned.txt", item)
            .subscribe()
                .with(it -> System.out.println("File Written!"));

    }


}

我的问题是:

  1. 前面的代码是连接两个异步操作(读文件-写文件)的正确方式吗?
  2. 如果我想返回RomanceSigned.txt文件而不是像代码那样返回Romance.txt,我必须对前面的代码进行什么样的更改?

推荐答案

(这里是叛变的维护者)

您应该让Quarkus为您执行订阅,并使用Mutiny编写异步操作.

我还没有测试过,但它应该是这样的:

@ApplicationScoped
public class ReactiveService {

  @Inject
  Vertx vertx;


  public Uni<Buffer> readFile() {

    String fileName = new String("src/main/resources/Romance.txt");

    Uni<Buffer> textReaded =
      vertx.fileSystem().readFile(fileName);

    return textReaded
      .onItem().transform(item -> modifyText(item))
      .onItem().transformToUni(buffer -> writeRomanceOnNewFile(buffer).replaceWith(buffer));
  }

  private Buffer modifyText(Buffer buffer) {
    byte[] byteText = buffer.getBytes();
    String stringText = new String(byteText);
    String upperCaseStringText = stringText.toUpperCase();
    String textModifiedAndSigned = upperCaseStringText.concat(" Hello World");
    return Buffer.buffer(textModifiedAndSigned);
  }

  private Uni<Void> writeRomanceOnNewFile(Buffer item) {
    return vertx
      .fileSystem()
      .writeFile("src/main/resources/RomanceSigned.txt", item);
  }
}

我假设您想要读取内容,写入另一个文件,但最终返回读取的内容.

希望这对😃有帮助

Java相关问答推荐

Gmail Javi API批量处理太多请求

Java在模块化jar文件中找不到类,但是javap可以

Cucumber TestNG Assert失败,出现java. lang. Numbercycle异常

即使我正在使用并发方法,使用Javascript的应用程序也会继续冻结'

如果一个子类没有构造函数,超类也没有构造函数,那么为什么我可以构造子类的实例呢?

在模拟超类中设置非setter属性的值

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

在springboot 3中,当我调用api endpoint时,会出现404

安装Java Jar应用程序的Install4j遇到ClassNotFoundException的运行时错误

无法使用ApacheSpark依赖项构建JavaFX应用程序

把一条整型短裤和两条短裤装成一条长的

使用OAuth 2.0资源服务器JWT时的授权(授权)问题

对字符串长度进行排序,但颠倒了顺序(最长字符串在前)

Java17支持哪个MapR版本?

如果按钮符合某些期望,如何修改它的文本?

Spring Boot&;Docker:无法执行目标org.springframework.boot:spring-boot-maven-plugin:3.2.0:build-image

带有可选部分的Java DateTimeForMatter

java 11上出现DateTimeParseException,但java 8上没有

java.util.LinkedList()是如何成为MutableList的实例的?

ChromeDriver 版本 117+ 强制另存为对话框 - 如何绕过? (selenium/Java)