Ich versuche herauszufinden, wie ich ein vernünftig skalierbares Stapelverarbeitungssystem für eine Webanwendung entwickeln kann, die ich gerade schreibe.
Ich verwende Spring MVC für die Webanwendung mit einer benutzerdefinierten DAO-Ebene (um auf die Datenbank zuzugreifen, muss eine UnitOfWork -Instanz aus einer UnitOfWorkFactory erstellt werden, die gesetzt ist als @Autowired und zur Laufzeit von Spring injiziert).
Ich verwende die Spring Scheduler-Annotationen (@Scheduled), um Aufgaben zu planen. Ich möchte jedoch, dass diese Aufgaben auf verschiedenen Computern in meinem Cluster ausgeführt werden. Jeder Stapeljob sollte von einem der Cluster-Computer abgeholt und dann ausgeführt werden.
Hazelcast schien dafür wie eine natürliche Lösung zu sein, denn die Verteilte Ausführung Design erschien zu diesem Zweck wirklich einfach und elegant.
Ich stoße auf ein Problem, das von der Dokumentation nicht abgedeckt scheint. Ich habe die Dokumentation über Spring Integration gelesen, dies scheint jedoch darauf ausgerichtet zu sein, Hazelcast mit Spring zu konfigurieren (was ich schon getan habe).
Wenn der Scheduler angibt, dass die Aufgabe starten soll, möchte ich eine neue Instanz der Aufgabe (eine Callable -Instanz) erstellen und sie an den DistributedExecutor senden. Wenn ein Clustercomputer die auszuführende Task empfängt, muss der Spring-Container auf dem Clustercomputer die UnitOfWorkFactory -Instanz in die Batch-Task injizieren, bevor die Task versucht, sie auszuführen. Jeder der Cluster beginnt mit Spring und die UnitOfWorkFactory wird bereits mit den korrekten Details instanziiert. Das Problem besteht darin, die UnitOfWorkFactory Instanz in meine Aufgabe einzufügen.
Weiß jemand, wie ich meine Anwendung so konfigurieren kann, dass Hazelcast automatisch die UnitOfWorkFactory injizieren kann, wenn ein Callable gestartet wird? Ich habe versucht, das Callable als Serializable und ApplicationContextAware zu markieren, aber ich bekomme immer noch NullPointerException , wenn ich versuche, den Task auszuführen.
Ich könnte direkt auf den ApplicationContext zugreifen, würde dies jedoch nicht tun, da dies die Testbarkeit meiner Aufgaben einschränken und eine harte Abhängigkeit von Spring für meine Batch-Jobs einführen würde.
Nach Version 2.1 kann Hazelcast Spring-Kontext und / oder Spring-Beans in Hazelcast-verwaltete Objekte einfügen.
Wenn Sie Hazelcast mit der Hazelcast Spring-Konfiguration konfigurieren und eine Bean mit @SpringAware
kommentieren, fordert Hazelcast Spring auf, Abhängigkeiten dieser Bean zu injizieren.
Für ältere Versionen als 2.1:
Versionen vor 2.1 von Hazelcast sind nicht Spring-bewusst, daher ist es nicht möglich, Spring-Kontext oder eine Spring-Bean in ein Hazelcast-verwaltetes Objekt für Pre-2.1-Versionen zu injizieren.
Es gibt einen Post, der nach dieser Funktion in der Hazelcast-Gruppe fragt.
Hazelcast / Dependency-Injektion für Callable
Wie Sie vielleicht bereits in der Hazelcast-Gruppe wissen und vorgeschlagen haben, können Sie auf Spring ApplicationContext zugreifen, indem Sie;
%Vor%Tags und Links spring quartz-scheduler hazelcast