Follow Us on Twitter

Geavanceerde Service Scheduling in SOA Suite 12c met ESS

November 2014 – In 2011 bracht de release van Oracle Fusion Applications 11g ons al de Oracle Enterprise Scheduling Services (ESS). Met ESS is het mogelijk om verschillende soorten Jobs te definiëren en omdat het op een Oracle Weblogic Cluster draait is het schaalbaar, high available en secure. Met deze versie was het al mogelijk om verschillende Job types aan te roepen, zoals Java en PL/SQL Jobs. In Fusion Middleware 12c is de functionaliteit van ESS verder gegroeid.

Inmiddels is ESS een belangrijk onderdeel van de gehele Fusion Middleware stack. Het is dus niet verwonderlijk dat Oracle ESS nu ook heeft uitgebracht als deel van SOA Suite 12c. Met die introductie is een krachtig nieuw gereedschap toegevoegd aan de SOA Suite. Met ESS kunnen Jobs worden ingepland, kunnen afhankelijkheden tussen Jobs worden aangegeven en kunnen services zelfs volgens een bepaalde agenda worden aan- en uitgezet.

In dit Whitebook geven we een overzicht van ESS en laten we aan de hand van enkele voorbeelden de mogelijkheden zien.

ESS in SOA Suite 12c

Bij een installatie van de Oracle SOA Suite 12c wordt Enterprise Scheduler Services automatisch mee geïnstalleerd, maar deployment van ESS is optioneel. Bij de Quickstart SOA Suite 12c installatie die wordt aangeboden door Oracle, wordt ESS overigens niet meegeleverd. Dat is omdat ESS een Oracle database vereist. Voor dit Whitebook gaan we dus uit van een volledige installatie, inclusief Oracle Database.

Eenmaal gedeployed is ESS te vinden via de Enterprise Manager. Bij een standaard installatie is die via het URL http://<mijndomain>:7001/em te bereiken.

Enterprise Manager met ESSAPP

Figuur 1: Enterprise Manager met ESSAPP

De Job types die aangeroepen kunnen worden door ESS zijn:

  • Java
  • Web Service
  • EJB (Enterprise Java Bean)
  • Command-line scripts
  • PL/SQL Jobs

In de eerste release van ESS voor SOA Suite 12c zijn nog een aantal beperkingen. Hoewel het aanroepen van PL/SQL Jobs en Java Jobs in ESS is ondersteund, geldt dit nog niet voor SOA klanten. Het advies is om dit type Jobs voorlopig via een Service interface (Java) of de DB Scheduler danwel een composite (PL/SQL) aan te roepen. Ook is de volledige set van Java API’s nog niet ondersteund, maar de verwachting is dat dit alles in één van de volgende releases wel wordt ondersteund.

Schedulen van een Job in Enterprise Manager

Er zijn vele verschillende scenario’s te bedenken voor het nut van functionaliteit die automatisch op gezette tijden gestart moet worden. In dit Whitebook gebruiken we als voorbeeld een payrolling systeem.

Bedrijf Van Klanteren heeft een groot aantal werknemers in dienst. Om de salarisbetalingen gemakkelijk uit te laten voeren, heeft Van Klanteren ervoor gekozen om services te bouwen, die de onderliggende functionaliteit aanroepen.

Om het geheel nog efficiënter te laten verlopen, wil Van Klanteren nu graag dat de service die de salarisbetalingen uitvoert, elke maand automatisch op hetzelfde moment wordt aangeroepen, zonder dat hier menselijk handelen voor nodig is. Hiervoor wil Van Klanteren ESS gaan inzetten.
Voor dit Whitebook is het niet belangrijk om in te gaan op de inhoud van de services, daarom is gekozen voor een basis SOA service met een JCA Adapter die een betalingsbestand klaarzet op een locatie. Om deze service nu vervolgens als een Job klaar te zetten, moeten er een aantal handelingen gedaan worden.
Allereerst navigeren we naar de ESSAPP in Enterprise Manager. Bovenin het rechterscherm is nu de knop "Scheduling Service" te zien. Als we hierop klikken verschijnt een menu met diverse opties. Om verder te gaan kiezen we voor "Job Metadata" en daarna voor "Job Definitions".

Scheduling Service menu

Figuur 2: Scheduling Service menu

In het scherm dat daarna wordt getoond, is een overzicht te zien van bestaande Job definities. Hieraan kunnen we onze eigen Job toevoegen door op de knop "Create" te klikken. Het systeem vraagt ons vervolgens om de gegevens van de aan te roepen service op te geven. Als we bij Job Type kiezen voor een WebserviceJobType (hier is een Oneway WebserviceJobType geselecteerd), verschijnt automatisch een knop om de WSDL van de service op te halen.

Overzicht Job Definition

Figuur 3: Overzicht Job Definition

In dit geval voeren we de gegevens in van de webservice "salarisBetalingen" die we voor dit doel hebben gemaakt. Als alles is ingevuld en op OK is geklikt, staat de Job in de lijst.

Lijst met Job Definitions

Figuur 4: Lijst met Job Definitions

Nu de Job bestaat, kunnen we deze gaan schedulen. Dit gebeurt door te navigeren via de knop "Scheduling Service" bovenin het scherm en dan te kiezen voor "Job Requests" en "Submit Job Request".

Submit Job Request

Figuur 5: Submit Job Request

In het volgende scherm kunnen we onze eerder aangemaakt Job Definition kiezen. Hierna is het mogelijk om eventueel aanwezige parameters te vullen. Aan de rechterkant van het scherm kan vervolgens het schedule worden gedefinieerd.

Omdat Van Klanteren maandelijks het salaris uitbetaalt op de laatste maandag van de maand, maken we een schedule aan dat dit ondersteunt. In dit scherm is het ook mogelijk om het schedule op te slaan als definitie, zodat dit gemakkelijk hergebruikt kan worden bij andere Job Requests.

Schedule Definitie

Figuur 6: Schedule Definitie

Na een druk op OK is het Job Request aangemaakt en gescheduled voor de eerstvolgende laatste maandag van de maand. Als we navigeren naar de lijst met Job Requests (Job Requests -> Search Job Requests), zien we hier het resultaat ook van.

Overzicht Job Requests

Figuur 7: Overzicht Job Requests

In dit overzicht staan de 2 Requests die zojuist zijn aangemaakt. Het Request met ID 402 toont de eerstvolgende keer dat de Job uitgevoerd gaat worden. Laat u overigens niet van de wijs brengen door de tijdzones. 23 november 7:00 PM PST is eigenlijk zondag. Dat komt overeen met maandag 24 november 4:00 AM in Amsterdam, en dat is inderdaad de laatste maandag van november 2014.

Het Request met ID 401 is het overkoepelende Request. Dit zorgt ervoor dat nadat Request 402 is afgerond, er automatisch een nieuw Request komt voor eind december. Overigens is in dit overzichtje ook Request ID 403 te zien. Dit toont het resultaat van een succesvol afgeronde Job Request, die in dit geval even handmatig is gestart om het effect te tonen. Hiermee is de Job aangemaakt en gescheduled, waarmee we voldoen aan het eerste verzoek van Van Klanteren.

Afhankelijkheden

Om het payrolling systeem verder uit te breiden, wil Van Klanteren nu ook de service voor het berekenen van de standaard salarisverhogingen gaan schedulen via ESS. Hier komt echter wat extra complexiteit bij kijken. Het is namelijk zo dat de salarisbetalingen niet door mogen gaan, als de service voor de salarisverhogingen niet correct is voltooid. Daarom moet er een afhankelijkheid tussen de twee verschillende jobs worden gemaakt.
Om dit te demonstreren is er een tweede webservice gemaakt met de naam "inflatieCorrectie". Op dezelfde manier als bij de salarisVerwerking service wordt hier een Job voor aangemaakt.

De volgende stap is om nu een Job Set aan te maken. Deze Sets zijn een soort container voor een groep Jobs waarin afhankelijkheden kunnen worden aangegeven door Jobs serieel of parallel te laten uitvoeren.

In dit voorbeeld maken we een seriële afhankelijkheid. Het is de bedoeling dat eerste de inflatieCorrectie wordt uitgevoerd. Daarna volgt de salarisBetaling. Als de eerste Job echter een fout veroorzaakt, mag de tweede Job niet uitgevoerd worden. Er moet dan eerst door een beheerder worden uitgezocht wat er verkeerd is gegaan. Van Klanteren wil niet dat z’n medewerkers door een fout het verkeerde salaris uitbetaald krijgen.
Een Job Set kan aangemaakt worden door de betreffende optie uit het Schedule Services menu te selecteren onder Job Metadata. Na het aanmaken van een Job Set kunnen de Job Set Steps worden aangemaakt met het bijbehorende groene plus icoon.

Job toevoegen aan Job Set

Figuur 8: Job toevoegen aan Job Set

Als eerste voegen we de Job toe die de inflatieCorrectie service aanroept. Als tweede volgt de Job voor de salarisBetalingen. Zodra beide Jobs zijn toegevoegd aan de Set, zijn ze zichtbaar in een diagram. In dit diagram kunnen vervolgens de afhankelijkheden worden aangegeven. In onderstaand figuur is te zien dat behalve de goed-situatie (aangegeven met het groene vinkje) ook kan worden uitgelegd wat er moet gebeuren bij een fout of een waarschuwing. In dit voorbeeld is aangegeven dat bij een fout in één van beide Jobs de verwerking moet stoppen. In het geval van een waarschuwing bij de inflatieCorrectie, zal alsnog de salarisBetaling mogen starten. We gaan er daarbij van uit dat de foutafhandeling bij de inflatieCorrectie zo is gebouwd, dat een waarschuwing geen grote gevolgen heeft, en dat medewerkers daarvoor niet op hun salaris hoeven te wachten.

Job Set Diagram

Figuur 9: Job Set Diagram

Nu kan op dezelfde manier als bij een los Job Request ook een Schedule worden aangemaakt voor deze Job Set. Hierbij gebruiken we het Schedule dat in het eerste voorbeeld als template is vastgelegd.
Als dit is gedaan, kunnen we testen wat er gebeurt. In het volgende figuur staat een overzicht van de verwerkte Jobs.

Verwerking Job Set

Figuur 10: Verwerking Job Set

Wanneer we van onderen naar boven kijken, komen we eerst de twee Requests tegen die zijn aangemaakt, net als bij een gewone Job.
Daarboven staan bij Request ID 405 t/m 407 de resultaten van een foutloze verwerking. Aan de namen in de kolom Job Definition is te zien, dat eerst de Job Set is gestart. Daarna is de inflatieCorrectie gestart en vervolgens de salarisBetaling.

In de bovenste twee regels kunnen we daarentegen zien wat er gebeurt als er een fout optreedt in de inflatieCorrectie. Omdat deze een Error heeft gegeven, is de salarisBetaling Job niet gestart en ook de Job Set heeft een Error opgeworpen.

Parallel verwerking

Een verdere verfijning van het systeem vindt plaats in de vorm van een service voor het uitbetalen van de commissie voor de salesafdeling. De commissie is een vast percentage van de verkopen. Omdat de rest van het personeel geen last mag hebben van een eventuele fout in deze berekening, moet dit proces parallel lopen aan de overige betalingen.

Om dit voorbeeld toe te lichten hebben we weer een simpele SOA service gebouwd met de naam "commissieBetalingen". Wederom maken we een Job Definition voor deze service. Als we de Job Set uit het voorgaande voorbeeld parallel willen laten lopen aan de commissieBetalingen, moeten we een nieuwe Job Set aanmaken en de vorige daarin opnemen. Deze nieuwe Job Set noemen we maandVerwerking.
In het diagram ziet dat er als volgt uit:

Parallel Job Set

Figuur 11: Parallel Job Set

Als we ook hier het maandelijkse Schedule uit de vorige twee voorbeelden aan hangen en dezelfde testen uitvoeren (eenmaal goed en eenmaal met een error op de inflatieCorrectie), krijgen we de volgende resultaten te zien:

Maandverwerking Jobs

Figuur 12: Maandverwerking Jobs

Hier is duidelijk het verschil te zien. De Requests met ID 413 t/m 417 zijn correct verlopen. Er is te zien dat eerst de overkoepelende Job Set vkMaandVerwerking is gestart. Daarna de vkPayrollJobSet en de vkCommissie Job. Alles heeft status Succeeded gekregen en is correct afgesloten.

Als de inflatieCorrectie echter een Error veroorzaakt, zien we een ander beeld. Dit is te zien in Request 418 t/m 421. Ook hier worden de vkMaandVerwerking en de vkPayrollJobSet gestart. Echter omdat de vkInflatieCorrectie Job een Error geeft, zijn die beide Job Sets ook in de Error Status terechtgekomen. Maar omdat de vkCommissie Job parallel is geschakeld, komt deze wel tot een goed einde.
Met behulp van deze informatie, zou een beheerder ervoor kunnen kiezen om de fout in de inflatieCorrectie te herstellen en handmatig de fout gelopen Job Set opnieuw te draaien.

Jobs schedulen vanuit BPEL

Een andere manier om een Job te starten, is door de scheduling op te nemen in BPEL. Hiermee kunnen Jobs dus op runtime worden aangemaakt! Hiervoor zijn wel een aantal extra stappen noodzakelijk, omdat een ESS job niet zomaar door een anonieme gebruiker mag worden aangeroepen. Er moet dus wat beveiliging worden aangebracht. We gaan niet diep in op alle details, dat gaat wat ver voor dit Whitebook.

In elk geval moet er toegang gegeven worden aan de betreffende service via een WSM Security Policy. Dit kan gedaan worden via het ESSAPP menu en de optie "Web Services". Na het klikken op de link bij de juiste service, volgt een venster met meerdere tabs. Onder de tab "WSM Policies" is een lijst met beschikbare policies te vinden. Via de knop "Attach/Detach" zijn meer policies toe te voegen.

Voor dit voorbeeld gaan we er van uit dat de policy "wss_username_token_service_policy" aan een service is gekoppeld.
Ook moet er een SOA-MDS (MetaData Service) Connection aanwezig zijn naar de ESS repository. Een schema in een Oracle database met een MDS partitie voldoet hiervoor uitstekend. In JDeveloper kan nu in een BPEL proces een "Schedule Job" component uit de lijst met Oracle Extensions naar het canvas worden gesleept.

Schedule Job in BPEL

Figuur 13: Schedule Job in BPEL

Als we vervolgens dubbelklikken op het component, verschijnt een window waarin we de Job kunnen kiezen als we de juiste MDS Connectie hebben geselecteerd. Zoals in onderstaand figuur is te zien, staan de 3 vk Jobs die we eerder hebben gemaakt netjes in de lijst.

ESS Browser

Figuur 14: ESS Browser

Na het selecteren van de Job kan er een bestaand schedule worden geselecteerd, of er kan worden gekozen voor een start- en eindtijd.
Hierna moet in de composite nog de juiste WSDL en de policy worden gekoppeld. Daarna is het een kwestie van het deployen van de service en vervolgens is deze bruikbaar.

Bonus: JCA Adapter Services aan- en uitzetten via een schedule

Een interessante feature van ESS is de mogelijkheid om bepaalde services via een schedule aan of uit te zetten. In een systeem waarin ’s nachts intensieve batchprocessen plaats vinden, kan het voordelig zijn om bijvoorbeeld een bepaalde Database Adapter tijdelijk uit te zetten. Op die manier wordt de load op de database wat verlicht, zodat de batchprocessen er geen hinder van ondervinden. In ESS wordt dit gedaan door in de Enterprise Manager de betreffende service op te zoeken en te klikken op de link van de gewenste JCA Adapter Service. Op het scherm dat volgt verschijnt in de rechterbovenhoek een knop naast de Related Links.

Activate / Deactivate knop

Figuur 15: Activate / Deactivate knop

In het daaropvolgende scherm kan het gewenste schedule worden gekozen voor het activeren en deactiveren van de service.

Activate / Deactivate keuzescherm

Figuur 16: Activate / Deactivate keuzescherm

In principe kan ieder schedule worden gebruikt, maar let er bij het aanmaken wel op dat de definitie wordt geplaatst in de subdirectory <code>/soa</code> van de standaard <code>/oracle/apps/ess/custom</code> package die als default wordt gegeven.

De concurrentie

Er zijn een aantal producten die net als ESS de mogelijkheid bieden tot scheduling van Jobs. Enkele voorbeelden hiervan zijn:

  • Control-M
    Deze "Workload Automation Software" van BMC is van oorsprong  een tool voor IBM Mainframe systemen, maar is later ook bruikbaar gemaakt voor andere Operating Systems zoals Windows en Linux. De functionaliteit is vergelijkbaar met ESS. Met Control-M zijn ook diverse Job types aan te roepen, waaronder PL/SQL, J2EE en Web Services. Monitoring binnen Control-M is één van de sterkste punten. Een groot nadeel ten opzichte van ESS zijn de kosten. Het Starters pakket kost 40.000 dollar en daarbovenop nog eens 20% van dat bedrag per jaar aan maintenance.
  • DBMS_Scheduler
    DBMS_Scheduler is een beetje te zien als de voorloper van ESS. Draaiende binnen de Oracle Database (vanaf versie 10g) kan deze scheduler ook Jobs draaien. DBMS_Scheduler is beperkt in het aantal Job types. Alleen PL/SQL Jobs en OS scripts (shell scripts) zijn aan te roepen. Monitoring verloopt net als bij ESS via de Enterprise Manager. De kosten zijn daarentegen laag. Aparte licentiekosten zijn er niet, omdat DBMS_Scheduler wordt meegeleverd met de database.
  • Cronacle/JCS
    Deze software van Redwood gaat ook al wat langer mee. Het is oorspronkelijk ontwikkeld als oplossing voor het schedulen van Jobs in Oracle-omgevingen en was in die tijd erg populair. Inmiddels ligt de focus van het bedrijf vooral op de SAP-wereld. Dit is een commericieel pakket en er moet dus een licentie worden afgenomen.

Conclusie

Met de toevoeging van de Enterprise Service Scheduler aan SOA Suite 12c, heeft ook dit deel van de Oracle Middleware Stack er een krachtig scheduling mechanisme bij gekregen. Omdat ook services zijn te schedulen, is de noodzaak weggenomen om externe tools te gebruiken. Hierdoor verdwijnen eventuele extra licentiekosten en is ESS dus een relatief goedkoop alternatief.

De voorbeelden in dit Whitebook tonen een aantal mogelijke toepassingen van ESS. Daarbij is duidelijk dat dit slechts een klein deel van de opties is. Door het toevoegen van afhankelijkheden tussen Jobs en de mogelijkheid om Jobs vanuit BPEL te starten, kunnen grotere batchprocessen worden gebouwd die volledig automatisch kunnen draaien. Zelfs als er problemen ontstaan. Vanwege de integratie met Enterprise Manager zijn deze eventuele problemen dan weer makkelijk op te sporen, zodat de juiste actie kan worden ondernomen.

In de eerste release van ESS voor SOA Suite 12c zijn nog een aantal beperkingen. Maar de verwachting is dat deze in een volgende release in de nabije toekomst al worden opgelost, zodat een nog krachtiger tool ontstaat.

Referenties

Waardering:
 

Reacties

Nieuwe reactie inzenden

De inhoud van dit veld is privé en zal niet openbaar worden gemaakt.

Meer informatie over formaatmogelijkheden

CAPTCHA
Deze vraag is om te testen of u een persoon bent en om spam te voorkomen
Image CAPTCHA
Enter the characters shown in the image.