我有一个风暴拓扑,其中一个螺栓应该与ElasticSearch交互。
public static Client client;
public static Settings settings;
public SomeBolt(){
settings =
ImmutableSettings.settingsBuilder().put("cluster.name", "elasticsearch").build();
client = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress("someip", 9300));
}
在本地模式下运行拓扑时效果很好,但是当我尝试在集群模式下运行拓扑时,该客户端获取空值并且无法执行下一步。
我甚至尝试在本地模式的管理员机器中运行它,它可以工作。只有在群集模式下才能获得TransportClient。
有可能的原因吗?
答案 0 :(得分:0)
你必须记住所有的喷口和螺栓都必须是可序列化的,因为它们(可能)会在它们的构造和启动之间绕网移动。
因此,在构造函数中,您不能(例如)打开任何网络连接(例如在您的情况下创建ES客户端)。 您必须在螺栓的准备方法上执行此操作。
此外,我建议您将客户端声明为瞬态(而非静态)。