2010-01-26 16 views
5

मेरे पास मेवेन के माध्यम से wsgen द्वारा उत्पन्न एक वेब सेवा है। जब मैं ग्लासफ़िश में सेवा को तैनात करता हूं तो यह सर्वर यूआरएल को डब्लूएसडीएल में रखता है। हमारे ग्लासफ़िश सर्वर को अपाचे प्रॉक्सी सर्वर द्वारा अग्रसर किया जाता है।ग्लासफ़िश जेनरेटेड डब्लूएसडीएल सेवा एंडपॉइंट पता ओवरराइड

यह सब क्या मतलब है जब कोई हमारे डबल्यूएसडीएल एक्सेस करता है और सेवा समाप्ति बिंदु पर लग रहा है और साबुन पता स्थान वे देखते हैं

http://app server url/service... 
बजाय

http://proxy server url/service... 

है मुझे लगता है मैं कुछ स्पष्टीकरण की जरूरत है कुछ वस्तुओं पर ...

  1. क्या यह एंडपॉइंट पता महत्वपूर्ण है? क्या ग्राहक अभी भी कार्य करने में सक्षम होंगे यदि एंडपॉइंट पता प्रॉक्सी सर्वर के यूआरएल से मेल नहीं खाता है, तो वे सेवा का आह्वान करने के लिए बुलाएंगे। यह मूल रूप से प्रश्न पूछता है "वेब सेवा के लिए डब्ल्यूएसडीएल है क्योंकि इंटरफ़ेस ऑब्जेक्ट करना है"।

    अद्यतन: इस पहला सवाल यह दिखाई न दे "इंटरफेस के रूप में वेब सेवा से डबल्यूएसडीएल आपत्ति करने के लिए है" कि के जवाब में। WSDL में निर्दिष्ट एंडपॉइंट पता महत्वपूर्ण नहीं है। वास्तव में, WSDL as described here में निर्दिष्ट एक की तुलना में एक अलग अंतराल पर एक वेब सेवा संचालन का आह्वान करना अपेक्षाकृत मामूली है। जब हम Glassfish को तैनात

     
    // Create service and proxy from the generated Service class. 
    HelloService service = new HelloService(); 
    HelloPort proxy = service.getHelloPort(); 
    
     
    // Override the endpoint address 
    ((BindingProvider)proxy).getRequestContext().put(
         BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
         " http://new/endpointaddress "); 
    proxy.sayHello("Hello World!"); 
    

  2. डबल्यूएसडीएल स्वचालित रूप से उत्पन्न होता है। ऐप सर्वर सेटिंग के माध्यम से ग्लासफ़िश में इस जेनरेट किए गए एंडपॉइंट पते को ओवरराइड करने का कोई आसान तरीका है। यदि ऐसा है, तो मैं जेनरेट डब्लूएसडीएल में प्रॉक्सी सर्वर यूआरएल स्वचालित रूप से रखने के लिए एक सेटिंग बना सकता हूं।

हैं 1 वास्तव में महत्वपूर्ण है और हम 2 के साथ किसी भी तरह से ओवरराइड नहीं कर सकते, तो यह मूल रूप से मतलब है कि हम विकास और उत्पादन के लिए अलग बनाता करने की आवश्यकता होगी। यह "सही महसूस नहीं करता" क्योंकि ऐसा लगता है कि मुझे एकमात्र चीज है जो हमें किसी अन्य सर्वर पर तैनात करने के लिए करने की आवश्यकता है, एक नए वातावरण पर एक पर्यावरण से मौजूदा (और परीक्षण) युद्ध छोड़ना है।

उत्तर

4

यह पता चला है कि Server Name पैरामीटर HTTP Listener पर है जहां सेवा तैनात की जाती है। आप ग्लासफ़िश प्रशासन कंसोल से यह मान निर्दिष्ट कर सकते हैं और ग्लासफ़िश अनुरोध URL में होस्ट नाम के बजाय इस नाम का उपयोग करेगा।

दुर्भाग्यवश, यह पैरामीटर आपको पोर्ट या प्रोटोकॉल (http से https) को ओवरराइड करने की अनुमति नहीं देगा यदि आपका ऐप सर्वर और प्रॉक्सी सर्वर उसी का उपयोग नहीं करता है (हमारा नहीं है)।

मेरे लिए यह संभालने के लिए मेरी सेवा के लिए मैंने write a simple servlet filter की बजाय क्या किया था।

3

मैंने पाया कि इस मुद्दे से निपटने के लिए मुझे एक बहुत ही सरल तरीका माना जाता है: अपाचे में mod_substitute का उपयोग करें। चूंकि हम में से इस समस्या के साथ पहले से ही अपाचे का उपयोग कर रहे हैं, और यह सरल और सरल है, मुझे यह दृष्टिकोण सबसे अच्छा लगा।

मैं अपने अपाचे conf फ़ाइलों में से एक में एक ब्लॉक नीचे के समान कर दिया और खुशी पाया:

<Location /> 
    AddOutputFilterByType SUBSTITUTE text/xml 
    Substitute "s|http://internal:8080/xxx|https://external/xxx|ni" 
</Location> 
संबंधित मुद्दे