Webservice max. mit 5 Clients möglich

  • Themenstarter Themenstarter 555Nase
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
5

555Nase

Gast
Hallo,

folgendes: Ich habe einen Webservice geschrieben, der jedem Client eine ID zurückgibt, allerdings erst dann wenn sich anzahlClients gleichzeitig angemeldet haben. Das ganze sieht so aus:
Code:
static int anzahlClients=5;
private static final Object MONITOR = new Object();
 public void AllOnBoard(int i) {
        if (i < NewWebServiceTest.anzahlClients) {
            try {
                MONITOR.wait();
            } catch (InterruptedException ex) {
            }
        } else {
            MONITOR.notifyAll();
        }

    }

 @WebMethod(operationName = "ID")
    public int ID() {
        int num = 0;
        //TODO write your implementation code here:
        synchronized (MONITOR) {
            counter++;
            num = counter;
            this.AllOnBoard(num);
        }

        return num;

    }

Sobald 5 Clients den gleichzeitiig Webservice aufrufen, kriegen diese ihre IDs zurück, der Reihenfolge des Aufrufs nach. Mein Problem: Es geht nur bis max 5 Clients, ab dem 6. Client bleibt er hängen, bzw. MONITOR.notifyAll() wird wohl nicht mehr ausgeführt.

Kann jemand helfen? Ich nutze Glassfishv2 als AppServer

Danke
 
Eigentlich müssten die Clients 1-5 die IDS gleichzeitig erhalten, der 6. Client dürfte gar nciht in den wait-Pool gelangen sondern müsste sofort zurück gelangen.
Bau einfach mal system.outs ein, und zwar vor wait, und vor notify, und gib die id mit!
 
Hallo,

sorry hab ich vergessen zu erwähnen: Natürlich würde ich anzahlClients=6 setzten, wenn ich 6 Clients haben will. Genau dann blebt er hängen. Egal mit wievielen Clients ich mich anmelde, es passiert nichts.

Danke
 
probier das ganze einfach mal in einer normalen Klasse ohne WebService aus, bei mir klappts wie erwartet:
Code:
public class Threading {
	
	static int counter = 0;
	static int anzahlClients=5;
	private static final Object MONITOR = new Object();
	public void allOnBoard(int i) {
	        if (i < anzahlClients) {
	        	System.out.println( i + "waiting...");
	            try {
	                MONITOR.wait();
	            } catch (InterruptedException ex) {
	            }
	        } else {
	        	System.out.println(i + "notifying...");
	            MONITOR.notifyAll();
	        }

	    }


	    public int getID() {
	        int num = 0;	       
	        synchronized (MONITOR) {
	            counter++;
	            num = counter;
	            this.allOnBoard(num);
	        }

	        return num;

	    }

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		final Threading t1 = new Threading();
		final Threading t2 = new Threading();
		final Threading t3 = new Threading();
		final Threading t4 = new Threading();
		final Threading t5 = new Threading();
		
		new Thread(new Runnable(){
			public void run() {
				
				System.out.println("t1: " + t1.getID());				
				
			}
		}).start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		new Thread(new Runnable(){
			public void run() {				
				System.out.println("t2: " + t2.getID());
				
			}
		}).start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		new Thread(new Runnable(){
			public void run() {
				System.out.println("t3: " + t3.getID());
				
			}
		}).start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		new Thread(new Runnable(){
			public void run() {				
				System.out.println("t4: " + t4.getID());
				
			}
		}).start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		new Thread(new Runnable(){
			public void run() {				
				System.out.println("t5: " + t5.getID());
				
			}
		}).start();
		

	}

}
 
Vielen Dank, Dein Beispiel klappt auch bei mir, auch mit 6 Threads (sobald die korrekte Anzahl erreicht ist, gibt er notify aus) . Aber wieso läuft es denn im AppServer nicht (auch bei 7,8,9 usw Clients nicht).

- Gibt es vielleicht im J2EE oder in der AppServer config ein max. Wert v. Threads?
- Woran kann es sonst liegen?

Schon mal tausend Dank im voraus
 
Kann sein dass der Server nur n-Anfragen gleichzeitig bearbeitet. Setz einfach mal die anzahl auf 2 oder 3 und schau was passiert. Wenn es funktioniert weißt du immerhin schon, dass es nicht an deinem Code liegen kann. Dann wird es hoffentlich irgendwo ein Property geben, wo man die maximale Anzahl der Verbindungen erhöhen kann.
 
Dann schätze ich liegt es an irgend einer Einstellung. Gibt es in der web.xml ein Property wo man die Anzahl der maximalen Verbindungen setzen kann?
 
Hallo,

vielen Dank. Tatsächlich gab es hier in den zig config files einen Eintrag max-thraeds=5, sorry...aber ich hätte nie gedacht, daß man einen Server auf 5 thraeds beschränken könnte...
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben