Witam
Czy ktoś może wie jak się robi coś takiego, że przeglądarka nasłuchuje zmian na serwerze? Używa się tego s shoutboxach, wtedy tekst pojawia się u wszystkich zaraz jak użytkownik wyśle go na serwer. Gdzieś o tym czytałam, ale już nie pamiętam tej nazwy. Ktoś pomoże?
Long pooling lub WebSockets.
websockets są dość "nowe" toteż większość stron zapewne robi pooling ajaxem
Dzięki. Rzeczywiście chodziło mi o long pooling. A szerzej to Comet, może komuś się przyda: http://en.wikipedia.org/wiki/Comet_%28programming%29
Niestety, nie pomogło mi to zbytnio. Może dokładniej opiszę problem. Mam na stronie przycisk, który po kliknięciu wysyła zapytanie do serwera do aplikacji X. Aplikacja X generuje dane i wysyła je do aplikacji Y (przez http), która te dane zapisuje w bazie. Teraz chcę pobrać te dane na stronie z aplikacji Y. Musi to się odbyć dopiero po tym, jak zostaną zapisane. Tak więc moja aplikacja Y otrzyma dwa zapytania: jedno z danymi z aplikacji X i drugie ze strony o przesłanie danych. Oba zapytania będą w tej samej sesji http.
Jak to zrobić, żeby te zapytania zsynchronizować, tzn. żeby serwer z aplikacją odpowiedział na zapytanie dopiero, kiedy skończy przetwarzać otrzymane dane. Jest na to jakiś rozsądny sposób?
Dodam jeszcze, że wszystko dzieje się na serwerze jawa.
A jaki masz problem? o_O Rozumiem że to aplikacja Y dostaje dane, a potem to aplikacja Y ma je wyświetlić? To niech request o wyświetlenie "wisi" dopóki dane nie zostaną przetworzone. Nie widzę tutaj zupełnie żadnego problemu, ani miejsca na jakieś ajaxa ani nic.
No właśnie tak bym chciała zrobić, żeby ten request sobie wisiał. A problem mam taki jak wywołana w serwlecie metoda doGet ma się dowiedzieć, że inny request (ten wywołany z aplikacji X) już się zakończył, żeby dopiero wtedy odpowiedzieć na zapytanie.
Najprościej? Niech oba kontrolery mają dostęp do jakiegoś serwisu, który dla zadanego UUID zwraca info czy już jest wykonane czy też nie.
Nie rozumiem jak to zrobić, skąd wziąć taki serwis i jakie kontrolery. Może jeszcze prościej powiem: w serwlecie są dwie metody, doGet i doPost. Mogą być wywołane w różnej kolejności, ale metoda doGet ma się zakończyć jako ostatnia niezależnie kiedy się zaczęła. Obie metody są w jednej sesji.
Mogłabym w doGet w pętli sprawdzać, czy jakaś flaga w sesji została ustawiona i wtedy zwracać wynik, ale to jest złe rozwiązanie. Chodzi raczej o coś w stylu konstrukcji join i wait.
Myślałem że moze używać jakiegoś normalnego frameworka, a nie ręcznie serwletów...
A jaki masz problem zrobić tutaj wait i notify w takim razie?
Problem jest taki, że nie wiem jak to zrobić.. To nie są wątki tworzone i uruchamiane przez mnie. Nie bardzo mam pomysł jak to ogarnąć i żeby te wątki komunikowały się w parach w obrębie sesji.
Przychodzi mi do głowy pomysł, żeby użyć Piped[Input|Outpu]Stream. Nigdy tego nie używałam, ale z opisu wynika, że to może rozwiązać problem.
Jeśli chodzi o Comet, to niestety to rozwiązanie zabiło mi stronę na serwerach home. Lokalnie u mnie się świetnie sprawdzało, jednak na serwerze podczas faktycznego działania strony już nie. Robiłem to na ajaxie i php.
Próbowałam coś z tym PipedI/OStream, ale bez sukcesów. Teraz zastanawiam się nad BlockingQueue. Według opisu to powinno być właśnie to co potrzebuję. Czy ktoś może kiedyś z tego korzystał i może się podzielić uwagami? Nie chciałabym znowu eksperymentować, żeby się okazało, że tak się nie da.