gpt4 book ai didi

java - 如何简单地为 Storm Bolt/Spout 成员设置序列化程序?

转载 作者:行者123 更新时间:2023-11-30 11:12:22 25 4
gpt4 key购买 nike

我有一个 bolt ,它使用工厂接口(interface)来创建它使用的工具。它在调用 prepare 时创建这些工具。 Factory 实现只有基本成员(字符串、整数),默认情况下应该是可序列化的。

当我运行我的拓扑时,我得到一个 NotSerializableException,来自工厂实现。我想知道如何为工厂注册序列化程序。

举个例子:

public class Demo extends BaseRichBolt {

public static interface IExecutor
{
public void execute( Tuple tuple );
}

public static interface IExecutorCreator
{
public IExecutor create( Map map, TopologyContext tc, OutputCollector oc );
};

public static class DummyExecutor implements IExecutor
{
public void execute( Tuple tuple ) {}
};

public static class DummyExecutorCreator implements IExecutorCreator
{
String name_;
public DummyExecutorCreator(String name) { this.name_ = name;}
public IExecutor create(Map map, TopologyContext tc, OutputCollector oc) {
return new DummyExecutor();
}
};

public void declareOutputFields(OutputFieldsDeclarer ofd) {

}

private IExecutor executor_;
private IExecutorCreator creator_;

public Demo(IExecutorCreator creator)
{
this.creator_ = creator;
}

public void prepare(Map map, TopologyContext tc, OutputCollector oc) {
this.executor_ = this.creator_.create(map, tc, oc);
}

public void execute(Tuple tuple) {
this.executor_.execute(tuple);
}

}

当我尝试在拓扑中运行它时出现此错误:java.io.NotSerializableException:Demo$DummyExecutorCreator

作为旁注,我开始怀疑,为什么 Storm 不要求您注册工厂而不是 Bolts 和 Spouts。因为最终它们会被序列化并跨不同的线程复制,所以最好只给 storm 一个方法来生成这些 bolt 并分离关注点。

最佳答案

不要在构造函数中设置任何值。当驱动程序首次构建拓扑时以及将拓扑提交到集群之前调用构造函数。这就是为什么您设置的任何实例变量,无论是通过类初始化还是在构造函数中,都必须是可序列化的。

相反,只需将这些实例变量保留为 null 并在 prepare() 方法中设置它们。当您这样做时,您不需要序列化任何值,因此这也适用于不可序列化的实例变量。

关于java - 如何简单地为 Storm Bolt/Spout 成员设置序列化程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26931220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com