Avatar billede qumle Nybegynder
26. januar 2006 - 16:18 Der er 18 kommentarer og
1 løsning

Webservice concurrency

Hejsa

Jeg har kodet en Webservice i Java baseret på en Java Enterprise Bean, men jeg regner med at mit problem er lidt mere generelt.

I min webservice skal jeg oprette en fil som jeg skal være 100% sikker på har et unikt filnavn (ikke path).

i første omgang tænkte jeg at det måtte være rigeligt med en logisk nøgle efterfulgt af et timestamp i milisekunder. så min kode ser nogenlunde sådan her ud

while (destinationFile == null || destinationFile.exists()) {
                //file not created yet or a file with this name already exists
                //add the current time as suffix to ensure unique names
                fileName = consignmentNo + "_" + System.currentTimeMillis() + ".jpg";

                destinationPath = smbPath + "/" + dir + "/" + fileName;
                destinationFile = new SmbFile(destinationPath);
            }

destinationFile.createNewFile();

min webservice skal køre på en server med flere CPU'er (8 tror jeg), så derfor kan jeg vel ikke være sikker på at to filer ikke får det samme navn hvis de to CPU'er eksekverer denne kode nøjagtig samtidig.

Mit spørgsmål er derfor todelt
1:hvad sker der egentlig når den samme metode i en webservice bliver kaldt flere gange? bliver der oprettet flere objecter af den underliggende Bean, startes der flere tråde som arbejder på det samme object?

2:afhængigt af svaret på 1 hvordan sikrer man sig et unikt id? jeg tænkte at det kunne være en kombination af timestamp og hashkey for det aktive object eller tråd.

Der må være utallige programmører der har haft dette problem før men jeg har ikke kunnet finde nogen best practice for webservice concurrency. Alle gode ideer værdsættes (og belønnes)
Avatar billede erikjacobsen Ekspert
26. januar 2006 - 16:23 #1
Man kunne bruge en database, med et eller andet indkranset af en transaktion.
Avatar billede jakoba Nybegynder
26. januar 2006 - 16:25 #2
static class Løbenummer {
    private static long nummer = 0;
    public static long fåNummer() {
        return nummer++;
    }
}
den skulle holde i et årstid eller 10.
Avatar billede qumle Nybegynder
26. januar 2006 - 16:33 #3
-> jakoba
men så skal den vel være syncronized, for at være trådsikker? meget af min usikkerhed består i at jeg ikke rigtig ved hvordan Webservicen fungerer bag min ryg mht. flere samtidige kald
Avatar billede erikjacobsen Ekspert
26. januar 2006 - 17:09 #4
Ja, som minimum synchronized. Men webserveren kunne starte flere processer, og så er der vel en static i hver proces.
Avatar billede qumle Nybegynder
26. januar 2006 - 17:18 #5
-> erik
en static for hver process?
nu er jeg ikke lige med på hvad du mener med flere processer, tråde instancer?
min børnelærdom siger at når noget er statisk findes det kun en gang, men det kan selvfølgelig være en sandhed med modifikationer.
Men hvis static ikke sikrer at alle instancer bruger den samme fortløbende variabel så er jeg jo lige vidt
Avatar billede erikjacobsen Ekspert
26. januar 2006 - 17:55 #6
Jeg siger netop processer, og ikke tråde. En webserver kan sagtens oprette et antal processer, hvori der så er et antal tråde i hver. Og bør vel typisk gøre det når der er flere CPU-er.

Og så vidt jeg husker JVM gælder static kun samme process - men de kan efterhånden så mange ting, så måske tager jeg fejl.
Avatar billede arne_v Ekspert
26. januar 2006 - 19:26 #7
der er ikke noget som forbyder at lave en J2EE web eller EJB container med
flere processer/JVM's

men jeg mener ikke at der er nogen af de mest brugte som  har mere en en process/JVM
Avatar billede arne_v Ekspert
26. januar 2006 - 19:31 #8
nu ved jeg ikke hvad du bruger som web service kit

men hvis det f.eks. er Axis saa kan du angive i din WSDD om der skal laves
et objekt af web service klassen per request, per session eller per application (singleton)
Avatar billede arne_v Ekspert
26. januar 2006 - 19:37 #9
jakobs teknik virker fint hvis:
- der ikke behoever vaere unikness mellem genstart af serveren
- det er en single node config og ikke en cluster config

ellers vil je anbefale Scott Ambler high low approach
Avatar billede arne_v Ekspert
26. januar 2006 - 19:40 #10
(som reelt bare er en lille udvidelse af jakobs teknik)
Avatar billede qumle Nybegynder
07. februar 2006 - 17:39 #11
tak for alle indlæggene

jeg har været på ferie i en uge og det er derfor jeg ikke har vendt tilbage.
->erik
jeg er stadig ikke helt med på hvad en process og en tråd er i denne sammenhæng

->arne
web service kit må være SAP netweaver (en SAP udvidelse af Eclipse) men her mener du at man burde kunne sætte op hvor mange objecter der skabes osv?
Scott Ambler high low approach??? øhh kan du sige mere?

vi har netop en cluster løsning og uniqueness skal gælde efter genstart, men dette burde kunne klares vha timestamp, som sagt har jeg kun et problem hvis 2 tråde/processer/instancer hvad det nu er behandler et request i samme milisekund, jeg kan ikke lige overskue hvoe sandsynligt det er men det kan vel ske
Avatar billede arne_v Ekspert
07. februar 2006 - 19:12 #12
med web service kit mener jeg det som bruges paa serveren - ikke det som bruges til
udvikling

i Axis kan kan man angive scope for objekterne for hver service i deployment
descriptoren

du kan finde information om high low paa nettet - det grundliggend eprincip er
at id'et bestaar af en high del og en low del, low delen fungerer ligesom jakobs
counter, high delen fungerer via database

eksempel:

ved opstart laeser server_1 11 fra database og opdaterer til 12, server_2 laser
12 og opdatere til 13, server_1 bruger nu 11001 11002 11003 ... mens server_2
bruger 12001 12002 12003

server_2 genstartes ved 12897 og laser saa 13 og opdaterer til 14 og starter
saa 13001 13002 13003 ...

server_1 naar derimod 11999 og laser saa 14 og opdaterer til 15 og koerer
videre med 14001 14002 14003 ...

unikke vaerdier paa tvaers af cluster nodes og over genstart

ikke nogen stor belastning af databasen

eneste ulempe er at numrene ikke er fortloebne
Avatar billede qumle Nybegynder
10. februar 2006 - 09:59 #13
hmm jeg kan stadig ikke lige overskue det der med hvilket webservice kit jeg bruger men princippet lyder smart

tak for alle kommentarene, hvis erik arne og jakob lige lægger et svar, så deler jeg lidt ud, da jeg synes alle har bidraget til en løsning
Avatar billede arne_v Ekspert
12. februar 2006 - 19:52 #14
svar
Avatar billede erikjacobsen Ekspert
12. februar 2006 - 20:14 #15
Jeg samler ikke på point, tak.
Avatar billede jakoba Nybegynder
12. februar 2006 - 22:13 #16
det gør jeg.
Avatar billede jakoba Nybegynder
12. februar 2006 - 22:13 #17
.
Avatar billede qumle Nybegynder
13. februar 2006 - 10:17 #18
hov nu fik jeg givet arne alle pointene... hvordan deler man dem ud?

arne kan du oprette et spg og overføre 20 point til jakoba da han var hurtigst med den grundlæggende ide, men du uddybbede det.
Avatar billede arne_v Ekspert
13. februar 2006 - 13:10 #19
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester