Question

(x-posté à Guice liste de diffusion)

Je Guice sur une expérimentation nouvelle bibliothèque qui vivent dans une application existante. Toutes nos applications sont actuellement des applications de printemps et nous avons un code commun qui est lié au printemps, principalement à voir avec le modèle de fil, nous avons tendance à utiliser. Il nous donne essentiellement (ce qui pourrait être considéré comme) un fil logique.

Nous pouvons jeter emplois à et il assure que les emplois avec une clé donnée finissent toujours sur le même tuyau dans l'ordre qu'ils ont été soumises. Typiquement, cela est un seul fil pour la vie de l'application, mais si mauvaises choses se produisent alors le thread de travail (qui soutient le tuyau) est jeté, le tuyau désactivé, un nouveau travailleur créé et la conduite réactivée à ce travailleur. Tout le câblage est fourni ici au printemps.

Mes nouveaux besoins lib de l'utiliser pour le modèle de fil et je prévois sur l'utilisation de Guice pour le côté logique et domaine des choses, à savoir la construction du travail qui va sur le pipeline et la logique et qu'elle représente. Cela me semble assez simple à l'exception d'une chose qui semble tout à fait noueux, à savoir que je veux injecter certaines choses avec « pipe » (fil aka logique) portée. J'ai lu les champs personnalisés (et mise en œuvre SimpleScope) page wiki mais certaines choses ne sont pas claires pour moi et des éclaircissements serait très apprécié ...

  1. pipes à survivre à la vie de la machine virtuelle Java il semble donc que je dois entrer dans un champ mais jamais sortie, des inconvénients à cela?
  2. quelles sont mes options pour déclencher l'entrée de portée dans un ressort bean géré? est-ce juste un cas de créer le contexte du printemps puis en utilisant la SpringIntegration pour aspirer les grains de printemps dans un contexte de Guice?
  3. Est-ce son vraiment squameuse et je devrais l'envelopper avec un singleton par calée mon id tube à la place?

Vive Matt

Était-ce utile?

La solution

J'ai mis en place quelque chose qui fonctionne, mais implique une configuration un peu moche ... toujours intéressé par des améliorations sur ce et il peut y avoir un peu trop de code pour poster vraiment si il suffit de mettre quelques extraits en qui illumine, espérons

c'est une variante de l'exemple SimpleScope qui implique;

  • élever le ressort ctx
  • saisir un grain spécifique sur ce (qui est un registre des clés de pipeline)
  • passant que le module Guice avec le BeanFactory
  • donnant ce registre aux impl Champ d'application de sorte que le champ d'application est entré lorsque le tuyau est activé (ce qui arrive plus tard lorsque certains grains de ressort sont init'ed)

Il semble que je dois saisir le grain spécifique plutôt que d'y accéder par named après avoir fait une bindAll sur le BeanFactory comme l'instance Scope vous est new'ed dans le module, i.e..

    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);

Le fait que je dois nouveau cela signifie que je dois fournir explicitement le registre au module, ne peut pas voir un moyen de contourner cela comme il est de la poule et l'œuf.

Le PipeScope stocke essentiellement des valeurs contre la clé de la conduite (en fait une liste des clés), par opposition à un ThreadLocal donc mon entrer est comme

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());
}

dans l'ensemble semble fonctionner parfaitement ... au moins dans mon frappé rapidement harnais de test de toute façon

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top