2014-07-03 16 views
6

Mam prototypową aplikację burzową, która odczytuje strumień STOMP i przechowuje dane wyjściowe na HBase. Działa, ale nie jest zbyt elastyczny i staram się go skonfigurować w bardziej spójny sposób z pozostałymi aplikacjami, ale nie mając wiele szczęścia, zastanawiając się, jak działa obecnie metoda Storm. Używamy klas spring-jms, ale zamiast używać ich w standardowy sposób wiosenny, są one tworzone w czasie wykonywania i ręcznie ustalane zależności.Integracja Storm and Spring 4

Ten projekt: https://github.com/granthenke/storm-spring wyglądał obiecująco, ale nie został dotknięty od kilku lat i nie buduje się prawidłowo, ponieważ słoiki zostały przeniesione do inkubatora apache i przepakowane.

Czy jest coś, czego mi brakuje, czy też nie jest to warte mojej chwili, aby zintegrować te rzeczy?

+2

Masz na myśli, że chcesz skonfigurować Storm z konfiguracją sprężynową do wylewek/śrub i właściwości? – zenbeni

+0

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

Odpowiedz

5

W rzeczywistości, burza-wiosna wydaje się być to, czego szukasz, ale to nie jest aktualizowany i mają ograniczenia (nie można zdefiniować zadania na śrubach/dziobki na przykład, etc). Może powinieneś wdrożyć własną integrację?

Nie zapomnij o celu: klastrze z wieloma pracownikami. Jak zachowuje się wiosna, kiedy wdrożysz swoją topologię za pomocą interfejsu burzowego (np. Przywrócisz równowagę) na jeszcze jednego pracownika? Czy oznacza to, że musi zainicjować nowy kontekst wiosenny na maszynie wirtualnej JVM podczas uruchamiania, zanim Storm rozmieści wybrane śruby/spapy i zdefiniuje executorów?

IMHO, jeśli zdefiniujesz tylko komponenty Storm w konfiguracji Spring, to powinno działać (konfiguracja startowa dla topologii to burza zarządza tylko obiektami), ale jeśli polegasz na Spring, aby zarządzać innymi komponentami (wydaje się to z spring-jms) , to może stać się niechlujny na przykład na przykład w rebalansie topologii (singleton per worker/jvm?) lub cała topologia?).

Do ciebie należy decyzja, czy warto się trudzić. Moja troska o konfigurację Springa polega na tym, że łatwo zapominasz o topologii burzowej (wydaje się, że jest to jedna JVM, ale może być o wiele więcej). Osobiście definiuję własne single na klasy-loader (na przykład statyczny finał lub z blokadą double-check, jeśli potrzebuję odroczonej instanciation), ponieważ nie ukrywa złożoności (średnio-wysokiej).

+0

Dobra uwaga. Akceptuję tę, a ja ponownie oceniam, w jaki sposób tworzymy aplikację. – liam

+0

@zenbeni Mam kilka klas warstwy usług, które muszą być wstrzykiwane w topologii burzowej. Nie mogłem ich normalnie stworzyć, ponieważ z kolei mają zależności, które mają być automatycznie inspirowane wiosną. Co mogę zrobić? – user12458

-1

Może ten samouczek może ci pomóc.

http://spring.io/guides/gs/messaging-stomp-websocket/

+0

To nie ma nic wspólnego z pytaniem, które zadałem, polegającym na integracji JMS z Storm w celu obliczenia. – liam

+0

Ok, przepraszam, rozumiem źle. Zobacz StompConnect. http://docs.codehaus.org/display/STOMP/StompConnect – Dani

1

Zdaję sobie sprawę, że jest to bardzo po fakcie, ale czy myślisz o użyciu wielbłąda Apache do obsługi połączenia JMS? Camel nie jest IOC ani DI, ale modeluje wzorce integracji przedsiębiorstwa. Może tego właśnie szukasz (czego?)?

Nick.

6

@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.

+0

Świetny komentarz. Właśnie to przechodzimy teraz. – markthegrea

+0

@markthegrea można dokonać inicjalizacji w metodzie przygotowywania, ponieważ metoda execute będzie uruchamiana za każdym razem, gdy pojawi się nowa krotka. – Ajeesh

+0

Tak, to właśnie odkryliśmy, ale doszliśmy do wniosku, że Spring jest po prostu niepoprawnym paradygmatem dla Boltsa. Te śruby można przenieść na wiele jvms i takie, a piękno wiosny to singletony. Po co więc używać Springa, gdy trzeba utworzyć 20 kopii obiektu. Musisz też zacząć od nowa w każdym przypadku, a to wymaga czasu. – markthegrea

Powiązane problemy