IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Přenos informací z background vlánka k uživateli.

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Šimon Lakosil:6.8.2020 11:03

Ahojte, chtěl bych se zeptat, jaký bych měl zvolit postup při přenosu informace z vlákna v pozadí k uživateli.
Mám napsané Rest API ve springu a frontend je k němu napsaný v angularu. Kód je trochu rosváhlý, proto používám mikroservices.
V jednu chvíli mám můžu dostat od uživate získat třeba 10 obrázků, které pak převádím do jpg formátu pro zobrazení na webu. Tyto obrázky se předají do channelu, kde je pak postupně zpracovává následující metoda:

@Override
@Async("multiUploadExecutor")
public void processAsync(MultipartFile upload, FileUploadMetadata fileUploadMetadata, boolean convert) {
    try {
        this.fileService.storeImage(upload, fileUploadMetadata, convert);
    } catch (Exception e) {
        // TODO: create notifications to user
        log.error("Error ...", e);
    }
}

Teď si nejsem úplně jistý, jak by bylo nejlepší přenášet informaci z tohohle background vlákna zpět na frontend.
Napadli mě dvě věci:

  1. Udělám nějakou tabulku v db, kam budu ukládat informace určené k přenosu na FE, dále v angularu udělám interval, který se mi každých x sekund doptá přes endpoint na tyto informace. (tento interval by byl aktivní jen nezbytnou dobu)
  2. Vytvořím kompletně novou mikroslužbu, která bude mít endpointy pro rpc a websockety. Přes rpc budu ze springu posílat data, která se pošlou prohlížeči, který bude připojený websocketem k této službě.

Řeším takovou věc úplně poprvé a nerad bych udělal nějaký technický dluh, který bych musel pak dlouho platit :)
Za každou pomoc s návrhem problému děkuji.

Zkusil jsem: viz. výše

Chci docílit: viz. výše

 
Odpovědět
6.8.2020 11:03
Avatar
Šimon Lakosil:6.8.2020 11:13

Ještě bych dovysvětlil. Jde mi o to, že frontned nemá vůbec žádnou informaci o tom, kdy bude úkol hotov nebo zda nastal nějaký problém.

// endpoint zpracovávající požadavky
    @PostMapping(value = "...")
    public ResponseEntity<String> storeImages (
            @RequestParam("metadata") String jsonMetadata,
            @RequestParam("files") MultipartFile[] files,
            @RequestParam("convert") Boolean convert
    ) throws FileValidationException, IOException {
        for (MultipartFile file: files) {
            if (!fileValidator.isImage(file)) {
                throw new FileValidationException("...");
            }
        }

        FileMetadata fileMetadata = mapper.readValue(jsonMetadata, FileMetadata.class);

        for (MultipartFile file: files) {
            FileUploadMetadata metadata = new FileUploadMetadata(
                    fileMetadata.getCategory(),
                    fileMetadata.getKey(),
                    file.getOriginalFilename(),
                    file.getContentType()
            );

            this.uploadWorker.processAsync(file, metadata, convert); // nacpání všech obrázků do fronty
        }

        return new ResponseEntity<>("OK", HttpStatus.OK); // odeslání odpovědi na HTTP request, ale task ještě ani zdaleka nebyl ukončen. Co Kdyý nastane chyba ???
    }
Editováno 6.8.2020 11:14
 
Nahoru Odpovědět
6.8.2020 11:13
Avatar
Odpovídá na Šimon Lakosil
Petr Štechmüller:6.8.2020 13:22

Ahoj,
první možnost bych asi rovnou zavrhnul. Jakékoliv "spamování" serveru není dobré. Druhé řešení vypadá velmi rozumně. Na StackOverflow je to pěkně vysvětleno...

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
6.8.2020 13:22
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.