IBM webMethods Hybrid Integration

IBM webMethods Hybrid Integration

Join this online group to communicate across IBM product users and experts by sharing advice and best practices with peers and staying up to date regarding product enhancements.

 View Only

Broker API document traversal

  • 1.  Broker API document traversal

    Posted Wed September 22, 2010 06:14 AM

    Hi all,

    I’m trying to use the Broker API to publish a large number of documents to the Broker for load testing.

    As an exercise to familiarise myself with the API I wanted to write something that traversed the field names of a document, much like that you would see in Developer.

    Here is an excerpt of my code:

    public static void main(String[] args) throws BrokerException {
    BrokerClient broker = getBrokerClient("host:port", "brokername", null, "clientgroup", "appname");
    BrokerEvent event = getBrokerEvent(broker, "wm::is::x::y::x");	
    traverseBrokerEvent(event, 0);
    broker.disconnect();
    }
    
    private static void traverseBrokerEvent(BrokerEvent event, int level) throws BrokerException {
    
    String[] fields = event.getFieldNames(null);
    
    for (String field : fields) {
    printField(event, field, level);
    
    short fieldType = event.getFieldType(field);
    
    // recursively traverse another struct
    if (fieldType == BrokerTypeDef.FIELD_TYPE_STRUCT) {
    BrokerEvent structEvent = event.getStructFieldAsEvent(field);
    traverseBrokerEvent(structEvent, level+1);
    
    } else if (fieldType == BrokerTypeDef.FIELD_TYPE_SEQUENCE) {
    BrokerField seqField = event.getSequenceField(field, 0, 0);
    //			a mess goes here
    //			BrokerEvent tmpEvent = new BrokerEvent(null);
    //			BrokerEvent[] seqEvent = event.getStructSeqFieldAsEvents(field, 0, 0);
    //			System.out.println(seqField.toString());
    }
    }
    }
    
    
    private static void printField(BrokerEvent event, String fieldName, int level) throws BrokerException {
    
    printIndent(level);
    System.out.print(fieldName);
    
    short fieldType = event.getFieldType(fieldName);
    
    if (fieldType == BrokerTypeDef.FIELD_TYPE_BOOLEAN) {
    System.out.print(" (bool)");
    } else if (fieldType == BrokerTypeDef.FIELD_TYPE_STRING || fieldType == BrokerTypeDef.FIELD_TYPE_UNICODE_STRING) {
    System.out.print(" (string)");
    } else if (fieldType == BrokerTypeDef.FIELD_TYPE_STRUCT) {
    System.out.print(" (struct)");
    } else if (fieldType == BrokerTypeDef.FIELD_TYPE_SEQUENCE) {
    System.out.print("[] (seq)");
    }
    System.out.println();
    }
    
    private static void printIndent(int level) {
    if (level == 0) return;
    for (int x=0; x<level; x++) {
    System.out.print("   ");
    }
    System.out.print("+- ");
    }

    This works pretty good, I get results like this:

    Doc1 (struct)
    +- Field1 (string)
    +- Field2 (string)
    +- Field3 (string)
    +- Field4 (string)
    Doc2 (struct)
    +- Doc3 (struct)
    +- Doc4 (struct)
    +- Field7 (string)
    +- Doc5 (struct)
    +- Field8 (string)
    +- Doc6[] (seq)
    +- Field9 (string)
    +- Field10 (string)
    +- Field11 (string)
    +- Field12 (string)
    +- Doc7 (struct)
    +- Doc8[] (seq)

    You would notice that I have not traversed into the sequences / document lists (ie, Doc6 and Doc8). As far as I can tell from the API this is not something I can do as there are no instances of Doc6 or Doc8 present (being a sequence). Calling getEventSeqField returns an empty array of BrokerEvents.

    Yet at the same time, I cannot create instances of them and set them into the document as neither Doc6 nor Doc8 are publishable.

    The Broker Client API documentation recommends creating a BrokerEvent without a BrokerClient set then manually setting the fields to disable type checking and then setting that BrokerEvent into the document, however then the traversal is no longer generic.

    What I would be hoping to get is something like:

          +- Doc7 (struct)
    +- Doc8[] (seq)
    +- Field13 (string)
    +- Field14 (string)

    Surely I’m overlooking something simple that should be able to do this?


    #Universal-Messaging-Broker
    #webMethods
    #broker
    #Integration-Server-and-ESB