Sun Java System Communications Services 6 2005Q4 Event Notification Service Guide

Sample Code

The following two code samples illustrate how to use the ENS API. The sample code is provided with the product in the following directory:

msg_server_base/examples

ProcedureTo use the sample code

Steps
  1. Before running the makefile, set your library search path to include the directory:


    msg_server_base/lib
  2. Compile the code using the Makefile.sample.

  3. Run apub and asub as follows in separate windows:

    apub localhost 7997

    asub localhost 7997

    Whatever is typed into the apub window should appear on the asub window. If you use the default settings, all iBiff notifications should appear in the asub window.

  4. Remove the msg_server_base/lib path from your library search path.


    Note –

    If you do not remove this from the library search path, you will not be able to stop and start the directory server.


Sample Publisher

This sample code provides a simple interactive asynchronous publisher.

/*
 * Copyright 2000 by Sun Microsystems, Inc.
 * All rights reserved
 */
/*
 *
 *                            apub
 *                             --
 *         a simple interactive asynchronous publisher
 *                             --
 *
 * This simplistic program publishes events using the hard-coded
 * event reference
 *      enp://127.0.0.1/store
 * and the data entered at the prompt as notification payload.
 * Enter "." to end the program.
 *
 * If you happen to run the corresponding subscriber, asub, on the
 * same notification server, you will notice the sent data printed
 * out in the asub window.
 * Syntax:
 *      $ apub <host> <port>
 * where
 *      <host> is the notification server hostname
 *      <port> is the notification server IP port number
 */
#include <stdlib.h>
#include <stdio.h>#include "pasdisp.h"
#include "publisher.h"
static pas_dispatcher_t *disp = NULL;
static publisher_t *_publisher = NULL;
static int _shutdown = 0;
static void _read_stdin();

static void _exit_usage()
{
    printf("\nUsage:\napub host port\n");
    exit(5);
}
static void _exit_error(const char *msg)
{
    printf("%s\n", msg);
    exit(1);
}
static void _call_shutdown()
{
    _shutdown = 1;
    pas_shutdown(disp);
}
static void _open_ack(void *arg, int rc, void *enc)
{
    _publisher = (publisher_t *)enc;
    (void *)arg;
if (!_publisher) {
        printf("Failed to create publisher with status %d\n", rc);
        _call_shutdown();
        return;
    }
    _read_stdin();
    return;
}
static void _publish_ack(void *arg, int rc, void *ignored)
{
    (void *)ignored;
    free(arg)
    if (rc != 0) {
        printf("Publish failed with status %d\n", rc);
        _call_shutdown();
        return;
    }
    _read_stdin();
    return;
}
static void _read_stdin()
{
    static char input[1024];
    printf("apub> ");
    fflush(stdout);
    while (!_shutdown) {
        if ( !fgets(input, sizeof(input), stdin) ) {
             continue;
         } else {
             char *message;
             unsigned int message_len;
             input[strlen(input) - 1] = 0; /* Strip off the \n */
            if (*input == ’.’ && input[1] == 0) {
                 publisher_delete(_publisher);
                 _call_shutdown();
                 break;
             }
            message = strdup(input);
            message_len = strlen(message);
            publish(_publisher, "enp://127.0.0.1/store",
                     message, message_len,
                     _publish_ack, NULL, (void *)message, 0);
             return;
        }
    }
     return;
}
main(int argc, char **argv)
{
    unsigned short port = 7997;
    char host[256];
    if (argc < 2) _exit_usage();
    if (*(argv[1]) == ’0’) {
        strcpy(host, "127.0.0.1");
    }else {
        strcpy(host, argv[1]);
    }
    if (argc > 2) {
        port = (unsigned short)atoi(argv[2]);
    }
    disp = pas_dispatcher_new(NULL);
    if (disp == NULL) _exit_error("Can’t create publisher");
    publisher_new_a(disp, NULL, host, port, _open_ack, disp);
    pas_dispatch(disp);
    _shutdown = 1;
    pas_dispatcher_delete(disp);
    exit(0);
}

Sample Subscriber

This sample code provides a simple subscriber.

/*
 * Copyright 1997 by Sun Microsystems, Inc.
 * All rights reserved
 *
 */
/*
 *
 *                            asub
 *                             --
 *                     a simple subscriber
 *                             --
 *
 * This simplistic program subscribes to events matching the
 * hard-coded event reference:
 *      enp://127.0.0.1/store
 * It subsequently received messages emitted by the apub processes
 * if any are being used, and prints the payload of each received
 * notification to stdout.
 *
 * Syntax
 *      $ asub <host> <port>
 * where
 *      <host> is the notification server hostname
 *      <port> is the notification server IP port number
 */
#include <stdlib.h>
#include <stdio.h>
#include "pasdisp.h"
#include "subscriber.h"
static pas_dispatcher_t *disp = NULL;
static subscriber_t *_subscriber = NULL;
static subscription_t *_subscription = NULL;
static renl_t *_renl = NULL;
static void _exit_usage()
{
    printf("\nUsage:\nasub host port\n");
    exit(5);
}
static void _exit_error(const char *msg)
{
    printf("%s\n", msg);
    exit(1);
}
static void _subscribe_ack(void *arg, int rc, void *subscription)
{
    (void)arg;
    if (!rc) {
        _subscription = subscription;
        printf("Subscription successful\n");
        subscriber_keepalive(_subscriber, 30000);
    }else {
        printf("Subscription failed - status %d\n", rc);
        pas_shutdown(disp);
    }
}
static void _unsubscribe_ack(void *arg, int rc, void *ignored)
{
(void *)ignored;
    (void *)arg;
    if (rc != 0) {
        printf("Unsubscribe failed - status %d\n", rc);
    }
    subscriber_delete(_subscriber);
    pas_shutdown(disp);
}
static int _handle_notify(void *arg, char *url, char *str, int len)
{
    (void *)arg;
    printf("[%s] %.*s\n", url, len, (str) ? str : "(null)");
    return 0;
}
static void _open_ack(void *arg, int rc, void *enc)
{
    _subscriber = (subscriber_t *)enc;
    (void *)arg;
    if (rc) {
        printf("Failed to create subscriber with status %d\n", rc);
        pas_shutdown(disp);
        return;
    }
    subscribe(_subscriber, "enp://127.0.0.1/store",
                _handle_notify, NULL,
                _subscribe_ack, NULL);
    return;
}
static void _unsubscribe(int sig)
{
    (int)sig;
    unsubscribe(_subscriber, _subscription, _unsubscribe_ack, NULL);
}
main(int argc, char **argv)
{
    unsigned short port = 7997;
    char host[256];
    if (argc < 2) _exit_usage();
    if (*(argv[1]) == ’0’) {
        strcpy(host, "127.0.0.1");
     }else {
        strcpy(host, argv[1]);
    }
    if (argc > 2) {
        port = (unsigned short)atoi(argv[2]);
    }    disp = pas_dispatcher_new(NULL);
    if (disp == NULL) _exit_error("Can’t create publisher");
    subscriber_new_a(disp, NULL, host, port, _open_ack, NULL);
    pas_dispatch(disp);
    pas_dispatcher_delete(disp);
exit(0);
}