Teknik, SAP

Egen webbtjänst på Hana Cloud Platform

Jag har sedan ett par år tillbaka en egen webbtjänst som agerar mellanhand mot Hogias tidsrapportering och tillhandahåller den som en mobilapp. Den kördes ursprungligen på en Apache Tomcat-server, men har sedan migrerats till Google App Engine. Den migreringen krävde lite handpåläggning då mycket av HttpClient som används inte får köras på Googles servrar. Jag tyckte heller inte att jag fick riktigt bra fart på klienten. Det kan både vara på grund av att servern faktiskt står i USA och Hogias server står i Sverige, samt att vi inte betalade för en monster-instans av servern hos Google heller.

Hur som helst, efter att ha varit på besök hos SAP för en dragning om UX på deras Hana Cloud Platform, så blev jag sugen på att se om jag kunde köra vår lösning som en Java Application på HCP. Först provade jag att bara bygga en WAR-fil i Google App Engine-versionen av vår app, men det var lite för mycket beroende till GAE för att starta. Jag gick då tillbaka till vår Tomcat-version och provade att bygga och ladda upp den filen. Och se där, det gick bättre! Dock så fick jag bara fram HTML-filen på förstasidan och när vår mobilapp försökte prata med webservern så fick jag timeouts. Dags att börja kolla på loggar i Cloud Platform Cockpit.

Gick jag in och tittade i Default Trace på HCP så fick jag till slut fram det här felet:

2017 09 25 14:25:18#+00#ERROR#java.lang.Throwable##anonymous#http-nio-8041-exec-3#na#s0005067530trial#time#web#s0005067530trial#na#na#na#na#Caused by: java.net.ConnectException: errno: 110 (Connection timed out), error: Connection timed out (local port 48259 to address 0.0.0.0, remote port 443 to address 195.78.128.241)

Det verkar alltså vara något slags nätverksproblem. Jag misstänker att det kan vara liknande problem som med GAE, dvs att du inte får göra nätverksanrop lite hur som helst. Vilket verkar vettigt, det skulle inte vara jättesvårt att göra en Denial Of Service-attack med hjälp av SAPs infrastruktur om det var fritt fram.

Efter lite googlande, så kommer jag fram till att jag nog behöver använda mig av Destinations och på så sätt komma åt en HttpClient. Den här sidan handlar om hur man konsumerar Internet Services. Jag lägger till Hogia som en destination, först lokalt för att se att det fungerar. Jag är lite fundersam om jag behöver lägga till en destination för varje webservice jag behöver använda, men det räcker att lägga till huvudadressen till Hogia och sen specificera vid anropet vilken url som ska användas.

För att få det att fungera behöver jag ändra hur jag plockar fram en HttpClient. Jag får 2 exempel, en med Java Web och en med Java Web Tomcat7 och försöker först med Tomcat7, men får det inte riktigt att lira, men med Java Web så rullar det efter några försöka. Lösningen blir att byta från att använda en ThreadSafeClientConnManager att skapa upp en DefaultHttpClient (sen nedan)…

…till att plocka upp min destination jag deklarerat upp i web.xml och sen skapa upp en HttpClient från destinationen.

Jag var lite orolig att http-anropen inte skulle fungera som jag ville, då varje användarens anrop behöver behålla sina sessionsvariabler och cookies, men eftersom http-anropen går att göras med en separat HttpContext, som jag inte behövde ändra på, så fungerade det på första försöket.

Med allt på plats så skapar jag en WAR-fil, laddar upp via HCP och lägger sen till en destination med samma namn (”Hogia”).

Det sista jag behöver göra nu är att ändra lite på de länkade css och js-filerna ifrån min start-sida, då den gratis-siten jag får inte ligger i rooten på webadressen. Med detta på plats fungerar nu min gamla tidsrapporteringsapp på samma sätt som den som körs på en lokal Tomcat, eller på Google App Engine.

Nu ska jag bara prova att skapa en HCP-app som använder sig av denna app som destination och bygga frontend i SAPUI5. Det får bli i ett annat inlägg!

Nyfiken på att läsa mer om vårt partnerskap med SAP? Kolla in det här!

Dela inlägget