@zenbeni odpowiedział na to pytanie, ale chcę opowiedzieć o mojej implementacji, trudno jest zrobić wylewki/śruby jak fasolka szparagowa. Ale aby użyć innych wiosennych ziaren w twoich wylewkach/śrubach, możesz zadeklarować zmienną globalną & w swojej metodzie sprawdzania metody execute, która ma wartość null lub nie. Jeśli jest pusta, musisz pobrać komponent bean z kontekstu aplikacji. Utwórz klasę, która zawiera metodę inicjowania komponentów bean, jeśli nie została jeszcze zainicjowana. Przejrzyj interfejs ApplicationContextAware, aby uzyskać więcej informacji (ponowne użycie Spring bean).
Przykład Kod:
Bolt Klasa:
public class Class1 implements IRichBolt{
Class2 class2Object;
public void prepare() {
if (class2Object== null) {
class2Object= (Class2) Util
.initializeContext("class2");
}
}
}
Util Klasa dla inicjowania Fasola jeśli nie zainicjowany już:
public class Util{
public static Object initializeContext(String beanName) {
Object bean = null;
try {
synchronized (Util.class) {
if (ApplicationContextUtil.getAppContext() == null) {
ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
bean = ApplicationContextUtil.getAppContext().getBean(
beanName);
} else {
bean = ApplicationContextUtil.getAppContext().getBean(
beanName);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
}
Listener dla Application Context zmian:
@Component
public class ApplicationContextUtil implements ApplicationContextAware {
private static ApplicationContext appContext;
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
appContext = applicationContext;
}
public static ApplicationContext getAppContext() {
return appContext;
}
}
Uwaga: Każdy pracownik będzie inicjował kontekst wiosenny, ponieważ działa w innej maszynie JVM.
UPDATE
Jeśli chcesz użyć klasy sprężyna fasoli, w którym masz jakieś wartości uprzednio przypisanych spróbować,
Uwaga: Podanie aktualną klasę konstruktora bolt
Class (Klasa tworzenia topologii), która już zawiera wartości:
public class StormTopologyClass implements ITopologyBuilder, Serializable {
public Map<String, String> attributes = new HashMap<String, String>();
TopologyBuilder builder=new TopologyBuilder();
builder.setBolt("Class1",new Class1(this));
builder.createTopology();
}
Bolt by US ing konstruktora jeden argument:
public class Class1 implements IRichBolt{
StormTopologyClass topology;
public Class1 (StormTopologyClass topology) {
this.topology = topology;
}
}
Teraz można użyć atrybutów zmienna & to wartości w klasie śruby.
Masz na myśli, że chcesz skonfigurować Storm z konfiguracją sprężynową do wylewek/śrub i właściwości? – zenbeni
Dokładnie. Używamy spring-jms i innych rzeczy, a wzorzec budowniczego, którego używa burza, i użycie wzoru IOC są nieco sprzeczne. Nie przeszkadza mi to w trafieniu, które wprowadzi dodatkowy XML, jeśli utrzyma zgodność naszego kodu z resztą naszych projektów java. – liam