Two-way oder ein non-Blocking asynchronen Webservice-Aufruf?

bobymiller

Grünschnabel
Hallo !

Ich versuche grade mit Java 6 einen asynchronen Webservice zu programmieren.
Allerdings stoße ich dabei auf folgende Probleme oder habe eventuell das Prinzip nicht richtig verstanden. In Java 6 gibt es ja nun die Anotation „@Oneway“ um eine Methode als asynchron zu deklarieren. Jetzt handelt es sich hierbei allerdings nur um eine one-Way Funktionalität.

Hilfreich wäre eine asynchrone Methode welche während ihrer Abarbeitung immer wieder irgendwelche Zwischenergebnisse an den Client senden könnte. Also der Client sendet eine Anfrage an die asynchrone Methode des Webservices und bekommt vom Webservice immer wieder Zwischenergebnisse von dem Methodenaufruf zurück. Hierbei würde es sich dann um eine two-way und non-Blocking Funktion handeln.

Kann man so etwas per Webservice in Java realisieren und wenn ja wie? Ein Praktisches Beispiel als Webservice und Client wäre sehr hilfreich hierbei.

Ich danke euch schon einmal dafür
 
Hallo,

basierend auf:
http://www.tutorials.de/forum/java/268800-einfache-webservices-unter-java-6-mustang.html

Hier mal ein Beispiel für einen zeitbeschränkten Aufruf
Java:
package de.tutorials;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import javax.jws.WebService;

/**
 * @author Tom
 */
@WebService(serviceName = "Calculator", portName = "Calculator", endpointInterface = "de.tutorials.ICalculator")
public class Calculator implements ICalculator {
    ExecutorService executorService = Executors.newFixedThreadPool(4);

    public int computeSumOf(final int a, final int b) {

        Future<Integer> result = executorService.submit(new Callable<Integer>() {
            public Integer call() throws Exception {
                int sum = a+b;
                try {
                    TimeUnit.SECONDS.sleep(sum);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return sum;
            }
        });

        try {
            return result.get(5,TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
            throw new RuntimeException("Calculation aborted", e);
        } catch (ExecutionException e) {
            e.printStackTrace();
            throw new RuntimeException("Calculation aborted", e);
        } catch (TimeoutException e) {
            e.printStackTrace();
            throw new RuntimeException("Calculation timeout", e);
        }
        
    }
}

Das geht natürlich auch schicker:
http://www.tutorials.de/forum/java/284282-methode-nach-bestimmter-zeit-beenden.html

Hilfreich wäre eine asynchrone Methode welche während ihrer Abarbeitung immer wieder irgendwelche Zwischenergebnisse an den Client senden könnte. Also der Client sendet eine Anfrage an die asynchrone Methode des Webservices und bekommt vom Webservice immer wieder Zwischenergebnisse von dem Methodenaufruf zurück. Hierbei würde es sich dann um eine two-way und non-Blocking Funktion handeln.
Schau mal hier:
http://today.java.net/pub/a/today/2006/09/19/asynchronous-jax-ws-web-services.html

Sieht leider sehr kompliziert aus...
Etwas einfacher ist asynchrones Messaging mit JMS (für ists ja auch gedacht...). Eine weitere Möglichkeit wäre auch ein HTTP basierter REST-style "Webservice" mit Comet.
http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp.html

Gruß Tom
 
Hallo Tom !

Erst einmal vielen Dank für deine Hilfe. Super Beispiel von dir, dass hat mir sehr weitergeholfen. Wenn ich mir das Forum hier so durchlese, fehlt sehr schnell auf, dass du schon sehr fielen Usern auf exzellenter Art und Weise geholfen hast. Hast du vielleicht auch noch eine Idee zu der hier (http://www.tutorials.de/forum/java/349446-web-service-call-abbrechen.html) von mir gestellten frage.

Gruß,
Boby


Hallo,

basierend auf:
http://www.tutorials.de/forum/java/268800-einfache-webservices-unter-java-6-mustang.html

Hier mal ein Beispiel für einen zeitbeschränkten Aufruf
Java:
package de.tutorials;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import javax.jws.WebService;

/**
 * @author Tom
 */
@WebService(serviceName = "Calculator", portName = "Calculator", endpointInterface = "de.tutorials.ICalculator")
public class Calculator implements ICalculator {
    ExecutorService executorService = Executors.newFixedThreadPool(4);

    public int computeSumOf(final int a, final int b) {

        Future<Integer> result = executorService.submit(new Callable<Integer>() {
            public Integer call() throws Exception {
                int sum = a+b;
                try {
                    TimeUnit.SECONDS.sleep(sum);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return sum;
            }
        });

        try {
            return result.get(5,TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
            throw new RuntimeException("Calculation aborted", e);
        } catch (ExecutionException e) {
            e.printStackTrace();
            throw new RuntimeException("Calculation aborted", e);
        } catch (TimeoutException e) {
            e.printStackTrace();
            throw new RuntimeException("Calculation timeout", e);
        }
        
    }
}

Das geht natürlich auch schicker:
http://www.tutorials.de/forum/java/284282-methode-nach-bestimmter-zeit-beenden.html


Schau mal hier:
http://today.java.net/pub/a/today/2006/09/19/asynchronous-jax-ws-web-services.html

Sieht leider sehr kompliziert aus...
Etwas einfacher ist asynchrones Messaging mit JMS (für ists ja auch gedacht...). Eine weitere Möglichkeit wäre auch ein HTTP basierter REST-style "Webservice" mit Comet.
http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp.html

Gruß Tom
 
Zurück