আমি কীভাবে জ্যাকস-ডাব্লুএস ওয়েবসার্চ ক্লায়েন্টের টাইমআউট সেট করব?


93

আমি ডাব্লুএসডিএল ভিত্তিক আমার ওয়েব পরিষেবার জন্য একটি ইন্টারফেস তৈরি করতে JAXWS-RI 2.1 ব্যবহার করেছি। আমি কোনও সমস্যায় ওয়েব পরিষেবাদির সাথে ইন্টারঅ্যাক্ট করতে পারি তবে ওয়েব পরিষেবায় অনুরোধ প্রেরণের জন্য টাইমআউট নির্দিষ্ট করতে সক্ষম হয়েছি। যদি কোনও কারণে এটি ক্লায়েন্টের প্রতিক্রিয়া না করে তবে চাকাটি চিরকালের জন্য স্পিন করে বলে মনে হচ্ছে।

আশেপাশে শিকার প্রকাশ করেছে যে আমার সম্ভবত এমন কিছু করার চেষ্টা করা উচিত:

((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.connect.timeout", 10000);

আমি এটিও আবিষ্কার করেছি যে আপনার কাছে জ্যাকএক্সডাব্লুএস-আরআইয়ের কোন সংস্করণ নির্ভর করে তার পরিবর্তে আপনাকে এই বৈশিষ্ট্যগুলি সেট করার প্রয়োজন হতে পারে:

((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 10000);

আমার সমস্যাটি হ'ল উপরের কোনটি সঠিক তা নির্বিশেষে আমি জানি না আমি কোথায় এটি করতে পারি। আমি যা পেয়েছি তা হ'ল একটি Serviceসাবক্লাস যা ওয়েবসাইসিসে স্বয়ংক্রিয়ভাবে উত্পন্ন ইন্টারফেস প্রয়োগ করে এবং এটি যে তাত্ক্ষণিকভাবে চালু হচ্ছে, যদি ডাব্লুএসডিএল যদি সাড়া না দেয় তবে বৈশিষ্ট্যগুলি সেট করতে ইতিমধ্যে খুব দেরি হয়ে গেছে:

MyWebServiceSoap soap;
MyWebService service = new MyWebService("http://www.google.com");
soap = service.getMyWebServiceSoap();
soap.sendRequestToMyWebService();

কেউ কি আমাকে সঠিক দিকে নির্দেশ করতে পারে ?!


5
আমি মনে করি না যে আপনার কাছে আমার একটি উত্তর আছে, তবে আপনার প্রশ্ন আমাকে আমার সমস্যা সমাধানে সহায়তা করেছে। আমি com.sun.xML.ws.request.timeout সম্পত্তি সম্পর্কে জানতাম তবে com.sun.xML.intern.ws.request.Timeout সম্পর্কে নয়।
রন টফিন

উত্তর:


91

আমি জানি এটি পুরানো এবং অন্য কোথাও উত্তর দেওয়া হয়েছে তবে আশা করি এটি এটিকে বন্ধ করে দেয়। আমি নিশ্চিত নই কেন আপনি ডাব্লুএসডিএলকে গতিশীলভাবে ডাউনলোড করতে চাইবেন তবে সিস্টেমের বৈশিষ্ট্যগুলি:

sun.net.client.defaultConnectTimeout (default: -1 (forever))
sun.net.client.defaultReadTimeout (default: -1 (forever))

জ্যাক্স-ডাব্লুএস ব্যবহার করে এমন সমস্ত HTTP URL সংযোগ ব্যবহার করে সমস্ত পাঠের ক্ষেত্রে প্রযোজ্য এবং সংযোগ স্থাপন করা উচিত। আপনি যদি কোনও দূরবর্তী অবস্থান থেকে ডাব্লুএসডিএল পান তবে এটি আপনার সমস্যার সমাধান করা উচিত - তবে আপনার স্থানীয় ডিস্কের একটি ফাইল সম্ভবত আরও ভাল!

এরপরে, আপনি যদি নির্দিষ্ট পরিষেবাগুলির জন্য টাইমআউট সেট করতে চান, একবার আপনার প্রক্সি তৈরি করার পরে এটি এটিকে একটি বাইন্ডিংপ্রাইডার (যা আপনি ইতিমধ্যে জানেন) এ ফেলে দিতে হবে, অনুরোধের প্রসঙ্গটি পাবেন এবং আপনার বৈশিষ্ট্যগুলি সেট করুন। অনলাইন জ্যাক্স-ডাব্লুএস ডকুমেন্টেশনগুলি ভুল, এগুলি সঠিক সম্পত্তির নাম (ভাল, তারা আমার পক্ষে কাজ করে)।

MyInterface myInterface = new MyInterfaceService().getMyInterfaceSOAP();
Map<String, Object> requestContext = ((BindingProvider)myInterface).getRequestContext();
requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, 3000); // Timeout in millis
requestContext.put(BindingProviderProperties.CONNECT_TIMEOUT, 1000); // Timeout in millis
myInterface.callMyRemoteMethodWith(myParameter);

অবশ্যই এটি করার একটি ভয়ঙ্কর উপায়, আমি এই বাঁধাই সরবরাহকারীদের উত্পাদন করার জন্য একটি সুন্দর কারখানা তৈরি করব যা আপনার পছন্দসই সময়সীমার সাথে ইনজেকশন দেওয়া যায়।


10
মনে রাখবেন যে REQUEST_TIMEOUT / CONNECT_TIMEOUT বৈশিষ্ট্যগুলি আসলে সান-অভ্যন্তরীণ শ্রেণীর com.sun.xML.intern.ws.developer.JAXWSProperties এবং (কমপক্ষে 32-বিট লিনাক্সে) জাভ্যাক 1.6.0_27 এবং জাভ্যাক 1.7.0_03 থেকে ব্যর্থ হয়েছে inher এই কোডটি সংকলন করুন ( বাগসসন.ভিউ_বগ.ডো? বুগ_আইডি=6544224 এর অনুরূপ ) ... এটির কাজ করতে আপনাকে জাভ্যাক -XDignore.symbol.file পাস করতে হবে।
জাভাগুয়ে

কি কাজ করে না? আমি এটি কেবল ডাবল পরীক্ষা করে দেখেছি এবং এটি আমার জন্য কাজ করছে।
আল্পিয়ান

আমি কেবল এটি JAX-WS RI 2.2.8 এবং JDK 1.7 এর সাথে ব্যবহার করেছি এবং এটি ঠিক কাজ করেছে confir ধন্যবাদ!
বোনি্ন

যে শ্রেণীর এবং পরামিতিগুলির সম্পূর্ণরূপে যোগ্য নামে "অভ্যন্তরীণ" রয়েছে সেগুলি ব্যবহার করা উচিত নয়, যেহেতু বিক্রেতা-নির্ভর এবং সুতরাং বিভিন্ন জেডিকে বাস্তবায়নের মধ্যে বহনযোগ্য নয়। জ্যাক্স-ডাব্লুএস প্যারামিটারগুলির ক্ষেত্রে, উদাহরণস্বরূপ, সংশ্লিষ্ট অ অভ্যন্তরীণ বৈশিষ্ট্যগুলি com.sun.xML.ws.client.BindProviderProperties শ্রেণিতে বিদ্যমান।
পোলারেটো

4
@ ম্যাট ১76 yes76 হ্যাঁ অবশ্যই এটি নিখোঁজ রয়েছে: জ্যাকস-ডাব্লুএস যখন একটি এপিআই স্পেসিফিকেশন, আপনার ক্ষেত্রে একটি লাইব্রেরি বাস্তবায়ন দরকার, এই ক্ষেত্রে জ্যাকসউ-রি.জার বা জ্যাকসউস-আরটি.জার, যা জেডিকের অংশ নয়। আপনার কেবল এটি ডাউনলোড করতে হবে এবং এটি আপনার টোপজেক্টে যুক্ত করতে হবে এবং আপনার সেই বৈশিষ্ট্যগুলি উপলব্ধ।
পোলারেটে

45

গৃহীত উত্তরের বৈশিষ্ট্যগুলি আমার পক্ষে কার্যকর হয়নি, সম্ভবত আমি জ্যাকস-ডাব্লুএস এর JBoss বাস্তবায়নটি ব্যবহার করছি বলে?

বৈশিষ্ট্যগুলির একটি আলাদা সেট ( JBoss JAX-WS ব্যবহারকারী নির্দেশিকায় পাওয়া যায় ) ব্যবহার করে এটি কার্যকর হয়েছে:

//Set timeout until a connection is established
((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.connectionTimeout", "6000");

//Set timeout until the response is received
((BindingProvider) port).getRequestContext().put("javax.xml.ws.client.receiveTimeout", "1000");

4
আমি জেবস ব্যবহার করছি না, তবে কেবলমাত্র এই মন্তব্যে থাকা বৈশিষ্ট্যগুলি আমার পক্ষে কাজ করেছে, অন্য কিছুই করেনি।
পলপি 21

4
সম্পত্তির নাম জ্যাকস-ডাব্লুএস বাস্তবায়নের উপর নির্ভর করে। : একটি তালিকা পাওয়া যাবে এখানে java.net/jira/browse/JAX_WS-1166
fabstab

4
java.net লিঙ্কটি নষ্ট হয়ে গেছে। github.com/javaee/metro-jax-ws/issues/1166
ট্রাঙ্কস

12

এখানে আমার কাজের সমাধান:

// --------------------------
// SOAP Message creation
// --------------------------
SOAPMessage sm = MessageFactory.newInstance().createMessage();
sm.setProperty(SOAPMessage.WRITE_XML_DECLARATION, "true");
sm.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "UTF-8");

SOAPPart sp = sm.getSOAPPart();
SOAPEnvelope se = sp.getEnvelope();
se.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");
se.setAttribute("xmlns:SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/");
se.setAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
se.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");

SOAPBody sb = sm.getSOAPBody();
// 
// Add all input fields here ...
// 

SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection();
// -----------------------------------
// URL creation with TimeOut connexion
// -----------------------------------
URL endpoint = new URL(null,
                      "http://myDomain/myWebService.php",
                    new URLStreamHandler() { // Anonymous (inline) class
                    @Override
                    protected URLConnection openConnection(URL url) throws IOException {
                    URL clone_url = new URL(url.toString());
                    HttpURLConnection clone_urlconnection = (HttpURLConnection) clone_url.openConnection();
                    // TimeOut settings
                    clone_urlconnection.setConnectTimeout(10000);
                    clone_urlconnection.setReadTimeout(10000);
                    return(clone_urlconnection);
                    }
                });


try {
    // -----------------
    // Send SOAP message
    // -----------------
    SOAPMessage retour = connection.call(sm, endpoint);
}
catch(Exception e) {
    if ((e instanceof com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl) && (e.getCause()!=null) && (e.getCause().getCause()!=null) && (e.getCause().getCause().getCause()!=null)) {
        System.err.println("[" + e + "] Error sending SOAP message. Initial error cause = " + e.getCause().getCause().getCause());
    }
    else {
        System.err.println("[" + e + "] Error sending SOAP message.");

    }
}

4
এই কনফিগারেশনগুলি কি "javax.xML.ws.client.connectionTimeout" এবং "javax.xML.ws.client.reসেপটাইমআউট" এর সমতুল্য ??
হোসে টেপেডিনো

আমার জন্য এই সমাধানটি ওয়েবলোগিকটিতে কাজ করে না। একটি সাধারণ জাভা ক্লাসে চলার সময় এটি দুর্দান্ত কাজ করে। এর জন্য কোনও ত্রুটিযুক্ত স্ট্যাক দেখতে না পাওয়ায় কারণটি কী হতে পারে কোনও ধারণা।
শ্রুতি

11
ProxyWs proxy = (ProxyWs) factory.create();
Client client = ClientProxy.getClient(proxy);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(0);
httpClientPolicy.setReceiveTimeout(0);
http.setClient(httpClientPolicy);

এটি আমার পক্ষে কাজ করেছে।


ধন্যবাদ! আমার পক্ষেও এটি একটি খুব সহজ উপায়
kosm

4
এটি যদিও অ্যাপাচি সিএক্সএফ ক্লাস ব্যবহার করে, উত্তরে এটি যুক্ত করা ভাল। একটি লিঙ্ক যার সাথে সিএক্সএফ জারগুলি রয়েছে সেগুলিও অনেক সহায়তা করবে।
জেবার্ট

@ জেবার্ট আমি সম্মত আমি এই বছর আগে উত্তর দিয়েছি এবং মনে করতে পারে না। উত্তর সম্পাদনা করতে নির্দ্বিধায়।
ড্যানিয়েল

8

আপনি যদি JDK6 এ JAX-WS ব্যবহার করছেন তবে নিম্নলিখিত বৈশিষ্ট্যগুলি ব্যবহার করুন:

com.sun.xml.internal.ws.connect.timeout  
com.sun.xml.internal.ws.request.timeout

System.setProperty ("com.sun.xML.intern.ws.connect.timeout", "300"); System.setProperty ("com.sun.xML.intern.ws.request.timeout", "300") আমার পক্ষে কাজ করেছে।
2787184

4
কিছু প্রসঙ্গে, আপনি প্রোগ্রামিং-সময় জানেন না যা জ্যাকসডব্লিউএস সংস্করণ (অভ্যন্তরীণ বা স্বতন্ত্র) রান-টাইম ব্যবহৃত হবে। এই সময়সীমা-বৈশিষ্ট্যটি বাদে দু'টি বেশ সামঞ্জস্যপূর্ণ। কীগুলি পৃথক ( com.sun.xml.internal.ws.connect.timeoutবনাম com.sun.xml.ws.connect.timeout) এছাড়াও শ্রেণি (বা ইন্টারফেস) যা তাদের ( com.sun.xml.internal.ws.developer.JAXWSProperties/ com.sun.xml.internal.ws.client.BindingProviderPropertiesবনাম com.sun.xml.ws.developer.JAXWSProperties/ com.sun.xml.ws.client.BindingProviderProperties) সংজ্ঞায়িত করে । আমার সেরা ধারণাটি উভয়টি সেট করে, কী হিসাবে আক্ষরিক মানগুলি ব্যবহার করে।
লরিঞ্জি জিসিগমন্ড

5

যদি আপনার অ্যাপসভারটি ওয়েবলজিক হয় (আমার জন্য এটি ছিল 10.3.6) তারপরে টাইমআউটগুলির জন্য দায়ী বৈশিষ্ট্যগুলি হ'ল:

com.sun.xml.ws.connect.timeout 
com.sun.xml.ws.request.timeout

3

এটি আপনার প্রসঙ্গে সহায়তা করবে কিনা তা নিশ্চিত নয় ...

কী সাবান অবজেক্টটিকে বাইন্ডিংপ্রোভাইডার হিসাবে কাস্ট করা যেতে পারে?

MyWebServiceSoap soap;
MyWebService service = new MyWebService("http://www.google.com");
soap = service.getMyWebServiceSoap();
// set timeouts here
((BindingProvider)soap).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000);
    soap.sendRequestToMyWebService();

অন্যদিকে আপনি যদি মাইওয়েবসোভার্সিটি অবজেক্টের সূচনাতে সময়সীমা নির্ধারণ করতে চান তবে এটি কোনও সাহায্য করবে না।

পৃথক ওয়েব সার্ভিস কলগুলির সময়সীমা শেষ করতে চাইলে এটি আমার পক্ষে কাজ করে।


2

আপনি যখন আপনার এসইআই ইনস্ট্যান্ট করবেন তখন দূরবর্তী ডাব্লুএসডিএলকে ধীরে ধীরে পুনরুদ্ধার এড়ানোর সহজতম উপায় হ'ল রানটাইমে দূরবর্তী পরিষেবা শেষ পয়েন্ট থেকে ডাব্লুএসডিএল পুনরুদ্ধার না করা।

এর অর্থ হ'ল পরিষেবা প্রদানকারী যখন কোনও প্রভাব ফেলতে পারে তখন আপনাকে নিজের স্থানীয় ডাব্লুএসডিএল অনুলিপি আপডেট করতে হবে, তবে এর অর্থ হ'ল পরিষেবা প্রদানকারী যখন কোনও প্রভাব ফেলবে তখন যে কোনও সময় আপনাকে আপনার স্থানীয় অনুলিপিটি আপডেট করতে হবে।

আমি যখন আমার ক্লায়েন্ট স্টাবগুলি উত্পন্ন করি, তখন আমি জ্যাক্স-ডাব্লুএস রানটাইমকে এসইআইকে এমনভাবে বর্ননা করতে বলি যে এটি ক্লাসপাথের পূর্ব নির্ধারিত অবস্থান থেকে ডাব্লুএসডিএল পড়বে। ডিফল্টরূপে অবস্থান পরিষেবা SEI এর প্যাকেজ অবস্থানের সাথে সম্পর্কিত


<wsimport
    sourcedestdir="${dao.helter.dir}/build/generated"
    destdir="${dao.helter.dir}/build/bin/generated"
    wsdl="${dao.helter.dir}/src/resources/schema/helter/helterHttpServices.wsdl"
    wsdlLocation="./wsdl/helterHttpServices.wsdl"
    package="com.helter.esp.dao.helter.jaxws"
    >
    <binding dir="${dao.helter.dir}/src/resources/schema/helter" includes="*.xsd"/>
</wsimport>
<copy todir="${dao.helter.dir}/build/bin/generated/com/helter/esp/dao/helter/jaxws/wsdl">
    <fileset dir="${dao.helter.dir}/src/resources/schema/helter" includes="*" />
</copy>

ডাব্লুএসএলএলএকশন বৈশিষ্ট্যটি এসইআইকে জানায় যে ডাব্লুএসডিএল কোথায় পাওয়া যাবে এবং অনুলিপিটি নিশ্চিত করে যে ডাব্লুএসডিএল (এবং এক্সএসডি সমর্থনকারী .. ইত্যাদি ..) সঠিক জায়গায় রয়েছে location

যেহেতু অবস্থানটি এসআই'র প্যাকেজ অবস্থানের সাথে সম্পর্কিত, তাই আমরা ডাব্লুএসডিএল নামে একটি নতুন উপ-প্যাকেজ (ডিরেক্টরি) তৈরি করি এবং সেখানে সমস্ত ডাব্লুএসডিএল শিল্পকলাগুলি অনুলিপি করি।

এই মুহুর্তে আপনাকে যা করতে হবে তা নিশ্চিত করে আপনি যখন আপনার ক্লায়েন্ট-স্টাব আর্টিফ্যাক্ট জার ফাইলটি তৈরি করেন তখন আপনি সমস্ত * .wsdl, * .xsd এর সাথে সমস্ত * .class অন্তর্ভুক্ত করেছেন।

(আপনার কৌতূহলের ক্ষেত্রে, @webserviceClient টীকাটি যেখানে এই ডাব্লুএসডিএল অবস্থানটি আসলে জাভা কোডে সেট করা আছে)

@WebServiceClient(name = "httpServices", targetNamespace = "http://www.helter.com/schema/helter/httpServices", wsdlLocation = "./wsdl/helterHttpServices.wsdl")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.