Zum Ende der Metadaten springen
Zum Anfang der Metadaten

Sie zeigen eine alte Version dieser Seite an. Zeigen Sie die aktuelle Version an.

Unterschiede anzeigen Seitenhistorie anzeigen

« Vorherige Version anzeigen Version 8 Nächste Version anzeigen »

Goal: Send REST request to an external system whenever a customer Entry is created or modified.

You can download the whole Kickstarter-based sample application from our GitLab repository: um-public/tutorial-syncqueue

Start a new Kickstarter project

umkickstarter -n de.pinuts.tutorial
cd umkickstarter
# Copy your partner license file to env/devel/cmsbs-conf/cmsbs.license

Include dependency

Edit build.gradle and add the following dependency:

dependencies {
    [...]
    
    runtime('de.pinuts.cmsbs:SyncQueue:1.5.0')
}

Now, setup and restart:

gradle setup run

Implement and register CommitCallback

Create a new (M)JS file: cmsbs-conf/cse/plugins/de.pinuts.tutorial/shared/CommitCallback.mjs:

/// <reference path="../../../.vscode.js"/>

class MyCommitCallback extends CommitCallback {
    /**
     * @param {Entry} e 
     */
    preCommit(e) {
        if (e.get('entrytype') == 'customer') {
            console.log('preCommit:', e);
        }
    }

    /**
     * @param {Entry} e 
     */
    postCommit(e) {
        if (e.get('entrytype') == 'customer') {
            console.log('postCommit:', e);
        }
    }

    /**
     * @param {Entry} e 
     */
    preRemove(e) {
        if (e.get('entrytype') == 'customer') {
            console.log('preRemove:', e);
        }
    }
}

CommitCallback.registerCallback(() => new MyCommitCallback());

Open http://localhost:8080/cmsbs, login as admin / admin and create, edit and delete a Customer entry.

Take a look at the console / shell where you started the UM: For each transaction the according Entry should be logged.

Setup a SyncQueue instance

Create a new file cmsbs-conf/cse/plugins/de.pinuts.tutorial/shared/queue.mjs:

/// <reference path="../../../.vscode.js"/>

import SyncQueue from "@de.pinuts.cmsbs.syncqueue/shared/SyncQueue.es6";
import HttpClientBuilder from "@de.pinuts.http/shared/HttpClientBuilder.es6";

const client = new HttpClientBuilder()
    .build();

const fn = (payload) => {
    console.error('SyncQueue:', payload);

    const e = UM.getEntryByOid(payload.oid);
    let ret;

    if (e) {
        client.post(`http://localhost:8080/tutorial/customer/${e.oid}`)
            .setJsonData({
                oid: e.oid,
                firstname: e.get('firstname'),
                lastname: e.get('lastname'),
                email: e.get('email'),
            })
            .execute()
            .catch(rsp => {
                console.error('HTTP request failed:', rsp.status);
                ret = `HTTP error: ${rsp.status}`;  // string = recoverable error
            })
            .then(rsp => {
                ret = true; // true = success
            });
    } else {
        // Send DELETE request...
    }

    return ret;
}

export const queue = new SyncQueue(fn)
    .setName('tutorial')
    .setMaxRetries(5)
    .setRunOnPush(true)
    .register();

Queue Entry updates

Now that we have a SyncQueue set up and a handler function in place to propagate any Customer updates, we can update our CommitUpdate to actually use the Queue:

[...]
    /**
     * @param {Entry} e 
     */
    postCommit(e) {
        if (e.get('entrytype') == 'customer') {
            queue.push({ oid: e.oid });
        }
    }

    /**
     * @param {Entry} e 
     */
    preRemove(e) {
        if (e.get('entrytype') == 'customer') {
            queue.push({ oid: e.oid });
        }
    }
[...]

Test run

Now, edit or create a Customer entry and go to Tools / SyncQueue Dashboard.

You will notice a waiting (or failed) request for each creation or update operation you did. The HTTP requests will all fail with a 404 because there actually is no endpoint to receive our POST requests.

To make this work, you could implement a REST endpoint as a mockup and change the URL accordingly.

  • Keine Stichwörter