[ glamoc @ 10.08.2009. 17:11 ] @
Programiran neku klijent server aplikaciju u javi(koristim java.net) i jedan od zahteva je da server na svakih x sekundi pinguje sve klijente
kako bi znao koji klijenti su zivi.Prvo sam mislio da ovo realizujem tako sto cu na serveru pokrenuti jednu nit koja se samo bavi pingovanjem klijenata i to na sledeci naci:

-nit posalje poruku klijentu i ceka odgovor,medjuti problem je ocigledan,ukoliko se klijent ne odazove nit na serveru se blikira

-drugo resenje koje mi je palo na pamet je da serverska nit salje poruku klijentu ali da ne ocekuje odgovor od klijenta,ukoliko dodje do problema u komunikaciji
bacice se izuzetak i ja u obradi izuzetka uklonim klijenta iz liste aktivnih

Ako se neko bavio ovom roblematikom interesuje me koliko je dobro ovo drugo resenje i ako ima neko bolje neka mi predlozi
[ Dejan Lozanovic @ 10.08.2009. 18:29 ] @
Jel mozes malo blize da opises sta konkretno radis pa da mogu da predlozim neko bolje resenje. Uglavnom ne bih preporucio java.net direktno da se koristi, jednostavno ne zelis da se zezas na tako niskom nivou.

Znaci preporucio bih dve varijante.

Prva ako se radi o nekoj klasicnoj "biznis" aplikaciji, za server uzmi lepo aplikacioni server ili spring, pa napravis tamo web servis , a sa klijentima gadjas web servis i tako razmenjujes podatke ukoliko pravis FAT klijente. druga varaijanta ako koristis neki binarni protokol pa ti nekakav XML nije dobar za komunikaciju.

Druga ako klasican XML nije dobar za komunikaciju onda preporucujem da uzmes ili jboss NETTY ili apache MINA projekat. Oni su event driven pa preko njih realizujes komunikaciju.

Zasto ovo pricam, iz prostog razloga sto kad ljudi krenu da rade direkt sa threadovima i socektima obicno naprave haos negde a to je posle jako tesko debagovati, zato je ovo mnogo bolja varijanta jer sav taj low level prepusits serveru ili frameworku da radi za tebe, a ti se zanimas sa biznis logikom.
[ glamoc @ 10.08.2009. 19:07 ] @
Konkretan problem je da imam tri vrste uredjaja klijente koji zadaju velike nizove koje treba sortirati,servera koji velike nizove razbija na manje i salje ih radnim stanicama,i radne stanice koje konkurentno sortiraju manje podnizove.Tako sortirane podnizove vracaju serveru a onda on spaja dva manja podniza u veci i ponovo salje radnoj stanici sve dok se niz ne sortira.Server odrzava spisak zivih stanica

Inace ovo mi je projekat na faksu i ja znam samo da radim u java.net i pokusao sam raditi u java.rmi ali nikako nisam uspeo podesiti.
Ako bi bio ljubazan da mi das neki koristan link za ovo sto si mi pisao jer nemam pojma o cemu se radi.
unapred hvala
[ IDE @ 11.08.2009. 08:52 ] @
A zasto ne uradis ovako:

Kreiras mapu ciji je key - IP klijenta a value - uspjesnost pingovanja i inicijalizujes sve na "PENDING" ( npr value = 0 ya Pending, value = -1 za nemogucnost pingovanja a value = 1 za uspjesno pingovanje)

- Kreiras klasu ciji je zadatak da za zadatu adresu uradi PING ( implementira Runnable )

- Kreiras nit koja svakih n sekundi za svaku prijavljenu adresu kreira nit ( klasa odozgo ) koja ce pingovati svog klijenta i u slucaju exception-a prijaviti u neku mapu rezultat da li je ping uspio ili ne i prilikom SVAKOG upisa u mapu iterirati kroz nju prikazivajuci za koga je ping uspio a za koga ne.

Dakle 2 razlicita thread-a, umjesto samo jednog kako si u prvom slucaju naveo.

Naravno, nekoliko metoda pa mozda i mapa bi morali biti sinhronizovani.
Takođe, trebao bi pratiti evidenciju za kojeg klijenta nit vec postoji, tj. za koga jos prethodna nit nije zavrsila posao kako ne bi pokrenuo vise pingovanja jednog klijenta, sto uopste nije tezak posao.

Na ovaj nacin neces dozivjeti blokiranja glavne niti da saceka kraj svakog pingovanja.

Ako nesto nisi najbolje shvatio - pitaj...
[ glamoc @ 11.08.2009. 09:52 ] @
Ako sam te dobro razumeo ti predlazer da za svaku radnu stanicu pokrenem po jedu nit koja ce se baviti samo tom stanicom i jednu koja ce globalno kontrolisati
gde je ping uspeo a gde nije.Ovo mi se resenje ne svidja jer ako imam npr 100 radnih stanica nastace havarija.Ako sam te pogresno razumeo molim te ispravi me.
[ IDE @ 12.08.2009. 09:20 ] @
I da i ne.

Glavna nit ce se samo brinuti o kreiranju niti za svaku radnu stanicu. Izmedju ostalog, brinuce i da se nikad ne kreiraju dva Thread-a za jednu radnu stanicu.

Te "cerke" niti ce upisivati u npr. neku mapu da li je usjelo slanje za njihovu radnu stanicu ili nije i ako ti treba vizuelni prikaz, pri insertovanju refreshovati prethodni prikaz, tj. iterirati kroz mapu prikazivajuci trenutne rezultate.

Ovo je princip koji radi na jednom velikom i ozbiljnom sistemu na kojem sam radio ( naravno ne radi ping vec nesto drugo, ali jako slicno ) , i radi vec dugo vremena bez i jednog problema.

Doduse, nikad kod njega ne postoji npr. 100 klijenata za njegov ping, vec je to reda 10 - 20.

Ali ne vidim zasto bi tebi nastala havarija... Pogotovo ako ces koristiti neki server a ne neki slabasni PC... Sistem koji sam pominjao je u jednom trenutku znao imati po 200 niti otvorenih u jednom trenutku i to makar polovina od njih su radili malo "teze" operacije za procesor, i kazem - nikad do sada nije zablokirao ili porijesio pri obradi podataka.

Naravno, potrebno je iskustvo u radu sa multithread aplikacijama koje, izmedju ostalog, znaci i pravilan rad sa sinhronizovanim metodama...

Uostalom, ovo je samo predlog kako bih ja to uradio.
[ Chobicus @ 14.08.2009. 15:12 ] @
Mozda ti treba ovako neshto:
http://java.sun.com/j2se/1.4.2/docs/guide/nio/example/Ping.java

Jel' to za DRS?
:)
[ glamoc @ 15.08.2009. 17:15 ] @
E hvala na linku al uspeo sam da resim stvar.Ovo je za projekat iz KDP-a(ili za novosadjane DRS)