Java-Parallelitätsmuster für externe freigegebene Ressourcen (Smartcards)

Ich habe einen Webserverdienst, bei dem Clients eine Smartcard-Berechnung anfordern und deren Ergebnis abrufen. Verfügbarsmartcard Anzahl kann sich verringern oder erhöhen Während der Server-Betriebszeit kann ich zum Beispiel die Smartcard physisch zum Lesegerät hinzufügen oder daraus entfernen (oder viele andere Ereignisse, wie Ausnahmen usw.).

Eine Smartcard-Berechnung kann eine Weile dauern, daher muss ich diese Jobs optimieren, um alle verfügbaren Smartcards zu verwenden, wenn gleichzeitig Anforderungen an den Webserver gesendet werden.

Ich dachte, mit einem Smartcard-Thread-Pool zu arbeiten. Zumindest für mich ist es ungewöhnlich, dass der Pool seine Größe nicht in Abhängigkeit von den Kundenanforderungen, sondern nur von der Verfügbarkeit der Smartcards ändert.

Ich habe viele Beispiele studiert für:

BlockingQueue: Es sieht gut aus, Anfragen zu speichern und das Warten auf eine Aufgabe zu beenden. FutureTask: Ich kann diese Klasse verwenden, um den Client auf die Antwort warten zu lassen, aber welche Art von Excecutor sollte die Aufgabe übernehmen? ThreadPoolExecutor: Scheint, was ich brauche, aber damit kann ich die Poolgröße nicht ändern, außerdem sollte jeder Thread mit einem einzelnen Smartcard-Steckplatz verknüpft sein. Dies kann eine Lösung sein, wenn ich die Poolgröße ändern könnte (Hinzufügen eines Threads beim Einsetzen einer Smartcard und Entfernen eines Threads beim Entfernen einer Smartcard) und jedem Thread eine bestimmte Smartcard zuweisen kann.

Dies ist die Smartcard-Steuerung. Ich habe einen SmartcardWrapper pro Smartcard. Jede Smartcard verfügt über eine eigene Steckplatznummer.

public class SmartcardWrapper{

    private int slot;

    public SmartcardWrapper(int slot) {
        this.slot=slot;
    }   

    public byte[] compute(byte[] input) {
        byte[] out=new byte[];
        SmartcardApi.computerInput(slot,input,out); //Native method
        return out;
    }
}

Ich habe versucht, einen Thread-Pool mit einem Thread pro Smartcard zu erstellen:

private class SmartcardThread extends Thread{

    protected SmartcardWrapper sw;

    public SmartcardThread(SmartcardWrapper sw){
        this.sw=sw;
    }

    @Override
    public void run() {
        while(true){
            byte[] input=queue.take();
            byte output=sw.compute(input);
            // I have to return back the output to the client
        }           
    }
}

Jeder, der auf etwas in derselben Eingabewarteschlange wartet:

BlockingQueue<byte[]> queue=new BlockingQueue<byte[]>();

Aber wie kann ich die Ausgabe vom Smartcard-Thread an den Webserver-Client zurücksenden? Das lässt mich denken, dass BlockingQueue nicht meine Lösung ist.

Wie gehe ich dieses Problem an? Welchem Nebenläufigkeitsmuster soll ich folgen? Ist es richtig, einen Thread pro Smartcard zuzuweisen, oder kann ich einfach Semaphoren verwenden?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage