Ich habe erfolgreich eine Guice-Bindungsannotation erstellt, um single-threaded java.util.concurrent.ExecutorService-Instanzen in einen Konstruktor zu injizieren.
Hier ist eine Beispielverwendung:
%Vor%Ich möchte jetzt eine ähnliche Annotation für Multithread-Executoren erstellen, die die ThreadPool-Größe in der Annotation angibt. Zum Beispiel:
%Vor%Weiß jemand da draußen, wie ich auf den Wert des Parameters "poolSize" von einem Guice Provider zugreifen kann?
Sie können nicht. Das ist nicht so, wie verbindliche Annotationen verwendet werden sollen ... der Parameter würde nur dazu dienen, eine ExecutorService
Grenze mit @MultiThreaded(poolSize = 5)
von einer Grenze mit @MultiThreaded(poolSize = 2)
zu differenzieren. Es sind keine Metadaten, die bei der Konfiguration von Provider
helfen.
Wenn Sie etwas mit @MultiThreaded(poolSize = 5)
annotieren, müssen Sie etwas mit der Anmerkung @MultiThreaded(poolSize = 5)
verknüpfen. Wenn Sie dann die Poolgröße an all diesen Stellen ändern möchten, müssen Sie poolSize = 5
in poolSize = 4
sowohl an den Stellen, an denen Sie es binden, als auch an allen Stellen, an denen Sie es injizieren, ändern. Das ergibt für mich keinen Sinn.
Anstatt ExecutorService
s zu binden, indem Sie angeben, wie viele Threads in ihrem Thread-Pool enthalten sind, sollten Sie sie entsprechend dem Zweck binden, für den Sie sie verwenden möchten. Dann können Sie die Anzahl der Threads anpassen, die jeweils an einer Stelle verwendet werden.
Sehen Sie sich NamedImpl
an, das @Named
und die Methode Names.named()
implementiert. Ich denke, Sie sollten dieselbe Implementierung haben.
AKTUALISIERT
Guice
vergleicht Annotationen mit hashCode (). Also, wenn Sie @MultiThreaded(poolSize = 5)
nicht verwenden, sollten Sie es vor dem Instancieren zuordnen. Es scheint eine dreckige Problemumgehung zu sein, aber du kannst smt wie
Wenn Sie dies tun möchten. Denken Sie daran, dass Ihr MultiThreadedImpl
korrekt hashCode
überschreiben sollte. Es könnte smt sein wie
Sie können so etwas mit Guice machen (ich habe es fast genau so gemacht), aber Guice muss wirklich wissen, was es bindet. Sie müssten also etwas tun wie:
%Vor%(oder wahrscheinlicher, binden Sie an einen Provider, der es langsam initialisiert).
Das ist hässlich genug, dass Sie es wahrscheinlich nicht wirklich wollen. Es ist nützlicher, einfach nur @Named zu verwenden und eine Handvoll ExecutorService-Instanzen zu haben, die an einen bestimmten Namen gebunden sind - dann können Sie konfigurieren, wie viele Threads an einem Ort verwendet werden, anstatt sich fragen zu müssen "benutzt jemand einen ExecutorService mit 73 Threads?"
Ja, Sie können. ohne Iterator alle Situationen.
Eigentlich habe ich fast das gleiche Problem wie du. Hier ist meine Antwort und meine Frage mit meinem ganzen Code. Ich weiß nur, wie man mit Feld nicht Parameter macht, aber ich denke, das ist kein großes Problem, oder?
Folgen Sie CustomInjections im Wiki, Sie werden es wissen.
Tags und Links java multithreading dependency-injection guice