I'm writing a Bolt where a bolt will send data to Kinesis. The library is
AmazonClient. If I initialize AmazonClient outside of prepare() method I
will get this error
*16:53:32.561* [stderr]Exception in thread "main"
java.lang.RuntimeException: java.io.NotSerializableException:
com.amazonaws.services.kinesis.AmazonKinesisClient*16:53:32.561*
[stderr] at
backtype.storm.utils.Utils.javaSerialize(Utils.java:109)*16:53:32.561*
[stderr] at
backtype.storm.topology.TopologyBuilder.createTopology(TopologyBuilder.java:107)*16:53:32.561*
[stderr] at
io.conde.data.SparrowFirehoseTopology.main(SparrowFirehoseTopology.java:93)*16:53:32.561*
[stderr]Caused by: java.io.NotSerializableException:
com.amazonaws.services.kinesis.AmazonKinesisClient*16:53:32.561*
[stderr] at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)*16:53:32.561*
[stderr] at
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)*16:53:32.562*
[stderr] at
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)*16:53:32.562*
[stderr] at
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)*16:53:32.562*
[stderr] at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)*16:53:32.562*
[stderr] at
java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)*16:53:32.562*
[stderr] at backtype.storm.utils.Utils.javaSerialize(Utils.java:105)
So I have to do it like this to not get the Exception
@Override
public void prepare(Map map, TopologyContext topologyContext,
OutputCollector outputCollector) {
this.amazonKinesisClient = new AmazonKinesisClient(new
CustomCredentialsProviderChain(), new ClientConfiguration());
this.random = new Random();
this.outputCollector = outputCollector;
this.decoder = Charset.forName("UTF-8").newDecoder();
}
But then I won't be able to inject that and unit test that properly. How do
I overcome this? I'm using Storm 0.10