fb
WSO2 Enterprise Integrator 7 minuten

Werken met eindpunten in de WSO2 EI (#1)

Rob Blaauboer
Rob Blaauboer
Integration Consultant & WSO2 Trainer
error message
Scroll

error-messageWanneer we werken met Enterprise Integrator kan een eindpunt gedefinieerd worden als bestemming van een proxy service of een API. Het kan zo eenvoudig zijn als deze URL: http://localhost:8280/services/AcmeProxy of een willekeurige andere URL die naar een locatie op het internet of ergens naar een plek binnen jouw IT-landschap wijst. Het maakt absoluut geen verschil.

In de voorbeelden van WSO2 zien we vaak een simpele eindpunt definitie, dus gewoon de URL, zonder dat de geavanceerde instellingen die met de beschikbaarheid en correcte reactietijd van de eindpunten te maken hebben geconfigureerd worden.

In deze blog over eindpunten ga ik kijken naar de configuratie van eindpunten in de WSO2 EI en hoe we foutmeldingen kunnen managen.

WSO2 banner

Een eenvoudige proxy

Ik creëer een eenvoudige proxy die een bericht neemt en naar een eindpunt stuurt. Het eindpunt zal gemaakt worden met WireMock, een simpele op Java gebaseerde service mocking tool die we ook in onze WSO2 trainingen gebruiken.

Voor de Proxy gebruik ik een set-up van Developer Studio en WSO2 EI 6.4.0 in Windows, waarbij het gaat om de gewone open-source versie van het product. Alles zal op Windows getest worden, maar voor Linux en Mac gaan de dingen op een vergelijkbare manier.

Ik ga niet in detail laten zien hoe we de WSO2 Enterprise integrator en Developer Studio/eclipse unzippen en installeren, want dan zou deze blog te lang worden.

De set-up is als volgt: een enterprise integrator 6.4.0 die draait met een poort offset van nul, die opgestart is in de Developer Studio omgeving en klaar is om proxy’s te gaan maken.

Wiremock

We gaan een mock backend service creëren die we kunnen gebruiken. In dit geval benutten we de mogelijkheid om de mock service met een JSON-bestand te maken. Maak het bestand met de volgende inhoud in bijv. Notepad++. Noem het bestand service.json en sla het op in de mappings-map die onder de locatie staat waar WireMock gestart is.

"request": {
        "method": "GET",
        "url": "/yenlo/api/test"
    },
    "response": {
        "status": 200,
        "body": "Service is respondingn"
    }
}

Dat ziet er dan zo uit:

Service Json - endpoints in WSO2 EI

Omdat wiremock op poort 8080 draait, zouden we nu de browser moeten kunnen gebruiken om een aanvraag te sturen naar de service die we zojuist gedefinieerd hebben. Als je geen service ziet, zul je WireMock opnieuw moeten opstarten. Wat we gedefinieerd hebben is eigenlijk een API, omdat we de methode bepalen (dat hier ‘GET’) en ook de URL die we in dit geval zullen gebruiken: /yenlo/api/test.

Nu hebben we een backend die we aan kunnen roepen, dus laten we dat doen. Laten we een API maken in Developer Studio.

Ik ga er vanuit dat je bekend bent met Developer Studio/Eclipse. Dat is een development omgeving die veel gebruikt wordt voor het ontwikkelen van EI artifacts. Als je er nog niet mee bekend bent, dan zou ik je aan willen raden om aan één van onze trainingen over de Enterprise Integrator te volgen. We leren je dan hoe je Developer Studio gebruikt en natuurlijk leer je daarnaast vanalles over de Enterprise Integrator.

SoapUI endpoint

In SoapUI kun je het eindpunt direct aanroepen met:

SoapUI Endpoint Explorer

En dit is de proxy die we creëerden en de respons.

Request Endpoints in WSO2 EI

Ik heb WireMock gestopt, dus er zal geen response komen.

Dit is de console output als er geen response is.

[2019-04-26 15:44:27,476] [EI-Core]  WARN - ConnectCallback Connection refused or failed for : localhost/127.0.0.1:8080
[2019-04-26 15:44:27,482] [EI-Core]  WARN - EndpointContext Endpoint : AnonymousEndpoint with address http://localhost:8080/yenlo/api/test will be marked SUSPENDED as it failed
[2019-04-26 15:44:27,483] [EI-Core]  WARN - EndpointContext Suspending endpoint : AnonymousEndpoint with address http://localhost:8080/yenlo/api/test - current suspend duration is : 30000ms - Next retry after : Fri Apr 26 15:44:57 CEST 2019
[2019-04-26 15:47:26,530] [EI-Core]  INFO - SourceHandler Writer null when calling informWriterError
[2019-04-26 15:47:26,531] [EI-Core]  WARN - SourceHandler Connection time out after request is read: http-incoming-2 Socket Timeout : 180000 Remote Address : /127.0.0.1:62473


Nu gaan we een log toevoegen aan de FaultSequence.

<div style="padding:15px; border:1px solid #a9a9a9; background:#f6f8fa;"><pre style="margin:0;"><code class="bash" style="border-color: transparent; background-color:transparent;"><?xml version=<strong>"1.0"</strong> encoding=<strong>"UTF-8"</strong>?><br><api context=<strong>"/test"</strong> name=<strong>"EPTest"</strong> xmlns=<strong>"http://ws.apache.org/ns/synapse"</strong>><br><strong>    </strong><resource methods=<strong>"GET"</strong>> <strong>        </strong><inSequence><br><strong>            </strong><send><br><strong>                </strong><endpoint><br><strong>                    </strong><http method=<strong>"get"</strong> uri-template=<strong>"http://localhost:8080/yenlo/api/test"</strong>/><br><strong>                </strong></endpoint><br><strong>            </strong></send><br><strong>        </strong></inSequence><br><strong>        </strong><outSequence><br><strong>            </strong><send/><br><strong>        </strong></outSequence><br><strong>        </strong><faultSequence><br><strong>            </strong><log description=<strong>""</strong> level=<strong>"custom"</strong>><br><strong>                </strong><property expression=<strong>"get-property('ERROR_CODE')"</strong> name=<strong>"Error"</strong>/><br><strong>            </strong></log><br><strong>        </strong></faultSequence><br><strong>    </strong></resource><br></api></code></pre></div>


We sturen deze API opnieuw naar de server en opnieuw roepen we de API aan, zonder dat WireMock runt.

[2019-05-08 12:40:12,130] [EI-Core]  INFO - LogMediator Error = 101503


De FaultSequence geeft eenvoudigweg de error code terug die overeenkomt met de situatie ‘Connection Failed’. We kunnen dit toevoegen:

<property expression="get-property('ERROR_MESSAGE')" name="MSG"/>

We krijgen nu de volgende foutmelding:

[2019-05-08 12:56:33,991] [EI-Core]  INFO - LogMediator Error = 101503, MSG = Error connecting to the back end


Deze situatie is al iets beter, maar wat je eigenlijk zou willen is dat er een correcte 404-code terugkomt en misschien wel een bericht als reactie (zoals: ‘Resource can not be found’). We gaan de response code in de faultSequence instellen.

Wat we hiermee eigenlijk doen, is dat we de faultSequence voor een deel herschrijven. We hebben een Log Mediator nodig die de output voor de console creëert en een formeel bericht voor de client die de proxy oproept. In Design View ziet het er zo uit:

Call Proxy in Design View

In de Source View zien we meer van de werkelijke configuratie. We laten alleen de FaultSequence zien.

<faultSequence>
  <log description="" level="custom">
    <property expression="get-property('ERROR_CODE')" name="Error"/>
    <property expression="get-property('ERROR_MESSAGE')" name="MessageSG"/>
    <property expression="get-property('ERROR_DETAIL')" name="Detail"/>
    <property expression=="get-property('ERROR_EXCEPTION’)" name="Exception"/>
  </log>
  <property name="HTTP_SC" scope="axis2" type="STRING" value="404"/>
    <payloadFactory media-type="json">
      <format>{ 'Error':'Connection cannot be made',
      'Error Code' : $1,
      'Error Message' : $2,
      'Error Detail' : $3}</format>
    <args>
      <arg evaluator="xml" expression="get-property('ERROR_CODE')"/>
      <arg evaluator="xml" expression="get-property('ERROR_EXCEPTION')"/>
      <arg evaluator="xml" expression="get-property('ERROR_MESSAGE')"/>
    </args>
  </payloadFactory>
  <respond/>
</faultSequence>

De output is:

[2019-05-08 15:02:17,424] [EI-Core]  INFO - LogMediator Error = 101503, MSG = Error connecting to the back end, Trace = Error connecting to the back end, exception = null

En aan de kant van de client:

HTTP/1.1 404 Not Found
Host: localhost:8280
Accept-Encoding: gzip,deflate
Content-Type: application/json; charset=UTF-8
Date: Wed, 08 May 2019 13:02:17 GMT
Transfer-Encoding: chunked
Connection: Keep-Alive 
{ 
   'Error':'Connection cannot be made',
   'Error Code' : 101503,
   'Error Message' : ,
   'Error Detail' : Error connecting to the back end
}
Error connecting Back end - endpoints in WSO2 EI

We hebben nu een API die reageert met een 404-code en een speciaal ingesteld bericht. In de volgende blog in de serie over eindpunten gaan we kijken naar een manier om fouten af te handelen met verschillende foutcodes.

Wil je meer leren over de WSO2 Enterprise Integrator? Neem deel aan onze WSO2 Enterprise Integrator Training.