16. juli 2001 - 22:56Der er
27 kommentarer og 1 løsning
URLConnection, frameset og flowstop ?!
Hej !
jeg har et frameset, det har en masse forskellige html og asp filer i..... i en af asp filerne vises der en applet. Denne applet benytter sig af en URLConnection til at hente nogle data fra en asp fil på serveren. Mit problem er nu, at jeg nogengange oplever et flowstop for framesettet ! nogle af de frames jeg har i settet opdaterer nemlig sig selv ved forskellige intervaller, vha. en refresh meta. Dette virker fint, det sker dog ligepludselig at der simpelthen kommer et flowstop, og den kan simpelthen ikke opdatere framesene længere ! IE står bare og prøver i flere minutter uden held... dette gør at mine ASP filers klient \"session\" timer-out på serveren.... Jeg har en meget stærk mistanke om at det er appletens skyld, da det ikke blot sker på min computer men på mange andres også....... jeg har læst noget med at man ikke kan sætte en timeout værdi for en URLConnection, og vil derfor gerne vide om det kan have noget med sagen at gøre ? hvad kan forårsage det jeg har her?
Her er den kode jeg bruger til med URLConnection...
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
jeg tror du kvæler din server. URL.openConnection() åbner en ny connection hver gang - hvis du gør det mange gange i sekundet uden at lukke de gamle er det vel kun et spørgsmål om tid. Se om du måske kan bruge URLConnection.connect() i stedet, den åbner ikke nye connections hvis der er hul igennem
Ikke så vidt jeg kan se, men er der nogen grund til det? Vil du åbne og lukke dem hele tiden? Du kan bruge URLConnection.connect() og BufferedReader.ready() i stedet for bare at lave nye hele tiden. Du skal tænke på at hver gang din kode der køres så: 1) 2 URL, 2 URLConnection og 2 BufferedReader dereferenceres, men optager stadig hukommelse indtil garbage collectoren kommer forbí. Hvis klienten kører med HotSpot er det nok ikke et voldsomt problem pga. dens object nursery, men i de fleste JVM\'er vil det føre til fuldstændig unødigt højt hukommelsesforbrug og ringe performance pga. den tid der skal bruges på gc. 2) Der skal oprettes 2 nye connections fra serverens side også.
Selvom du lukker connections efter dig så serveren ikke kvæles, så er det stadig en masse arbejde for både klient og server, og jeg kan ikke umiddelbart se at du har en god grund til at oprette nye objekter hver gang.
et optimerings tip kunne være at du skulle overveje at putte oplysningerne fra de to forspørgsler samme til en, og hvis det er samme instans af Appletten der køre med kodestumpen igen og igen, så benytte dig af noget mere genbrug af instanser, samtidig med at du benytter dig af det delbing siger. Hvis det er et problem med memory-loaded er for stort fordi GB gøre for sjældent, kan du jo bare selv starte den med System.gc(), lidt snyd men det virker :-)
hmm, ok, jeg kan ikke lige få det her med URLConnection.connect() til at virke... for at få lov til at kalde den, troede jeg først at jeg måtte lave mine URLConnections sådan her :
asp1Uc = new URLConnection(asp1Url);
men det må man ikke p.g.a. at URLConnection er abstrakt får jeg så at vide, kunne jeg om muligt få en kodestump til hjælp?
Lav en metode til at initialisere med, som får en URLConnection vha URL.openConnection(). Og en anden metode som står og løkker (eller kaldes gentaget). Den bruger så den URLConnection du fik fat i ovenover og kalder connect() på den.
Jeg tror egentlig ikke du skal bruge den til noget her. Jeg tænkte du kunne bruge den til at se om InputStreamen ville smide IOExceptions, men det er der vist ikke nogen grund til alligevel.
try { asp2Uc.connect(); asp1Uc.connect(); asp1rd = new BufferedReader(new InputStreamReader(asp2Uc.getInputStream())); asp2rd = new BufferedReader(new InputStreamReader(asp1Uc.getInputStream())); }
nu har jeg koden sådan der, det duer bare ikke, den får enten IKKE noget ud af alle de læsninger der sker efter 1. gang koden bliver kørt, eller også får den præcis det samme som alle andre gange ( jeg ved med sikkerhed at den skal give noget andet ).....
URL objekterne bliver lavet i constructoren for tråden........ og de er gode nok, første gang koden bliver kørt virker den...... men ikke derefter.....
den dør IKKE undervejs, 100%... for hvis jeg bruger openConnection istedet for connect, VIRKER det.......... hvis jeg derimod bruger connect ændrer outputtet fra ASP filen sig ikke, ELLER jeg får slet ikke nogen kode.... jeg har prøvet at sætte setUseCaches(false); ind, men det nytter IKKE.... altså må det være fordi at connect ikke duer :(
ang. bufferreaderne, ved ikke hvorfor jeg instantierer nye, det er ikke mig der har lavet den originale kode, men det vel ikke nødvendigt... dog ikke noget jeg lige vil rette før det her virker.....
nej...... jeg kører den kode jeg har sendt konstant i en tråd, hvor den når den er færdig venter 1 sekund før den starter igen.
ASP filen ændrer sig ikke HVER gang, men den ændrer sig nogengange, jeg kan igennem noget andet bede den om at ændre output, og når jeg gør det sker der INTET med den med connect(), den hvor jeg kun kører openConnection() virker det 100% ( MINUS den detalje med flow-stop )
okay, det er så klart at dit program mener at den stadig har forbindelsen og den har læst hvad der kommer, så der sker ikke noget med connect(). Jeg troede at der blev streamet data ud. Hvis der ikke bliver streamet ud burde connections lukkes på serveren så snart responsen er afsted. Husker du at lukke connections på serveren?
Jeg vil mene at du har et grundlæggende designproblem: Du vil gerne hente nye data hver gang de ændres, men du har ingen måde at finde ud af om de ændres. Hvad med at lave en URLConnection til en URL som sender noget ud hver gang output ændres, og kun ved modtagelse af dette lave du nye connections til serveren?
nej du misforstår, jeg vil ikke hente nye data hver gang de vil ændres. jeg vil bare hente de nyeSTE data, engang ca. hvert sekund. Derefter er der så kode der arbejder med de nyligt hentede data og tjekker om de er ændrede osv.
Husker jeg at lukke connections på serveren ? øøh hvordan skulle jeg gøre det, det er jo det jeg prøver at finde ud af her..........
Hvis din InputStream ikke modtager at enden af streamen er nået, så returnerer dens read() metoder ikke kontrollen før der smides en exception, selvom der ikke er mere data at hente. Indtil da er tråden blokeret.
Hmm OK, det er så en mulighed, men det sker kun i den model hvor jeg bruger connect, og ikke i den hvor jeg bruger openConnection hele tiden, hvad kan jeg gøre ved det?
men jeg tvivler STÆRKT på at det er muligt at den ikke får en EOS, det er jo en HTTP server der snakkes med.... den kan da ikke bare sende noget afsted uden en ende....
Det er ikke nødventigt at bruge connect(), den virker heller ikke hvis du skal hente nye inputs, som jeg forstår du skal. i stedet skal du bare huske at lukke dine forbindelser igen efter at have kørt openconnection(), ellers kvæles serveren. Derfor skal du sige asp1rd.close() (med noget try/catch udenom) på dine bufferedreadere. Derved lukkes forbindelsen og den kan hente igen uden problemer.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.