Factory create methods are usually static, no? You should just store the string in your bolt and the make the factory create method a static call that takes the string as a parameter. On Nov 14, 2014 9:17 AM, "Arthur Andres" <[email protected]> wrote:
> Hi, > I've submitted a question on stackoverflow regarding the serialization of > members of bolts. > I wanted to bring it to the attention of the subscribers of this list: > > http://stackoverflow.com/questions/26931220/how-to-simply-set-up-a-serializer-for-storm-bolt-spout-members > > Thanks. > > PS: here's a copy of the question: > I have a bolt that uses a factory interface to create the tools it uses. > It creates those tools when `prepare` is called. The Factory implementation > only has basic members (strings, integers) that should be serializable by > default. > > When I run my topology I get a `NotSerializableException`, coming from the > factory implementation. I was wondering how I could register a serializer > for the factory. > > here's an example: > > 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); > } > > } > And I get this error when I try to run it in a topology: > `java.io.NotSerializableException: Demo$DummyExecutorCreator` > > As a side note I'm starting to wonder, why don't Storm have you to > register factories instead of Bolts and Spouts. since in the end they get > serialized and copied across the different threads, it'd be probably better > to just give storm a mean to generate those bolts and separate the concerns. > > >
