That actually works. I wonder if it's a common pattern for Storm Bolt to do
this? IMO, I like to inject things either from the method or constructor.

Thanks a lot.

On Wed, 31 Aug 2016 at 22:31 Zachary Smith <[email protected]> wrote:

> Can't you do something like this ala mockito:
>
> @InjectMocks private KinesisInsertBolt underTest = new KinesisInsertBolt();
>
> @Mock private AmazonKinesisClient amazonKinesisClient;
>
>
> On Wed, Aug 31, 2016 at 9:50 PM, Noppanit Charassinvichai <
> [email protected]> wrote:
>
>> 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
>>
>>
>>
>

Reply via email to