# Webservice max. mit 5 Clients möglich



## 555Nase (13. Mrz 2008)

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:

```
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


----------



## Niki (13. Mrz 2008)

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!


----------



## 555Nase (13. Mrz 2008)

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


----------



## Niki (13. Mrz 2008)

probier das ganze einfach mal in einer normalen Klasse ohne WebService aus, bei mir klappts wie erwartet:

```
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();
		

	}

}
```


----------



## Niki (13. Mrz 2008)

hast du vielleicht das Attribut counter nicht static gesetzt?


----------



## 555Nase (13. Mrz 2008)

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


----------



## 555Nase (13. Mrz 2008)

counter ist  
	
	
	
	





```
private static
```


----------



## Niki (13. Mrz 2008)

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.


----------



## 555Nase (13. Mrz 2008)

Hallo,

1, 2,3,4,5 Verbindungen klappen einwandfrei


----------



## Niki (13. Mrz 2008)

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?


----------



## 555Nase (14. Mrz 2008)

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...


----------

