我正在使用Kinesis Client Library(KCL)和Spring启动。要使用KCL,我必须为接口RecordProcessor
实现一个类(我将其命名为IRecordProcessor
)。 KCL将调用此类并处理运动学中的记录。但是当我尝试使用依赖注入时,发现它没有成功。
以下是RecordProcessor
的摘要:
@Component
public class RecordProcessor implements IRecordProcessor {
@Autowired
private SingleRecordProcessor singleRecordProcessor;
@Override
public void initialize(String shardId) {
...
}
@Override
public void processRecords(List<Record> records, IRecordProcessorCheckpointer checkpointer) {
...
}
}
我使用Class SingleRecordProcessor
处理运动学中的每个记录。这是我的SingleRecordProcessor
类片段:
@Component
public class SingleRecordProcessor {
private Parser parser;
private Map<String, Table> tables;
public SingleRecordProcessor() {
}
@Autowired
private void setParser(Parser parser) {
this.parser = parser;
}
@Autowired
private void setTables(Map<String, Table> tables) {
this.tables = tables;
}
public void process(String record) {
...
}
}
我想让spring框架自动将SingleRecordProcessor
实例注入类并使用它。但是我发现字段singleRecordProcessor
为空。
有人知道为什么依赖项注入失败吗?还是不可能将依赖项注入其他框架(在本例中为KCL)调用的类中?任何建议将不胜感激!真的需要一些帮助!
[更新]:
很抱歉,您并未明确表达错误。错误为NullPointerException
。我试图注入singleRecordProcessor
并在其上调用方法process()
。我认为注入未成功,因此实例singleRecordProcessor
为null,并且出现了NullPointerException。
更多信息如下:
我有一个名为Application
@SpringBootApplication
public class Application{
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.addListeners(new ApplicationPidFileWriter("./app.pid"));
ConfigurableApplicationContext ctx = application.run(args);
}
}
我有MainProcessor
类,它将称为KCL。
@Service
public final class MainProcessor {
@EventListener(ApplicationReadyEvent.class)
public static void startConsumer() throws Exception {
init();
IRecordProcessorFactory recordProcessorFactory = new RecordProcessorFactory();
Worker worker = new Worker(recordProcessorFactory, kinesisClientLibConfiguration);
...
worker.run(); // this line will call KCL library and eventually call ProcessorRecord class.
}
}
[ UPDATE2 ]
RecordProcessorFactory
只有一种这样的方法
@Component
public class RecordProcessorFactory implements IRecordProcessorFactory {
@Autowired
RecordProcessor recordProcessor;
@Override
public IRecordProcessor createProcessor() {
return recordProcessor;
}
}
它将为KCL创建一个新的RecordProcessor
实例以供使用。
答案 0 :(得分:0)
您应将此实例自动连接到MainProcessor中:
@Component
public class RecordProcessorFactory {
@Lookup IRecordProcessor createProcessor() { return null; }
}
Spring将为您实例化一个RecordProcessorFactory,并用其中的createProcessor()实现替换,该实现将在每次调用时返回一个新的IRecordProcessor。工厂和处理器都将是Spring bean-这就是您想要的。