我问了这个,但没有人指示我正确答案。发布它以便对某人有用:
Spout 和 Bolts 无法解析依赖关系,因为它们是由 ToplogyBuilder 创建为新对象
例如:
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("rabbitMqSpout", new RabbitListnerSpout(), 1);
builder.setBolt("mapBolt", new GroupingBolt(), 1).shuffleGrouping("rabbitMqSpout");
builder.setBolt("reduceBolt", new PublishingBolt(), 1).shuffleGrouping("mapBolt");
使用 new 创建它们的那一刻,它们就超出了 Spring 的 Context 范围。可以通过发送 applicationContext 作为构造函数来解决这个问题。
所以你可以把它当作 ,
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("rabbitMqSpout", new RabbitListnerSpout(appContext), 1);
builder.setBolt("mapBolt", new GroupingBolt(appContext), 1).shuffleGrouping("rabbitMqSpout");
builder.setBolt("reduceBolt", new PublishingBolt(appContext), 1).shuffleGrouping("mapBolt");
这种方式可用于 spouts 和 bolts 。所以当你启动你的集群时,它们仍然可用。
P.S-> 我只在 LocalCluster 上测试过。
更新,以上内容不适用于远程集群,因为 appContext 无法序列化。为了使 spring 在远程 Cluster 上工作,必须在 Spouts 和 Bolts 的 open 和 prepare 方法中定义和初始化 Context。