Hi everyone,

to put some load on one of our UIMA AS system I wrote
a small tool which uses the client API to send CASes to
a processing pipeline.

This tool has an endless loop which waits for work
to arrive and then sends it to the processing pipeline.

It basically looks like this:

text = getNextDocument() // returns plain text which should be analyzed

CAS cas = uimASEngine.getCAS();
cas.setDocumentText(text)
uimaAsEngine.sendCAS(cas)

When the tool is started there is usually lots of work waiting
and all available CASes are sent out to the service. It takes a while
until the first CAS is completly processed. Now the
tool gets a new text and waits for a new CAS inside getCAS().

Now I wonder why waiting for a CAS inside getCAS() puts 95 to 100 % CPU load
on one core on my client machine.

I looked at the place where it waits in BaseUIMAAsynchronousEngineCommon_impl
around line 536 in getCAS().

Here is the wait loop:
     while (running) {
       try {
// Wait until the CAS producer adds the CAS to the CasQueueEntry and
         // signals CAS availability.
         entry.getSemaphore().acquire();
         if (entry.getCas() == null) {
           continue;
         } else {
           return entry.getCas();
         }
       } finally {
         entry.getSemaphore().release();
} } // while

For me it looks like that if entry.getCAS() returns null it immediately
tries again and polls entry.getCAS() as often as possible.

Jörn

Reply via email to