Saya telah menggunakan JAXWS-RI 2.1 untuk membuat antarmuka untuk layanan web saya, berdasarkan WSDL. Saya dapat berinteraksi dengan layanan web tanpa masalah, tetapi belum dapat menentukan waktu tunggu untuk mengirim permintaan ke layanan web. Jika karena alasan tertentu tidak merespons, klien sepertinya memutar rodanya selamanya.
Berburu di sekitar telah mengungkapkan bahwa saya mungkin harus mencoba melakukan sesuatu seperti ini:
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.connect.timeout", 10000);
Saya juga menemukan bahwa, bergantung pada versi JAXWS-RI yang Anda miliki, Anda mungkin perlu menyetel properti ini sebagai gantinya:
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 10000);
Masalah yang saya miliki adalah, terlepas dari yang mana di atas yang benar, saya tidak tahu di mana saya bisa melakukan ini. Yang saya dapatkan hanyalah Service
subclass yang mengimplementasikan antarmuka yang dihasilkan secara otomatis ke webservice dan pada titik ini semakin instan, jika WSDL tidak responsif maka sudah terlambat untuk mengatur properti:
MyWebServiceSoap soap;
MyWebService service = new MyWebService("http://www.google.com");
soap = service.getMyWebServiceSoap();
soap.sendRequestToMyWebService();
Adakah yang bisa mengarahkan saya ke arah yang benar ?!
Jawaban:
Saya tahu ini sudah tua dan dijawab di tempat lain tetapi mudah-mudahan ini menutupnya. Saya tidak yakin mengapa Anda ingin mengunduh WSDL secara dinamis tetapi properti sistem:
harus berlaku untuk semua pembacaan dan koneksi menggunakan HttpURLConnection yang digunakan JAX-WS. Ini seharusnya menyelesaikan masalah Anda jika Anda mendapatkan WSDL dari lokasi jarak jauh - tetapi file di disk lokal Anda mungkin lebih baik!
Selanjutnya, jika Anda ingin menyetel waktu tunggu untuk layanan tertentu, setelah Anda membuat proxy, Anda perlu mentransmisikannya ke BindingProvider (yang sudah Anda ketahui), dapatkan konteks permintaan dan setel properti Anda. Dokumentasi JAX-WS online salah, ini adalah nama properti yang benar (yah, itu berfungsi untuk saya).
Tentu saja, ini adalah cara yang mengerikan untuk melakukan sesuatu, saya akan membuat pabrik yang bagus untuk memproduksi penyedia penjilidan ini yang dapat diinjeksi dengan batas waktu yang Anda inginkan.
sumber
Properti dalam jawaban yang diterima tidak berfungsi untuk saya, mungkin karena saya menggunakan implementasi JBoss dari JAX-WS?
Menggunakan sekumpulan properti yang berbeda (ditemukan di Panduan Pengguna JBoss JAX-WS ) membuatnya berfungsi:
sumber
Inilah solusi kerja saya:
sumber
Ini berhasil untuk saya.
sumber
Jika Anda menggunakan JAX-WS di JDK6, gunakan properti berikut ini:
sumber
com.sun.xml.internal.ws.connect.timeout
vscom.sun.xml.ws.connect.timeout
) juga kelas (atau antarmuka) yang menentukannya (com.sun.xml.internal.ws.developer.JAXWSProperties
/com.sun.xml.internal.ws.client.BindingProviderProperties
vscom.sun.xml.ws.developer.JAXWSProperties
/com.sun.xml.ws.client.BindingProviderProperties
). Ide terbaik saya adalah mengatur keduanya, menggunakan nilai literal sebagai kunci.Jika server aplikasi Anda adalah WebLogic (bagi saya itu 10.3.6) maka properti yang bertanggung jawab atas waktu tunggu adalah:
sumber
Tidak yakin apakah ini akan membantu dalam konteks Anda ...
Bisakah objek sabun dilemparkan sebagai BindingProvider?
Di sisi lain, jika Anda ingin mengatur waktu tunggu pada inisialisasi objek MyWebService, ini tidak akan membantu.
Ini berhasil untuk saya ketika ingin timeout panggilan WebService individu.
sumber
cara termudah untuk menghindari pengambilan WSDL jarak jauh yang lambat saat Anda membuat instance SEI adalah dengan tidak mengambil WSDL dari titik akhir layanan jarak jauh saat runtime.
ini berarti Anda harus memperbarui salinan WSDL lokal Anda setiap kali penyedia layanan membuat perubahan yang berdampak, tetapi itu juga berarti Anda harus memperbarui salinan lokal Anda setiap kali penyedia layanan membuat perubahan yang berdampak.
Ketika saya membuat stub klien saya, saya memberi tahu runtime JAX-WS untuk memberi anotasi pada SEI sedemikian rupa sehingga ia akan membaca WSDL dari lokasi yang ditentukan sebelumnya di classpath. secara default lokasinya relatif terhadap lokasi paket Service SEI
atribut wsldLocation memberitahu SEI di mana dapat menemukan WSDL, dan salinan memastikan bahwa wsdl (dan mendukung xsd .. dll ..) berada di lokasi yang benar.
karena lokasinya relatif terhadap lokasi paket SEI, kami membuat sub-paket baru (direktori) bernama wsdl, dan menyalin semua artefak wsdl di sana.
yang harus Anda lakukan pada tahap ini adalah memastikan Anda menyertakan semua * .wsdl, * .xsd selain semua * .class saat Anda membuat file jar artefak klien-stub.
(jika Anda penasaran, anotasi @webserviceClient adalah tempat lokasi wsdl ini sebenarnya disetel dalam kode java
sumber