Frage : Austausch 2010 - CAS/HT/MBX mit hoher Verwendbarkeit

Hallo dort, haben

I zwei Bediener mit Austausch 2010 auf Gewinn 2k8 R2. Diese Bediener haben CAS/HT/MBX und DAG, die zusammengebaut werden. Meine Frage ist… Wie ich eine hohe Verwendbarkeit von diesen Bediener herstellen kann, also ich nur eine Adresse für den Bediener 2 haben kann, und wenn man ausfällt, der andere nimmt an. Ich werde NICHT um Lasts-Balance gesorgt, benötige ich gerade HA.

NLB könnte eine Weise sein, aber es ist unmöglich, NLB auf Bediener mit DAG zusammenzubauen, und ich kann keine 3. Partei NLB products.

Does benutzen, das jedermann mir helfen kann?

Thanks

Antwort : Austausch 2010 - CAS/HT/MBX mit hoher Verwendbarkeit

Erste Sache, die ich mich empfehlen würde, verschiebt Ihren Vollstreckerservice außerhalb der Schleife.  Sie müssen wirklich nur das einmal verursachen.  Abhängig von Ihrer Implementierung können Sie in der Lage sein, es eine Kategorienvariable, irgendeine zu bilden ein Static, der durch alle Fälle dieser Kategorie oder des privaten Mitgliedes geteilt wird, wenn jede Kategorie seine eigene Gewindelache benötigt.  Jede Weise, solange Sie nicht den Service unten schließen, sind Sie in der Lage, jene Gewinde wiederzuverwenden, anstatt, auf die Unkosten von sie jedes Mal beginnen sich zu nehmen.  Wenn mehrfache Anrufe zu dieser Methode gleichzeitig laufen müssen, die Vollstreckerservice-Kreation zurück in die Methode, aber außerhalb der Schleife verschieben.

Sie sieht auch wie Sie herstellt 10 Gewindelachen, mit 10 Gewinden jedes, um jeden Auftrag zu verarbeiten aus.  Code, den ich angebracht habe, wird überarbeitet, um alle zu verarbeiten versah Aufträge mit 10 Gewinden.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
6:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
allgemeine Kategorie ClearDownService {
    private int-Gewinde;
    privates ExecutorService executorService;

    allgemeines ClearDownService (int-Gewinde) {
        wenn (Gewinde < 1="">= 1. „);
        }
        this.threads = Gewinde;
        this.executorService = Executors.newFixedThreadPool (this.threads);
    }

    // I änderte Ihren Wiederholungcode, um anzunehmen, dass Sie irgendeine Ansammlung OrderModel Gegenstände haben
    //, dass Sie pflegen, um das iterator zu erhalten.  Da Sie JDK 1.5+ benutzen, sein viel mehr
    // lesbar und haltbar Generics benutzen, anstatt, die Rückkehr von iterator.next zu werfen ().
    // I änderte auch Ihren Wiederholungcode, um das eingebaute foreach Konstruieren zu benutzen.
    Öffentlichkeit leere checkOrders ( Abholaufträge) {
        // initialisieren Verriegelung für die Gesamtzahl Aufträgen, anstelle von den Gewinden.
        //, das dieses sicherstellt, dass alle Aufträge verarbeitet werden, bevor diese Methode abschließt
        abschließendes CountDownLatch startLatch = neues CountDownLatch (orders.size ());

        //, da Sie JDK 1.5+ benutzen, einfacher, zu lesen und beizubehalten, wenn Sie Generics benutzen
        // und das eingebaute foreach anstelle vom iterator
        für (abschließendes OrderModel Modell: Aufträge) {
            executorService.submit (neues jagdbares () {
                Öffentlichkeitslücke laufen gelassen () {
                    Versuch {
                        Kalender jetzt = Calendar.getInstance (TimeZone.getTimeZone („Europa/London“));
                        wenn (isEligibleForClearDown (Modell, master.getCleardownFields () .getClearDownReqFrom (), jetzt)) {
                            wenn (model.getOrderFields () .hasParentOrderId ()) {
                                // fügen alle Kindaufträge Endergebnis hinzu
                                results.add (Modell);
                            } sonst {
                                // fügen Elternteilaufträge der Elternteilliste hinzu
                                parentOrders.add (Modell);
                            }
                        }
                    } schließlich {
                        //, das dieses in einen schließlich Block einsetzt, stellt sicher, dass er gedankenlos benannt erhält
                        // irgendwelcher Ausnahmen, die im Körper der Methode auftreten
                        startLatch.countDown ();
                    }
                }
            });
        }
        Versuch {
            startLatch.await (); //-Wartezeit für alle Gegenstände zur kompletten Verarbeitung
        } Fang (InterruptedException e) {
            LOGGER.error („unterbrochene Ausnahme bei der Aufwartung der Count-downverriegelung bis end.");
        }
    }
}
Weitere Lösungen  
 
programming4us programming4us