Frage

(x-posted Mailingliste Guice)

Ich bin Erprobung Guice auf eine neue Bibliothek, die in einer bestehenden Anwendung lebt. Alle unsere Apps direkt sind jetzt Frühling Apps und wir haben einige gemeinsame Code, der Feder verbunden ist, vor allem mit dem Thread-Modell zu tun, wir verwenden neigen. Es im Grunde gibt uns ein (was, wie zu sehen ist) logischer Thread.

So können wir Arbeitsplätze an ihn werfen und es wird sichergestellt, dass Jobs mit einem bestimmten Schlüssel immer auf dem gleiche Rohr in der Reihenfolge am Ende, dass sie eingereicht wurden. Normalerweise ist dies ein einzelner Thread für die Lebensdauer der Anwendung, aber wenn schlimme Dinge passieren dann den Arbeitsthread (dass das Rohr sichert) weggeworfen wird, deaktiviert das Rohr, erstellt einen neuen Arbeiter und das Rohr auf dem Arbeitnehmer reaktiviert. Die ganze Verdrahtung hier wird durch die Feder zur Verfügung gestellt.

Meine neue lib braucht dies für die Thread-Modell zu verwenden, und ich plane guice für die Logik & Domain-Seite der Dinge über die Verwendung, das heißt den Aufbau der Arbeit, die auf die Pipeline geht & und die Logik, die es darstellt. Das scheint ganz einfach zu mir, außer für eine Sache, die scheint ganz knorriger, nämlich, dass ich bestimmte Dinge mit „pipe“ (auch bekannt als logischem Thread) Umfang injizieren will. Ich habe die benutzerdefinierten Bereiche (und SimpleScope Implementierung) Wiki-Seite lesen, aber einige Dinge sind mir nicht klar, und Klärung wäre sehr willkommen ...

  1. Rohre für das Leben der JVM überleben daher scheint es, dass ich brauche einen Rahmen zu geben, aber nie Ausgang, irgendwelche Nachteile zu diesem?
  2. Welche Möglichkeiten habe ich für die Auslösung verwaltet Umfang Eintrag in einer Feder Bohne? nur ein Fall die Feder Rahmen schafft, ist es und dann die SpringIntegration mit in der Feder Bohnen in einen guice Kontext saugen?
  3. klingt das wirklich flockige und ich sollte es nur mit einem Singleton durch meine Pfeife ID statt verkeilt wickeln?

Prost Matt

War es hilfreich?

Lösung

Ich habe etwas implementiert, die funktioniert, aber beinhaltet einige leicht hässliche Einrichtung ... noch an irgendwelchen Verbesserungen auf diese und es kann ein bisschen zu viel Code sein wirklich zu schreiben, um nur ein paar Schnipsel setzen, dass hoffentlich

es ist ein eine Variante des SimpleScope Beispiel, das beinhaltet;

  • die Feder Erziehung ctx
  • eine bestimmte Bohne aus ihm greifen (das ist eine Registrierung von Pipeline-Tasten)
  • vorbei, dass an dem Guice Modul zusammen mit dem BeanFactory
  • , die Registrierung auf den Umfang impl gibt so den Umfang wird eingegeben, wenn die Leitung aktiviert ist (was später geschieht, wenn gewisse Feder Bohnen werden init'ed)

Es scheint, dass ich die spezifische Bohne zu greifen haben, anstatt Zugriff es durch ein Benannt nach auf dem BeanFactory ein bindAll tun wie die Scope-Instanz wird sich in dem Modul new'ed, d.

    PipeScope<SecurityId> pipeScope = new PipeScope<SecurityId>();
    pipeScope.setPipeIdRegistry(pipeIdRegistry);
    bindScope(Pipe.class, pipeScope);
    bind(PipeScope.class)
            .annotatedWith(Names.named("pipeScope"))
            .toInstance(pipeScope);
    SpringIntegration.bindAll(binder(), beanFactory);

Die Tatsache, dass ich auf neues habe es bedeutet, ich brauche die Registrierung an das Modul explizit zu schaffen, kann nicht einen Weg, um dies zu sehen, wie es ein Huhn & Ei-Situation ist.

Die PipeScope speichern grundsätzlich Werte gegen die Rohrschlüssel (eigentlich eine Liste von Schlüsseln) in Bezug auf einen Threadgegenüber, so meine Eingabe ist wie

public void enter(List<K> scopedKeys) {
    checkState(values.get(scopedKeys) == null, "A scoping block is already in progress");
    values.put(scopedKeys, Maps.<Key<?>, Object>newHashMap());
}

Alles in allem scheint sehr gut zu funktionieren ... zumindest in meinem schnell sowieso Prüfkabelbaum oben geklopft

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top