The injector is created inside the prepare method. On Tue, Oct 21, 2014 at 1:44 PM, Stephen Armstrong < [email protected]> wrote:
> I'm not understanding something here: > > If the bolt is pulling its dependencies from Guice inside it's prepare() > method, where does it get the injector? If it gets it from the constructor, > then the serialization issue still happens. If it gets it from a static > variable, then in the production environment, how does this static variable > get initialized on remote worker machines (since the normal topology > initialization code is only run on Nimbus). If the static variable is > initialized with static code, then how does the test code change it? > > On Tue, Oct 21, 2014 at 1:03 PM, John Reilly <[email protected]> wrote: > >> To avoid problems like this, I use a dependency injection system which is >> initialized in the prepare method of the bolts. In my case, I use macwire >> (in scala), but you should be able to use spring, guice or any other di >> system to achieve the same. >> >> Cheers, >> John >> >> On Tue, Oct 21, 2014 at 10:10 AM, Stephen Armstrong < >> [email protected]> wrote: >> >>> Hello all, >>> >>> I've got a few topologies running, and have unit tests for each >>> bolt/spout in isolation that mock out the edges of the tests (Tuples and >>> OutputCollectors), but I want to have a full integration test. I setup >>> local mode using the following function: >>> >>> public void runTopology(StormTopology topology, Config config, int >>> seconds) { >>> long end = System.currentTimeMillis() + (seconds * 1000); >>> LocalCluster cluster = new LocalCluster(); >>> cluster.submitTopology("Test topology", config, topology); >>> try { >>> while (System.currentTimeMillis() < end) { >>> Thread.sleep(10); >>> } >>> LOG.info("Finished run, exiting"); >>> } catch (InterruptedException e) { >>> fail("Interrupted", e); >>> } >>> cluster.killTopology("Test topology"); >>> try { >>> Thread.sleep(1000); >>> } catch (InterruptedException e) { >>> fail("Interrupted", e); >>> } >>> cluster.shutdown(); >>> } >>> >>> The problem arises from using EasyMock for dependencies injected into >>> the Bolts/Spouts, since this system serializes them. Is there a way to turn >>> off the serialization of the bolts for local mode, or does anyone have any >>> other advice? >>> >>> One obvious but really ugly hack is to store the EasyMock objects in >>> static variables, and have serializable proxy objects that simply pull the >>> mock from the static variable, but that sounds pretty hideous so I'd like >>> to avoid it. >>> >>> Thanks >>> Steve >>> >> >> >
