2012-05-21 139 views
1

你好WSO2社區你好#1,WSO2 ESB服務編排

我的SOA套件從ESB開始的測試將會好:現在的ESB識別外部服務,創建返回正確的結果正確的代理服務器。

解決

關於這一點,我有兩個問題:第一個是, 「嘗試」 功能引發異常:

"Cannot find dispatch method for {http://schemas.xmlsoap.org/soap/envelope/}Envelope 

[tagOpened]/soapenv:文本[tagclosed]「

當我嘗試發送SOAP封裝爲 模擬服務創建的代理服務的Web服務。

無論如何,如果我嘗試從外部客戶端(上 NetBeans中創建)代理服務它的偉大工程。

ANSWER

在第一部分,其原因很可能是跨域問題的嘗試,它是通過Java腳本存根從 瀏覽器發送消息。你會發現,當服務 自己在ESB本身託管,因爲請求通過 同一個域這個偉大工程。這就是爲什麼,儘管,它完全通過 正常的客戶端調用,它不通過工作試穿它。

第二個問題是我無法編排兩項服務。我的目標是將第一個服務的輸入發送給第二個服務,然後發送給用戶。

我工作的教程Tharindu馬修建議:現在的一切對我來說很有意義,除了一兩件事:XSLT轉換。

這裏是失序的教程建議你創建:

<outSequence xmlns="http://ws.apache.org/ns/synapse"> 
    <switch source="get-property('STATE')"> 
     <case regex="PERSON_INFO_REQUEST"> 
     <log level="full"> 
      <property name="sequence" value="outSequence - STATE 01 - response from PersonInfoService" /> 
     </log> 
     <xslt key="xslt"> 
      <property name="amount" expression="get-property('ORG_AMOUNT')" /> 
     </xslt> 
     <log level="full"> 
      <property name="sequence" value="outSequence - STATE 01 - request for CreditService" /> 
     </log> 
     <property name="STATE" value="CREDIT_REQUEST" /> 
     <send> 
      <endpoint key="CreditEpr" /> 
     </send> 
     </case> 
     <case regex="CREDIT_REQUEST"> 
     <log level="full"> 
      <property name="sequence" value="outSequence - STATE 02 - response from CreditService" /> 
     </log> 
     <send /> 
     </case> 
    </switch> 
</outSequence> 

現在,聚焦開關的第一種情況的XSLT節點上,你可以看到有隻爲量特性的獲取。 因此,我認爲我們有一個來自序列的XML,它聲明瞭ID,並且這取決於數量屬性(我不知道它是什麼)。

教程則表明:

創建請求這個CrediService,我們使用與XSLT調解下XSLT。請注意,我們使用的是我們存儲在此XSLT作爲XSLT參數ORG_ID並使用XSLT調解爲好。

這裏是XSLT顯示,在教程:

<xsl:stylesheet version="2.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:fn="http://www.w3.org/2005/02/xpath-functions" 
     xmlns:ns="http://samples.esb.wso2.org" 
     xmlns:ax21="http://samples.esb.wso2.org/xsd" 
     exclude-result-prefixes="ns fn"> 
<xsl:param name="amount"/> 
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="//ns:getResponse" /> 
</xsl:template> 

<xsl:template match="ns:getResponse" xmlns:ns="http://samples.esb.wso2.org"> 
<sam:credit xmlns:sam="http://samples.esb.wso2.org" xmlns:xsd="http://samples.esb.wso2.org/xsd"> 
    <sam:info> 
     <xsd:amount><xsl:value-of select="$amount"/></xsd:amount> 
     <xsd:personInfo> 
      <xsd:address><xsl:value-of select="ns:return/ax21:address"/></xsd:address> 
      <xsd:id><xsl:value-of select="ns:return/ax21:id"/></xsd:id> 
      <xsd:name><xsl:value-of select="ns:return/ax21:name"/></xsd:name> 
     </xsd:personInfo> 
    </sam:info> 
</sam:credit> 
</xsl:template> 
</xsl:stylesheet> 

有人問我把一個類似的文件到WSO2 ESB的資源目錄,但該文件從來沒有在教程中使用:

複製personToCredit.xslt樣品壓縮到WSO2 ESB的資源目錄。

--------- LITTLE PARENTHESIS -----------

未使用WSDL文件後,要麼有人說:

將示例zip中的CreditProxy.wsdl複製到WSO2 ESB的資源目錄中。

我在配置/治理註冊表中找不到WSDL文件,我不知道如何解決它,所以我選擇將其指定爲內聯。

--------- LITTLE PARENTHESIS END -----------

這句話後面是XSLT文件的文本。我現在的主要問題是:

應該在哪裏我把這個XSLT?我不知道該把XSLT中介放在哪裏,也不知道如何構建它。 我應該依賴註冊管理機構嗎?

一個完美的答案可能是失序的代碼,並與XSLT調解員指定的連接建議。

OverTheBitStair

回答

1

嗨OverTheBitStair(不錯尼克!),

在第一部分,其原因很可能是跨域問題的嘗試,它是通過Java腳本樁從瀏覽器發送消息。您會注意到,當服務本身託管在ESB本身中時,這很有效,因爲請求通過同一個域。這就是爲什麼,雖然它通過正常的客戶端調用完美地工作,但它不能通過嘗試它工作。

對於第二部分,簡單的答案是肯定的,這是可能的。就ESB而言,除了作爲調解引擎之外,我們還將其稱爲輕量級協調引擎。這意味着,重量輕,短命(< 1天)處理就可以解決使用ESB的編排要求,而不會帶來業務流程服務器英寸

要做到這一點,我們用這個方法調用的服務鏈。它所做的是引入一種方法,從初始服務調用中獲取一些輸出,並在隨後的調用中使用它。文章WSO2 ESB by example - Service Chaining應該幫助您瞭解您所查找內容的實施細節。

希望這會有所幫助。

+0

嗨Tharindu馬修,謝謝你的幫助!我現在瞭解跨域問題,並且這不再是問題。 第二部分比我想象的要複雜得多。我試圖按照教程中的說明操作:我按順序內聯定義了CreditProxy內聯WSDL,但不接受序列。 我不明白的另一點是:XSLT文檔在哪裏起作用?此外,教程中顯示的XSL部分是否必須包含在輸出序列中? 你能爲我提取出序列嗎? 感謝您的幫助,我希望我能夠幫助您回到一天 – OverTheBitStair

+0

出序列集! 我在出序列中嵌入了XSLT文檔(也許這是錯誤的)。 從SoapUI進行調用時,ESB引發異常:「發送消息時發生意外錯誤」。 如果有人能告訴我我錯了,我會立即修復! – OverTheBitStair

+0

終端/控制檯上是否存在堆棧跟蹤?這應該給更多的細節。我需要更多的信息來確定錯誤是什麼。 –

0

如果你創建一個服務鏈方案,其中代理服務調用的其他兩個服務,並將結果返回到代理服務的調用者,它會是這個樣子:

來電 - >代理服務 - seq_A - > Service1 - seq_B - > Service2 - seq_C - >(代理服務響應) - >調用者

在這種情況下,seq_A將成爲代理服務的序列,seq_C out序列的代理服務和seq_B另一個命名序列。

對seq_A的輸入(即消息主體)將是代理服務的輸入。 seq_A將在最後包含一個發送中介,並且在該序列中,消息上下文將作爲Service1的輸入。發送中介也指向seq_B將被執行的答覆。

在seq_B開始時,消息體包含Service1的輸出。如果您想在服務調用之前保留一些消息數據,則需要將其保存在上下文中的屬性中。 在seq_B的結尾處,您將有一個發送中介;那麼消息體應該包含Service2的輸入,如果seq_C是代理服務的輸出序列,則發送中介器在這種情況下不需要指向顯式的答覆序列 - 那麼默認情況下會使用該序列。

當seq_C執行時,此時的消息體是來自Service2的響應。同樣,如果您需要在調用Service2之前使用/結合某些數據,則需要將其保存到屬性中。

根據每個步驟所需的輸入和轉換的特定需求,它可能相當簡單或者處理起來有點麻煩。 還應該考慮在錯誤情況下需要發生的情況,因爲這可能會增加一些額外的複雜性,具體取決於需求。

+0

謝謝Erikl,此解釋向我澄清了ESB中的微流如何工作。 我想知道,當你說「_發送中介也指向seq_B被執行的reply._」SEQ_B是定義的代理服務構建框架,對吧? – OverTheBitStair

+0

是的,這是正確的。 – erikl