Java SpringCloudStreamKafka聚合使用AutowiredBean的新实例
有没有办法在Kafka Streams聚合中使用Autowired bean的新实例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
@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