Odroczenie wywołania usługi

0

Cześć,
Mam pewne konkretne wymaganie i zastanawiam się słuchajcie czy jest jakiś sposób aby je zrealizować. Mamy system webowy. Front-end oparty na angularze 6, back-end to java. I teraz mamy przypadek biznesowy. Klient wchodzi na ekran na którym może spędzić dowolną ilość czas ale może go również zamknąć. Wymaganie mówi bardzo jasno że po wejściu klienta na ekran, gdy jest on na nim dłużej niż 10min, musi zostać wysłany konkretny komunikat do zewnętrznej usługi. Jeżeli klient opuści ekran poprzez przejście na nim dalej, przed upływem 10min to wysłanie komunikatu ma zostać anulowane. Natomiast jeżeli klient wejdzie na ekran i przez 10min nie będzie żadnej akcji z jego strony, tzn nie kliknie dalej tylko no nie wiem, będzie na nim siedział, zamknie go, cokolwiek to ten komunikat ma się wysłać. I teraz pomysł jest tak że wchodząc na ekran, front uderzy do wystawionej przeze mnie końcówki w javie no i właśnie, co dalej .... Czy jest jakiś sposób aby takie żądanie przyjąć ale odroczyć jego wykonanie na 10min? Następnie front dostał by drugą końcówkę która anulowała by to żądanie gdy klient wyjdzie z ekranu przed upływem 10min i w momencie kliknięcia dalej, ta końcówka została by wywołana. Tylko zastanawiam się jak to na back-endzie zrealizować i czy jest to w ogóle realizowalne w jakikolwiek sposób w dodatku taki żeby nie zamordować serwera. Bo pewnie dało by się wątek na serwerze zawiesić ale jak tych wątków będzie 5 tysięcy no to może być mały problem. Pierwszy raz coś takiego realizuję, tu przyznaję się bez bicia stąd brak tej wiedzy.

0

Na pierwszy rzut oka pachnie mi to softem do kontrolowania zdalnych pracowników :D

Ogólnie to co opisujesz to jak dla mnie brzmi jak typowa sesja użytkownika - jak się zakończy, to zrób jakąś tam akcję. Jak konkretnie to zaimplementować to odliczanie itp to byś musiał zerknąc, ale taki trop bym dał.

0

No właśnie myk z sesją nie przejdzie ponieważ to załatwiło by mi przypadek w którym klient np wylogowuje się. A co gdy ten siedzi sobie na ekranie ponad 10min bo np go uzupełnia, coś wpisuje, ma jakiś problem z jego wypełnieniem? W takiej sytuacji również musi zostać wygenerowany ten komunikat. A sesja mu nie wygasa. Nie mogę wylogowywać klienta z systemu tylko dlatego że dłużej zajmuje mu wypełnienie ekranu. Bo to może być sygnał że ma z tym jakieś problemy i między innymi po to jest ten komunikat żeby ktoś się z nim skontaktował i mu pomógł.

0

Może tak:

  1. użytkownik wchodząc w widok wysyła request "wlazłem", backend zapamiętuje kto i kiedy wlazł
  2. GUI wysyła "bicie serca" np. co 15 sekund jeżeli użytkownik wisi na widoku
  3. pierwsze bicie serca które przekroczy 10 minut jest łapane przez serwer i wysyłany jest komunikat do zewnętrznej apki; kolejne są ignorowane.

Oczywiście to trzeba będzie zabezpieczyć przed wyciekami pamięci, jakieś limity dać (np. po godzinie usuwasz informację i wówczas takie bicia serca są ignorowane).

0
lukpio3 napisał(a):

Nie mogę wylogowywać klienta z systemu tylko dlatego że dłużej zajmuje mu wypełnienie ekranu.

Szkoda, że programiści systemów rządowych o tym nie pomyśleli xd ile razy przy zmianie CEiDG czy przy ZUSie wypełniałem coś 10 minut a potem sesja wygasła, spróbuj ponownie xd

0

Ja bym to wrzucał do Caffeine cache. Robisz sobie proste .expireAfterWrite... i jako removal listener jak dostaniesz expired wysyłasz tą swoją notyfikacje. Każdy request z frontu wkłada entry do cache, więc się "odracza". 10 linijek i powinno działać tak jak chcesz,

    Cache<SessionId, Boolean> magic = Caffeine.newBuilder()
            .expireAfterWrite(Duration.ofMinutes(10))
            .scheduler(Scheduler.systemScheduler())
            .removalListener(this::remove)
            .build();

    public void sessionHeartbeat(SessionId id) {
        magic.put(id, true);
    }

    private void remove(SessionId id, Boolean v, RemovalCause removalCause) {
        if (removalCause.wasEvicted()) {
            // costam
        }
    }

0

Mam zbudowany mechanizm wygaszania sesji. Oczywiście. Ale sesja wygasa w przypadku totalnej nieaktywności klienta. Tzn zamknie on przeglądarkę albo pozostawi ją otwartą na ekranie i nie porusza kursorem. wówczas taka sesja wygaśnie. Ale gdy jest na ekranie i na nim pracuje wypełniając formularz to nie, sesja nie wygaśnie. I ten komunikat jest wysyłany właśnie w celach pomocy takiemu człowiekowi bo może mieć jakieś problem oraz do celów statystycznych, ile osób loguje się do systemu, odpala ten konkretny formularz po czym go zamyka.

0

@Shalom: Bardzo ciekawe. Przez weekend zgłębię ten temat.

2

A ja mam pytanie, dlaczego czas nie może być odliczany po stronie angulara ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1