Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringCloudStreamKafka聚合使用AutowiredBean的新实例_Java_Spring Boot_Spring Cloud_Apache Kafka Streams_Spring Cloud Stream - Fatal编程技术网

Java SpringCloudStreamKafka聚合使用AutowiredBean的新实例

Java SpringCloudStreamKafka聚合使用AutowiredBean的新实例,java,spring-boot,spring-cloud,apache-kafka-streams,spring-cloud-stream,Java,Spring Boot,Spring Cloud,Apache Kafka Streams,Spring Cloud Stream,有没有办法在Kafka Streams聚合中使用Autowired bean的新实例 @EnableBinding(Processor.class) public class MessageReceiver { @StreamListener(target = Processor.INPUT) @SendTo(Processor.OUTPUT) public KStream<String, List<CustomEvent>> process(K

有没有办法在Kafka Streams聚合中使用Autowired bean的新实例

@EnableBinding(Processor.class)
public class MessageReceiver {

    @StreamListener(target = Processor.INPUT)
    @SendTo(Processor.OUTPUT)
    public KStream<String, List<CustomEvent>> process(KStream<String, Event> eventKStream) {

        JsonSerde<EventAggregator> eventAggregatorJsonSerde = new JsonSerde<>(EventAggregator.class);

        TimeWindowedKStream<String, Event> timeWindowedKStream = eventKStream
                .groupByKey()
                .windowedBy(TimeWindows.of(60000).advanceBy(30000));

        timeWindowedKStream
                .aggregate(
                        EventAggregator::new, // how to use Autowired bean here, which is different for different window and different key
                        ((key, value, aggregator) -> aggregator.add(value)),
                        Materialized.with(Serdes.String(), eventAggregatorJsonSerde)
                );

        // continues...
    }
@EnableBinding(Processor.class)
公共类消息接收器{
@StreamListener(目标=处理器.INPUT)
@发送到(处理器输出)
公共KStream进程(KStream事件KStream){
JsonSerde eventAggregatorJsonSerde=新的JsonSerde(EventAggregator.class);
TimeWindowedKStream TimeWindowedKStream=eventKStream
.groupByKey()
.windowedBy(TimeWindows.of(60000)。advanceBy(30000));
时间窗数据流
.合计(
EventAggregator::new,//如何在这里使用自动连线bean,对于不同的窗口和不同的键,这是不同的
((键、值、聚合器)->aggregator.add(值)),
具体化的.with(Serdes.String(),eventAggregatorJsonSerde)
);
//继续。。。
}
有没有一种方法可以使用Autowiredbean代替EventAggregator::new

EventAggregator.java

public class EventAggregator {

    //@Autowired
    //private SomeClass someClass; // this is null as of now, since spring can't autowire inside a non managed bean

    List<CustomEvent> customEventList = new ArrayList<>();  
    FIFOMap<String, Integer> map = new LinkedHashMap<>(4); // map which stores only 4 value

    public EventAggregator add(Event event) {   
        map.put(new Date().toString(), event.getValue());       
        generateCustomEvent(); // when I have 4 values, I need to do some operation and generate custom event
        return this;
    }

    private void generateCustomEvent() {
        if (map.size() == 4) {
            // someClass complex operation
            CustomEvent e = new CustomEvent("", "", "");
            customEventList.add(e);
        }
    }
}
公共类事件聚合器{
//@自动连线
//private SomeClass SomeClass;//由于spring无法在非托管bean中自动连接,因此现在该值为null
List customEventList=新建ArrayList();
FIFOMap=newlinkedhashmap(4);//只存储4个值的映射
公共事件聚合器添加(事件){
put(newdate().toString(),event.getValue());
generateCustomEvent();//当我有4个值时,我需要执行一些操作并生成自定义事件
归还这个;
}
私有void generateCostomEvent(){
if(map.size()==4){
//一类复杂运算
CustomEvent e=新的CustomEvent(“,”,“);
customEventList.add(e);
}
}
}

如注释所示,
EventAggregator::new
的实例化是由Kafka Streams触发的。如果您想访问此对象内的spring bean,一种方法是提供一个构造函数,该构造函数接受spring应用程序上下文,然后显式查询类内的bean(例如,使用
getBean()
)方法。您可以在主类中自动关联上下文,然后将其与
EventAggregator
构造函数一起传递。

嗨,将其用作自动关联bean的动机是什么?该实例化(
EventAggregator::new
)由基于新键/窗口等的Kafka流触发。如果您将其作为bean自动连接,Spring将作为单例bean管理。我不确定,在这种情况下,这是否是您想要的。@sobychako我需要在EventAggregator中自动连接几个字段。因为Spring无法在非托管bean中自动连接,所以我计划使用autowired aggregatoR