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

Spring Cloud-输入与输出

壤驷德宇
2023-03-14

从这个例子中:

@SpringBootApplication
@EnableBinding(MyProcessor.class)
public class MultipleOutputsServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(MultipleOutputsServiceApplication.class, args);
    }

    @Autowired
    private MyProcessor processor;

    @StreamListener(MyProcessor.INPUT)
    public void routeValues(Integer val) {
        if (val < 10) {
            processor.anOutput()
                .send(message(val));
        } else {
            processor.anotherOutput()
                .send(message(val));
        }
    }

    private static final <T> Message<T> message(T val) {
        return MessageBuilder.withPayload(val)
            .build();
    }
}

我的处理器接口:

public interface MyProcessor {
    String INPUT = "myInput";

    @Input
    SubscribableChannel myInput();

    @Output("myOutput")
    MessageChannel anOutput();

    @Output
    MessageChannel anotherOutput();
}

我的问题:

为什么 MultipleOutputsServiceApplication 类中的方法 routeValues 使用 MyProcessor.INPUT 而不是 MyProcessor.myOutput 进行注释(将此成员添加到 MyProcessor 接口后)?

在文档中,< code>INPUT用于获取数据,< code>OUTPUT用于发送数据。为什么这个例子是相反的,如果我把它反过来,什么都不工作?

共有1个答案

柳昊焱
2023-03-14

在我看来,那种方法是正确的。它不必用< code>@Output进行注释,因为您的方法没有返回类型,并且您是以编程方式将输出发送到方法中的任意目的地(通过两个不同的输出绑定)。因此,您需要确保您的输出正确绑定,就像您的程序通过< code > @ enable binding(my processor . class)正确绑定一样。您需要< code > @ StreamListener(my processor。INPUT)作为< code>MyProcessor。INPUT是StreamListener侦听的绑定。一旦通过该输入获得了数据,您的代码就会以编程方式接管向下游发送数据的工作。也就是说,有多种方法来处理这些类型的用例。你也可以这样做。

    @StreamListener
                public void routeValues(@Input("input")SubscribableChannel input, 
    @Output("mOutput") MessageChannel myOutput, 
    @Output("output")MessageChannel output {

        input.subscribe(new MessageHandler() {
                        @Override
                        public void handleMessage(Message<?> message) throws MessagingException {

        int val = (int) message.getPayload();

        if (val < 10) {
            myOutput.send(message(val));
        } 
        else {
            output.send(message(val));
       }
     }
}
 类似资料:
  • 每个进程操作系统都会分配三个文件资源,分别是标准输入(STDIN)、标准输出(STDOUT)和错误输出(STDERR)。通过这些输入流,我们能够轻易得从键盘获得数据,然后在显示器输出数据。 标准输入 来自管道(Pipe)的数据也是标准输入的一种,我们写了以下的实例来输出标注输入的数据。 package main import ( "fmt" "io/ioutil" "os" ) f

  • 有些时候你的程序会与用户产生交互。举个例子,你会希望获取用户的输入内容,并向用户打印出一些返回的结果。我们可以分别通过 input() 函数与 print 函数来实现这一需求。 对于输入,我们还可以使用 str (String,字符串)类的各种方法。例如,你可以使用 rjust 方法来获得一个右对齐到指定宽度的字符串。你可以查看 help(str) 来了解更多细节。 另一个常见的输入输出类型是处理

  • 输入与输出可以说是一个实用程序的最基本要求,没有输入输出的程序是没有什么卵用的。虽然输入输出被函数式编程语言鄙称为副作用,但正是这个副作用才赋予了程序实用性,君不见某著名函数式语言之父称他主导设计的函数式语言”is useless“。这章我们就来谈谈输入输出副作用。 读写 Trait 输入最基本的功能是读(Read),输出最基本的功能是写(Write)。标准库里面把怎么读和怎么写抽象出来归到了 R

  • 我们已经说明了 Haskell 是一个纯粹函数式语言。虽说在命令式语言中我们习惯给电脑执行一连串指令,在函数式语言中我们是用定义东西的方式进行。在 Haskell 中,一个函数不能改变状态,像是改变一个变量的内容。(当一个函数会改变状态,我们说这函数是有副作用的。)在 Haskell 中函数唯一可以做的事是根据我们给定的参数来算出结果。如果我们用同样的参数调用两次同一个函数,它会回传相同的结果。尽

  • 文件 std::fs::File 本身实现了 Read 和 Write trait,所以文件的输入输出非常简单,只要得到一个 File 类型实例就可以调用读写接口进行文件输入与输出操作了。而要得到 File 就得让操作系统打开(open)或新建(create)一个文件。还是拿例子来说明 use std::io; use std::io::prelude::*; use std::fs::File;

  • 回顾一下我们写的第一个 Rust 程序就是带副作用的,其副作用就是向标准输出(stdout),通常是终端或屏幕,输出了 Hello, World! 让屏幕上这几个字符的地方点亮起来。println! 宏是最常见的输出,用宏来做输出的还有 print!,两者都是向标准输出(stdout)输出,两者的区别也一眼就能看出。至于格式化输出,基础运算符和字符串格式化小节有详细说明,这里就不再啰嗦了。 更通用