Ik heb een zakelijk bestelsysteem dat een orderbevestiging met PDF-factuur e-mailt aan de klant en parallel een CSV-bestand met PDF-pakbon e-mailt naar de fulfilment. Een succesvolle verwerking van de order wordt aansluitend op een webpagina gemeld aan de klant.
Alleen... het genereren van een PDF duurt zo'n 8 tot 10 seconden, dus een slordige 15 tot 20 seconden voor de factuur plus de pakbon. Véél te lang om de gebruiker te laten wachten op de melding van een geslaagde bestelling.
Hebben jullie suggesties om die processen in goede banen te leiden, liefst zonder het verlies van de melding aan de klant?
Zou je het via ajax calls kunnen doen? Na klik op een knop doe je een ajax call naar de server die het process in gang zet. Zodra het klaar is wordt er in de database (of session) een succes of foutmelding gezet. Deze call geeft geen return en de browser checkt dat dus verder ook niet. Wat de browser wel doet is elke seconde (of welk interval dan ook) de server pollen om te zien of het proces al klaar is. Zodra de succes of foutmelding is gevonden wordt deze getoond in de browser en stopt het interval.
Eventueel kan je er nog een maximale tijd aangeven, zodat als het te lang duurt er een algemene melding wordt gegeven.
Ajax is inderdaad een goede oplossing voor de feedback, alleen moeten de twee processen voor facturering plus fulfilment sowieso altijd in gang worden gezet, ook zonder een Ajax-aanroep voor bijvoorbeeld gebruikers met JavaScript-smetvrees en ook als de client ondertussen al vertrokken is (door het sluiten van de browser, het wegvallen van de internetverbinding, noem maar op).
Dat betekent dus dat ik drie communicerende processen tegelijk aan het werk moet zetten: een voor de factuur, een voor de fulfilment en een voor de Ajax-webpagina.
Voor de mensen met javascript vrees zie ik niet een mooie oplossing om eerlijk te zijn. Voor de andere maakt het niet uit. Je eerste ajax call zet alles in gang, alleen die geeft zelf geen output terug. De call die je met het interval in gang zet geeft in feite de output terug. Mocht iemand dan zijn browser sluiten dan ziet hij niet (op dat moment) of het lukt, maar het verstoort het proces niet. De eerste call wordt gewoon afgehandeld.