Jak zachashowac response by nie zaciągać wszystkiego z każdym requestem?

Jak zachashowac response by nie zaciągać wszystkiego z każdym requestem?
0

Witam,

Nie mam dostępu do serwera, mam tylko stronę kliencką.
Jak można wysłać np. jeden request by odebrać np. ArrayList z danymi. Chciałbym to pobrać tylko raz (przynajmniej przez jakis okres czasu)

Pożniej będą leciec kolejne requesty, w krótkich odstępach czasu, nie chce pobierac za kazdym razem tej Arraylisty, ani wywoływać klienta wiele razy. Tylko jak to zrobić?

używam springa i jerseya.

W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 godziny
  • Postów:3553
0

Wystaw dwie usługi. Jedna wołana na początku, druga potem. Ewentualnie uzależnij odpowiedź od parametru.

0

Niestety, nie mam wpływu na wystawione api i jak wyglada odpowiedz.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

A ja nie bardzo rozumiem. Pobierasz sobie listę w swojej aplikacji, zapisujesz sobie na boku a potem pobierasz nową kiedy ci potrzebna. Gdzie jest tu jakis problem? o_O


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
0

a kolejny request skąd ma wiedziec ma wiedziec by sie odwolac do tej już zapisanej listy zamiast pobrac znowu?

0

Wszystko musi się odbyć w locie. Każde kliknięcie usera to kolejny request o dane. Nie mogę tego nigdzie zapisać, w pliku czy w bazie.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Ja nadal nie rozumiem. Przecież to chyba ty piszesz tą aplikację? Więc kontrolujesz co sie dzieje jak ktoś w coś klika? Czy ty chcesz zrobić proxy dostępowe dla webserwisu z którego ma nieświadomie korzystać jakaś zupełnie zewnętrzna kliencka aplikacja? To też da sie zrobić. Musiałbyś podmienić w tej aplikacji adres webserwisu na lokalny podstawiony przez ciebie. Ten twój webserwis wystawia taki sam interfejs, ale zapisuje sobie lokalnie te dane i pobiera z prawdziwego webserwisu tylko raz na jakiś czas.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
0

Nie wiem, może jest proste rozwiązanie a ja się zapętliłem mysląc o czymś skomplikowanym...

To ma być autocomplete tekstu w w polu search. Czyli każda kolejna literka to leci nowy request. Do tego ściągam dane z resta GET, razem z tym pełno niepotrzebnych danych, gdy potrzebuję tylko nazwy by je wyświetlić w trakcie pisania usera. Mogę wywołać tę listę nazw i nic wiecej, dalej muszę ją obrobić.

Tę listę chcę pobrać raz (tylko w sumie na jak długo?...) i ją filtrować na widok.

W zasadzie to im wiecej szukam to mam wrazenie, ze mniej wiem... nie wiem jak to obsłużyć. Fajnie jakbym miał wpływ na wystawione API, ale zawsze dostaje tylko całość.
Nie wiem jak się do tego zabrać.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

No ale gdzie jest problem? W ogóle nie forwarduj tych requestów od użytkowników! Po prostu odpal jakiś Scheduler który raz na minutę czy na godzinę czy jak tam chcesz będzie pobierał nowe dane z serwera. Jak je odbierzesz to je sobie obrabiasz odpowiednio a potem cały mechanizm autocomplete robisz sobie lokalnie.
No chyba że po prostu nie umiesz i korzystasz z faktu że serwer odpowiada ci już przerobionymi danymi? W takim razie znów nic trudnego:

  • zrób sobie mapę Map<String, List<String>> gdzie kluczem jest to co wpisal user a wartością jest lista autocomplete z serwera. Kiedy user coś wpisuje to nie wysyłasz od razu requestu do serwera tylko sprawdzasz czy masz listę w mapie, jak masz to zwracasz tą listę. Jak nie masz to pobierasz z serwera i ładujesz do mapy. Co jakiś czas możesz schedulerem czyścić tą mapę żeby pobierać nowe dane i tyle.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
0

Głupi, zmęczony i niedoświadczony jestem, więc nie bij prosze za debilne pytania ;) Dziękuję za pomoc i cierpliwość.

  • nie mam pojęcia o frontendzie z którym komunikuję się przez resta, w zasadzie to czy nie możnaby pobrać całej Kolekcji a mechanizm autocomplete zrobić na frontendzie? czy to źle?
  • dla pewności, Scheduler czyli np. ScheduledThreadPoolExecutor czy @Scheduled springowe?
  • "potem cały mechanizm autocomplete robisz sobie lokalnie" - czy tu masz na myśli np. zapis do bazy itp. ? ogolnie to wiele rzeczy chciałbym zrobić inaczej ale mam dość spore ograniczenia
  • Odnośnie tej Mapy... serwer nic mi nie przerabia, zawsze dostaje całość i musze to obrobić. Ale w zasadzie jak te informacje w tej mapie mają być przechowywane? One będą ginąć a to przy restarcie, utracie sesji a to przy innych okazjach? Czy może mam pobrać dane do tej mapy jakoś niezależnie i tam wsadzić? czy jak?
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0
  1. Ja nadal nie wiem co ty z tego serwera dostajesz i co z tym robisz. Opcje są dwie. Albo dostajesz np. listę wszystkich loginów a frontend się martwi jak ten autocomplete wyświetlić, albo dostajesz z serwera tylko loginy pasujące do wzorca który wpisał użytkownik. W przypadku pierwszym pobrałbym to raz na jakiś czas a wystawił własny serwis "lokalny" i sprawił że frontend odpytuje ten twój serwis a nie ten zdalny. A wtedy ty po stronie serwera martwisz się kiedy aktualizować dane. W sytuacji drugiej prościej będzie zrobić taką mapę o jakiej pisałem. Wtedy też musisz przepiąć zapytania do resta z frontendu na swój lokalny serwis.
  2. Bez znaczenia, to drugie jest tylko nakładką na to pierwsze.
  3. Ale jaki znów zapis do bazy? o_O Co ty chcesz w bazie zapisywać?
  4. No ja bym te dane pobral niezależnie, nie per sesja czy użytkownik tylko globalnie. Niech ta mapa będzie dostępna z jakiegoś singletonu w wersji tylko do odczytu po prostu. A że sie straci przy restarcie serwera? Ot życie, zresztą i tak te dane będziesz pobierał raz na jakiś czas żeby były aktualne, więc tu problemu nie widzę.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
0
  1. Mam jeden jedyny request GET, który zwraca mi całą listę encji/dto z czego mnie w tym przypadku interesują tyko nazwy. (Jakby nie mogli mi wysłać samych nazw...)
  2. Tak, ale chciałem mieć pewność, że na pewno o tym mowa
    3 i 4. heh to w sumie było powiązane, by mieć pewność odnośnie wyobrażenia jak ma to działać

Wydaje się jednak dość mało trywialne dla początkującego , wolałbym się douczyć niż implementować to na pałę :/

Dzięki za wskazówki. A jeszcze będzie trzeba obsłużyć te 'searche" huh

0

A jeszcze jedno pytanko o tę mapę, bo znalazłem coś takiego:

Kopiuj
public static final ConcurrentMap<String, List<String>> MAP = new ConcurrentHashMap<String, List<String>>();

Czy przechowywanie w czymś takim powinno załatwić sprawę?

Z góry dzięki.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Ja generalnie preferuje używanie singletonowych beanów zarządzanych przez jakis kontener IoC zamiast stosowanie statycznych zmiennych, ale nie wiem jak wygląda u ciebie reszta projektu. Jeśli chodzi o samą mapę to moim zdaniem nie potrzebujesz tu żadnej synchronizacji. Przecież modyfikacje tej mapy (poprzez podmianę na nową) są robione tylko z jednego jedynego miejsca a sama podmiana jest atomowa. Wszyscy pozostali tylko z mapy czytają więc nigdy nie następuje tu próba jednoczesnej modyfikacji. Więc dlaczego potrzebujesz niby żeby to było coś więcej niż najzwyklejsza mapa?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
niezdecydowany
niezdecydowany
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 9 lat
  • Lokalizacja:Bieszczady
0

zrób sobie mapę Map<String, List<String>> gdzie kluczem jest to co wpisal user a wartością jest lista autocomplete z serwera. Kiedy user coś wpisuje to nie wysyłasz od razu requestu do serwera tylko sprawdzasz czy masz listę w mapie, jak masz to zwracasz tą listę. Jak nie masz to pobierasz z serwera i ładujesz do mapy. Co jakiś czas możesz schedulerem czyścić tą mapę żeby pobierać nowe dane i tyle.

Nie ! niech użyje **Multimap ** 'y z guavuni - niech świat będzie piękniejszy

https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimap.html

Nie czytałem wątku - leniwy jestem - ale jeżeli faktycznie masz to potem czyścić za pomocą jakiegoś schedulera, a bean przechowujący taką parę jest singletonem do którego dostęp mają wszyscy - to użycie concurrenct hash mapy jest OK - bo 1.) masz Thread safe - lepiej mieć niż nie mieć 2.) narzuć na wydajność jest naprawdę niewielki (ta klasa to akurat pie@rzony masterpiece)

btw. zamiast tego schedulera, może lepiej przy jakiejkolwiek modyfikacji, nie wiem, tabel czy danych związanych z tym cachem, invalidować go (czy tam jego kawałek z userem)


"Perhaps surprisingly, concurrent programming isn’t so much about threads or
locks, any more than civil engineering is about rivets and I-beams."
edytowany 2x, ostatnio: niezdecydowany
Shalom
Nie nie nie. Jak coś nie jest potrzebne to się tego nie robi. Jak na przykład masz serwis stateless który operuje tylko obiektami immutable to robienie tam synchronizacji to jest zbrodnia :)
0

A no tak, masz rację. Pytam bo kiedyś się naczytałem jak to trzeba synchronizowac Singletona itp...

A co do IoC to np. powyższą mapę, czy jakąkolwiek starczy np. oznaczyć @Singleton z jerseya czy nie tędy droga?

Mam trochę wątpliwości jak wywoływać tego Schedulera, np. z loginem? czy jak to zrobic 'niezaleznie' ?

WIELKIE dzięki i sorry, że męczę.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0
  1. Używasz Springa wiec ja bym klasę z tą mapą oznaczył jako @Named albo @Service a wstrzykiwał przez @Inject albo @Autowire.
  2. Nie bardzo rozumiem. Nic nie masz wywoływać. Masz odpalic taska w schedulerze i tyle. On sie sam będzie potem wywoływał. Znów skoro to Spring to możesz użyć @Scheduled http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html Czyli schedulujesz metodę która raz na godzinę pobierze nowe wartości z serwera i podmieni mapę z tym twoim beanie.

tak btw to zrobiłbym w sumie unmodifiable list w tej mapie, tak dla pewności ;)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 3x, ostatnio: Shalom
niezdecydowany
niezdecydowany
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 9 lat
  • Lokalizacja:Bieszczady
0

Ale właśnie ta mapa nie musi być synchronizowana w Twoim przypadku @Shalom czyli

Czyli schedulujesz metodę która raz na godzinę pobierze nowe wartości z serwera i podmieni mapę z tym twoim beanie.

Ale dlaczego niby chcesz traktować listę wyników zaciągniętą godzine temu tak samo jak listę zaciągniętą 3minuty temu - panie, to jest performance issue, i to takie że w Sparcie, pojechaliby po premii ;D;D;D;D

Dlatego, wywalać i invalidować wynik, powinno się dla jednego klucza w mapie (albo po ludzku, Multimapie (http://docs.guava-libraries.go[...]e/common/collect/Multimap.html) ) - i w takim przypadku, synchronizacja jest konieczna.


"Perhaps surprisingly, concurrent programming isn’t so much about threads or
locks, any more than civil engineering is about rivets and I-beams."
Shalom
Ale niby czemu? WTF? Ty w ogóle czytasz ten temat czy tylko wybrane posty? Autor nie opisał dokładnie o jakie dane chodzi ale z tego co ja zrozumiałem to on może pobrać tylko WSZYSTKIE dane więc invalidowanie jednego klucza guzik ci daje, bo performance będzie taki sam. I nie wiem jak ty, ale ja nie mam szklanej kuli i nie wiem jak autor te dane w ogóle przetwarza po odebraniu od webserwisu. Może w ogóle nie jest w stanie wyliczyć tylko fragmentu dla danego klucza? Z fusów też wróżysz? :P
niezdecydowany
niezdecydowany
ojej, ale Wy jesteście delikatni - ten post to był tylko taki delikatny granat zaczepny. Ale fakt nie czytałem wszystkich postów - co wspomniałem w moim pierwszym. Z tego co zrozumiałem, autor zaciąga dane dla jakiegoś user'a - jednego, i te dane wsadza do cacha, w którym będzie miał po jakimś czasie X danych dla X userów - i dla takiej sytuacji to co napisałem wyżej ma sens. Jak chodziło mu o coś innego to nie wiem :D nie czytałem ^^^
Shalom
Ech 1. Mam jeden jedyny request GET, który zwraca mi całą listę encji/dto z czego mnie w tym przypadku interesują tyko nazwy. (Jakby nie mogli mi wysłać samych nazw...) ;]
niezdecydowany
niezdecydowany
o ufa, faktycznie :D i to jeszcze pierwszy post na tej stronie :D:D:D:D:D:D
0

@Shalom

  1. aha, ok. Po prostu zastanawiałem się czy są już jakieś cuda, że starczy obiekt zaznaczyć jakąs adnostacja i bedzie dzialac ;)
  2. Dobra rozumiem... myslalem, ze to dziala raczej tak, ze n. odpala sie z konkretna akcją i nie odpali sie dopoki nie minie jakis okres czasu czy cos w tym rodzaju.

Dzięki, chłopaki.

niezdecydowany
niezdecydowany
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 9 lat
  • Lokalizacja:Bieszczady
0

Tam nie ma żadnej magi - dając @Scheduled czy @Async mówisz springowi żeby proxował metodę i wrzucał to jakiegoś executora. np: @Scheduled trafi do ScheduledExecutorService


"Perhaps surprisingly, concurrent programming isn’t so much about threads or
locks, any more than civil engineering is about rivets and I-beams."
0

Ok, juz wiem o co mi chodzilo z tym logowaniem...

ten request o ktorym pisalem da sie wyslac dopiero po zalogowaniu usera, dla konkretngo uzytkownika.

Czy mozecie mnie jeszcze nakierowac jak mozna to zrobic?
Mam Spring Security. Sprawdzanie SecurityContextHolder i jaka kto ma rolę raczej nie brzmi fajnie.

Znalazlem SchedulingConfigurer i zastanawiam się czy mozna to jakos wykorzystac?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

A w jaki sposób niby webservice waliduje czy ktoś się zalogował? Czy to ty sobie lokalnie sprawdzasz? Bo jeśli tylko ty lokalnie to nie widzę w ogóle problemu.
Jeśli webservice jakoś to sprawdza, to możesz zrobić sobie tą mapę per użytkownik jako beana ze scope ustawionym na session.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
0

Widzę, że napisaliscie juz w komentarzu wczesniej ;)

Sorry za nieprezyzyjnosc, ale krok po kroku wychodzi co i jak.

Wiec, moge wyciagnac przestrzen nazw dla konkretnego Usera...

W sumie mozna sciagnac wszystko dla kazdego usera i trzymac to w mapie.

Ale brzmi to dosc hardcorowo, bo tego nie bedzie az tak malo.

0

ten webservice to sprawdza i po tamtej stronie są trzymane dane userów i hasel.

Ale juz mi podpowiedzieliscie z czym kombinowac.

Dzięki.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)