2015-03-16 20 views
5

Ich habe den Client-Stub für unter Service mit Apache-CXF 's Wsdl2java Befehl erstellt. So verwenden Sie den CXF-Client in einer Thread-sicheren Weise


Dann rufe ich die getWeatherInformation() Methode wie folgt auf.

Weather weatherService = new Weather(); 
WeatherSoap weatherSoap = weatherService.getWeatherSoap(); 
ArrayOfWeatherDescription result = weatherSoap.getWeatherInformation(); 

Ich habe gelesen, dass cxf-Clients Thread sicher sind. Aber ich habe Zweifel, ob es sicher ist, die gleiche WeatherSoap Instanz über mehrere Threads zu verwenden? Oder stattdessen sollte/kann ich eine Instanz der Weather Klasse über mehrere Threads verwenden? Danke.

EDIT:


Was ich tue, ist Ich habe eine RESTful API Öffentlichkeit ausgesetzt und wenn jemand anruft, dass Rest-Dienst ich einen anderen SOAP-Dienst aufrufen. Über obigen Code wird der SOAP-Service aufgerufen. Was ich wissen möchte ist, sollte ich alle obigen Zeilen für jede Ruheanforderung ausführen oder kann ich eine Instanz von Weather oder WeatherSoap verwenden, um alle REST-Anforderungen zu bedienen.

+0

Aus dem obigen Code, ich finde Sie erstellen Instanz von Wetter für jede Anfrage. Daher kommt es nicht in Frage, dass Threads ins Bild kommen. Etwas mehr Codeeinblick könnte erfordern, um zu finden, ob es Thread-sichere Probleme gibt. –

+0

@KarthikPrasad Es ist schwierig, den tatsächlichen Code hier zu setzen. Was ich mache ist, dass ich eine RESTful API der Öffentlichkeit zugänglich gemacht habe und wenn jemand diesen Restdienst anruft, rufe ich einen anderen SOAP Service an. Über obigen Code wird der SOAP-Service aufgerufen. Was ich wissen möchte ist, sollte ich alle oben genannten Zeilen für jede Ruheanforderung ausführen oder kann ich eine Instanz von Weather oder WeatherSoap verwenden, um alle REST-Anfragen zu bedienen. – prageeth

Antwort

3

Ja CXF ist threadsicher, Sie können single instance/singleton für Weather und WeatherSoap verwenden, Sie können sich cxf ähnlich wie servlet engine vorstellen, die die gesamte Infrastruktur für Sie wie Transport, Datenbindung für Sie abwickelt. Ich hatte einen ähnlichen Anwendungsfall, wo ich eine Frontend-Präsentationsschicht und eine Anzahl von Netzwerkservern hatte, um zwischen diesen zu interagieren. Ich hatte eine Pause für Präsentation und SOAP, die Geschäftslogik implementiert sowie mit Servern interagiert. Daher habe ich einen Soap-Client im Ruhezustand implementiert. Ich hatte Anforderung, ich brauchte geteilte Ruheanforderung und rief parallele Soap-Anrufe auf, die Zeitverzögerungen von 800 ms hatten. Ich habe das gesamte Setup getestet und bin nicht auf Thread-Probleme gestoßen.

So kommt in zu Client-Implementierung

reines Java

public class MySoapClient{ 

    private static WeatherSoap weatherSoap; 

    private MySoapClient(){ 
    } 

    public static WeatherSoap getClient(){ 

    if(weatherSoap==null){ 
     Weather weatherService = new Weather(); 
     weatherSoap= weatherService.getWeatherSoap(); 
    } 
    return weatherSoap; 
    } 

} 

Und ich würde das Wetter Klasse ändert SOAP URL aus Properties-Datei zu erhalten.

@WebServiceClient(name = "Weather", 
        wsdlLocation = "classpath:weather.wsdl", 
        targetNamespace = "http://ws.cdyne.com/WeatherWS/") 
public class Weather extends Service { 

    private static final Logger LOG = LoggerFactory.getLogger(Weather.class); 
    public final static URL WSDL_LOCATION; 
    public final static QName SERVICE = new QName("http://ws.cdyne.com/WeatherWS/", "Weather"); 
    public final static QName WeatherHttpPost = new QName("http://ws.cdyne.com/WeatherWS/", "WeatherHttpPost"); 
    public final static QName WeatherHttpGet = new QName("http://ws.cdyne.com/WeatherWS/", "WeatherHttpGet"); 
    public final static QName WeatherSoap12 = new QName("http://ws.cdyne.com/WeatherWS/", "WeatherSoap12"); 
    public final static QName WeatherSoap = new QName("http://ws.cdyne.com/WeatherWS/", "WeatherSoap"); 
    static { 
     URL url = null; 
     try { 
      url = new URL(MyPropertiesUtil.getProperty("app.weather.url")); 
     } catch (MalformedURLException e) { 
      LOG.error(e.getMessage(), e); 
     } 
     if (url == null) { 
      LOG.error("an issue with your url"); 
     }  
     WSDL_LOCATION = url; 
    } 

    public Weather(URL wsdlLocation) { 
     super(wsdlLocation, SERVICE); 
    } 

    public Weather(URL wsdlLocation, QName serviceName) { 
     super(wsdlLocation, serviceName); 
    } 

    public Weather() { 
     super(WSDL_LOCATION, SERVICE); 
    } 


    //All the other interface methods 

} 

mit Spring

wenn Sie Frühling verwenden Sie die Dinge noch einfacher machen können, können Sie Weather.java Klasse unter Verwendung von Konfigurationsdatei, wie unten dargestellt und lassen cxf erzeugen Proxy für Sie beseitigen.

<jaxws:client id="weatherSoap" serviceClass="com.cdyne.ws.weatherws.WeatherSoap" address="${app.weather.url}" /> 

Und Business Class würde wie folgt aussehen.

@Component 
MyBusinessLogic{ 

    @Autowired 
    private WeatherSoap weatherSoap; 

    public ArrayOfWeatherDescription getOutput(){ 
    return weatherSoap.getWeatherInformation(); 
    } 

} 
+0

Hallo Karthik, Danke für die Antwort. Es scheint sehr nützlich zu sein.Ich schätze es sehr, wenn Sie mich auf irgendeine Art von Referenz verweisen könnten, wie zum Beispiel eine Dokumentation oder eine Diskussion im Forum, die sich darauf beziehen. Vielen Dank. – prageeth

+0

Hier ist der Dokumentationslink http://cxf.apache.org/faq.html#FAQ-AreJAX-WSclientproxieshredasafe? Inkurz, bis Sie die Infrastrukturparameter nicht ändern CXF sind sicher, das gleiche gilt möglicherweise nicht für JAXRS –