WebHU - Programozási kérdések és válaszok

Az Executor használata az új Thread for Server socket kliensek helyett

Jelenleg egy szervert írok, amelyhez több kliens fog csatlakozni. A kommunikációs protokoll alapvetően abból áll, hogy a szerver küld egy feladatot a klienseknek, és a kliensek válaszolnak a feladat végrehajtására. Az ügyfelek továbbra is kapcsolatban maradnak a szerverrel, és soha nem szakíthatják meg a kapcsolatot.

Jelenleg egy új szálat indítok az egyes ügyfelek kezelésére. Lélekben a jelenlegi megoldásom a következő: (forrás: Java párhuzamosság a gyakorlatban)

public class ThreadPerTaskWebServer {
    public static void main(String[] args) throws IOException {
        ServerSocket socket = new ServerSocket(80);
        while (true) {
            final Socket connection = socket.accept();
            Runnable task = new Runnable() {
                public void run() {
                    handleRequest(connection);
                }
            };
            new Thread(task).start();
        }
    }

    private static void handleRequest(Socket connection) {
        // request-handling logic here
    }
}

De szeretném az Executorokat használni, mert stabilabbnak és jobban skálázhatónak tűnnek. Tehát ahhoz, hogy a szerver tudjon üzeneteket küldeni a klienseknek, külön kell nyomon követnem a klienseket az őket futtató végrehajtótól. Tehát ha hova helyezhetem el az ügyfeleket a CopyOnWriteArrayList kliensekben, és van valami ilyesmi a Server osztályban:

Socket clientSocket = serverSocket.accept();
// The runnable that takes care of a client 
ClientHandler c = new ClientHandler(clientSocket, this);
// Start executing the ClientHandler
exec.execute(c);
// Add clients to CopyOnWriteArrayList
clients.add(c);

Ez lehetővé tenné, hogy a CopyOnWriteArrayList-en át ismételjem, hogy parancsokat küldjek az összes kliensnek, és eltávolítsam a leválasztottakat is. Ez robusztus megoldás lenne? Mi történne a végrehajtóval, ha egy futtatható valamilyen okból kivételt hirdetne rá?


  • Összekevered a klienseket és a szervereket. Az Ön esetében az ügyfelek szerverek és fordítva. 05.04.2012
  • @ahanin Egyetértek, hogy nem teljesen világos, de szerintem ez a leghelyesebb leírás. Mivel a kliensek csatlakoznak a szerverhez (és rajta van a ServerSocket), definíció szerint a szerver lesz :) 05.04.2012
  • Nem vagyok összezavarodva, teljesen értettem mi a szándék, csak arra akartam utalni, hogy a @Teletha keveri a fogalmakat. A leírt esetben a kliensek olyan dolgozó ügynökök, amelyek kiszolgálják a kiszolgáló feladatvégrehajtási kérelmét. 05.04.2012
  • Igazad van @ahanin. Átfutottam az első bekezdést. Sajnálom. 06.04.2012

Válaszok:


1

Ez robusztus megoldás lenne?

Szerintem igen. Győződjön meg arról, hogy vagy megfelelő számú szálat oszt ki a rögzített méretű készletben, vagy dinamikus készletet használ.

Mi történne a végrehajtóval, ha egy futtatható valamilyen okból kivételt hirdetne rá?

Ha a kód egy RuntimeException értéket ad, akkor a kódot végrehajtó végrehajtó pool szál leáll, de a készlet szálak száma csökken, és egy másik szál jön létre, ha a szolgáltatás még nem lett leállítva. Tehát a szálkészlet továbbra is megfelelően fog működni.

Ez lehetővé tenné, hogy a CopyOnWriteArrayList-en át ismételjem, hogy parancsokat küldhessek az összes kliensnek, és eltávolítsam a leválasztottakat is.

Nem kell eltávolítania a leválasztottakat, hacsak nem menti el a hivatkozást rájuk. Különben nem igazán tudok hozzászólni ehhez a követelményhez.

05.04.2012

2

Ha csatlakozási megközelítésenként választja a szálat, és nem akarja használni a NIO api-t, akkor ez egy jó megoldás. De ne feledje, hogy ha a készlet mérete kisebb, mint az egyidejű kérések száma, akkor a korábbi kérések végéig függőben lévő ügyfelek vannak.

Arról, hogy mi történik, ha kivételt kap a feladatban: a szál leáll, de a végrehajtó más szálakat hoz létre.

05.04.2012
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..