uima-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Manuel Fiorelli <manuel.fiore...@gmail.com>
Subject Re: How to have client, service and broker co-located using UIMA-AS
Date Thu, 05 Oct 2017 20:35:38 GMT
Hi Jaroslaw,

thank you for the detailed answer on the state of UIMA-AS and its future
evolution.

My initial quest for co-located components passing CASes by reference was
motivated by some experiments with UIMA-AS suggesting that I was not able
to outperform a pipeline executed with uimaFIT. Fortunately, I've just
discovered that my deployment descriptor contained a wrong configuration
seemingly preventing parallelism. After correcting that error, I was able
to outperform uimaFIT.

In the end, the presence of the queue broker and the associated
serialization/deserialization costs did not prevent me to take advantage of
UIMA-AS.

Regards,
Manuel

2017-10-05 19:55 GMT+02:00 Jaroslaw Cwiklik <cwiklik@apache.org>:

> Manuel, the current uima-as code requires a broker between a client and a
> service even if all are colocated in the same process. This implies CAS
> serialization/deserialization between endpoints. I am refactoring uima-as
> code as part of JIRA  https://issues.apache.org/jira/browse/UIMA-5280.
> Once
> the changes are complete the client and a service will use java queue
> messaging, passing CASes by reference. Don't have ETA yet. This has been an
> ongoing effort. Most of the new code is in place to support the JIRA plus a
> few other enhancements. Testing and debugging will take some time.
> Jerry
>
> On Thu, Oct 5, 2017 at 11:30 AM, Manuel Fiorelli <
> manuel.fiorelli@gmail.com>
> wrote:
>
> > Hi Jaroslaw,
> >
> > I applied your suggestions to my program, and indeed it seems to work
> > without the need of an external broker.
> >
> > However, it seems to me that timings are more or less the same with the
> > co-located and the remote (still on the same machine) broker.
> >
> > In both cases client and services are launched by the same process.
> >
> > So my question is: "Is my program passing the CASes by reference?"
> > Additionally, "Is this optimization enabled whenever client and service
> are
> > co-located irrespective of the position of the broker?"
> >
> > Regards,
> > Manuel
> >
> > 2017-10-04 22:23 GMT+02:00 Manuel Fiorelli <manuel.fiorelli@gmail.com>:
> >
> > > Hi Jaroslaw
> > >
> > > Thank you for your answer. Tomorrow, I will apply your suggestions and
> > > tell you what happens.
> > >
> > > Il 4 ott 2017 19:50, "Jaroslaw Cwiklik" <cwiklik@apache.org> ha
> scritto:
> > >
> > >> Manuel, small correction. Towards the end replace this
> > >>
> > >> client.sendCAS(cas);
> > >>
> > >> with
> > >>
> > >> client.sendAndReceiveCAS(cas);
> > >>
> > >> Simpler, synchronous msg exchange between client and a service.
> > >>
> > >> Jerry Cwiklik
> > >>
> > >> On Wed, Oct 4, 2017 at 1:00 PM, Jaroslaw Cwiklik <cwiklik@apache.org>
> > >> wrote:
> > >>
> > >> > Hi Manuel, you *can* colocate broker, client and a service in the
> same
> > >> > process. Here is the code to get this done. Sorry did not test this.
> > You
> > >> > need to create a deployment descriptor (xml file) to be able to
> > deploy a
> > >> > service.
> > >> >
> > >> > // Deploy in-process broker
> > >> > String uri = "tcp://"localhost:61616";
> > >> > BrokerService broker =
> > >> >      BrokerFactory.createBroker(new URI("broker:()/localhost?
> > >> > persistent=false"));
> > >> > TransportConnector tcpConnector = broker.addConnector(uri);
> > >> > broker.start();
> > >> > //------------------
> > >> >
> > >> > UimaAsynchronousEngine client =
> > >> > new BaseUIMAAsynchronousEngine_impl();
> > >> >
> > >> > Map<String,String> appCtx = new HashMap();
> > >> > appCtx.put(UimaAsynchronousEngine.DD2SpringXsltFilePath,
> > >> >            $UIMA_HOME+"/bin/dd2spring.xsl");
> > >> > appCtx.put(UimaAsynchronousEngine.SaxonClasspath,
> > >> >            "file:"+$UIMA_HOME+"/saxon/saxon8.jar");
> > >> >
> > >> > String aDeploymentDescriptorPath =
> > >> >   <path to dd.xml>
> > >> >
> > >> > // deploy in-process service
> > >> > String serviceId =
> > >> >   client.deploy(aDeploymentDescriptorPath, appCtx);
> > >> >
> > >> > String endpoint = <queue name>; // from the deployment descriptor
> > >> >
> > >> > appCtx.put(UimaAsynchronousEngine.ServerUri, uri);
> > >> > appCtx.put(UimaAsynchronousEngine.ENDPOINT, endpoint);
> > >> >
> > >> > // connect client with an in-process service
> > >> > client.initialize(appCtx);
> > >> >
> > >> > CAS cas = client.getCAS();
> > >> > cas.setDocumentText("Some Text");
> > >> > client.sendCAS(cas);
> > >> >
> > >> > client.stop();
> > >> >
> > >> >
> > >> >
> > >> > On Wed, Oct 4, 2017 at 11:37 AM, Manuel Fiorelli <
> > >> > manuel.fiorelli@gmail.com> wrote:
> > >> >
> > >> >> Hi everybody
> > >> >>
> > >> >> Within the documentation of UIMA-AS, specifically within the
> section
> > >> >> Terminology (
> > >> >> https://uima.apache.org/d/uima-as-2.9.0/uima_async_scaleout.
> > >> >> html#ugr.async.ov.terminology),
> > >> >> the description of Queue Broker says:
> > >> >>
> > >> >> <cite>
> > >> >> Queue brokers manage one or more named queues. The brokers are
> > >> identified
> > >> >> using a URL, representing where they are on the network. When
the
> > queue
> > >> >> broker is co-located with the AS client and service, CASes are
> passed
> > >> by
> > >> >> reference, avoiding serialization / deserialization.
> > >> >> </cite>
> > >> >>
> > >> >> Unfortunately, I could not find in the documentation how to place
> > >> broker,
> > >> >> client and service in the same JVM (co-location).
> > >> >>
> > >> >> After some web searches, experiments and exploration of the source
> > >> code of
> > >> >> UIMA-AS, I found that the solution may require the use of the
URL
> > >> >> "vm://localhost?broker.persistent=false" for the broker.
> > >> >>
> > >> >> In my sample program, I deploy a service (an asynchronous aggregate
> > AE)
> > >> >> and
> > >> >> then create an asynchronous client using the URL above, but then
I
> > >> receive
> > >> >> the following NullPointerException:
> > >> >>
> > >> >> <cite>
> > >> >> ott 04, 2017 5:29:28 PM
> > >> >> org.apache.uima.aae.controller.AggregateAnalysisEngineControl
> > ler_impl
> > >> >> replyToClient
> > >> >> AVVERTENZA: Service: Top Level Aggregate Service Runtime Exception
> > >> >> ott 04, 2017 5:29:28 PM
> > >> >> org.apache.uima.aae.controller.AggregateAnalysisEngineControl
> > ler_impl
> > >> >> replyToClient
> > >> >> AVVERTENZA:
> > >> >> java.lang.NullPointerException
> > >> >>     at
> > >> >> org.apache.uima.aae.controller.AggregateAnalysisEngineContro
> > >> >> ller_impl.sendVMMessage(AggregateAnalysisEngineController_im
> > >> pl.java:2393)
> > >> >>     at
> > >> >> org.apache.uima.aae.controller.AggregateAnalysisEngineContro
> > >> >> ller_impl.sendReplyToCollocatedClient(AggregateAnalysisEngin
> > >> >> eController_impl.java:2287)
> > >> >>     at
> > >> >> org.apache.uima.aae.controller.AggregateAnalysisEngineContro
> > >> >> ller_impl.replyToClient(AggregateAnalysisEngineController_im
> > >> pl.java:2344)
> > >> >>     at
> > >> >> org.apache.uima.aae.controller.AggregateAnalysisEngineContro
> > >> >> ller_impl.finalStep(AggregateAnalysisEngineControl
> > ler_impl.java:1862)
> > >> >>     at
> > >> >> org.apache.uima.aae.controller.AggregateAnalysisEngineContro
> > >> >> ller_impl.executeFlowStep(AggregateAnalysisEngineController_
> > >> >> impl.java:2489)
> > >> >>     at
> > >> >> org.apache.uima.aae.controller.AggregateAnalysisEngineContro
> > >> >> ller_impl.process(AggregateAnalysisEngineControl
> ler_impl.java:1271)
> > >> >>     at
> > >> >> org.apache.uima.aae.handler.HandlerBase.invokeProcess(Handle
> > >> >> rBase.java:118)
> > >> >>     at
> > >> >> org.apache.uima.aae.handler.input.ProcessResponseHandler.can
> > >> >> celTimerAndProcess(ProcessResponseHandler.java:117)
> > >> >>     at
> > >> >> org.apache.uima.aae.handler.input.ProcessResponseHandler.han
> > >> >> dleProcessResponseWithCASReference(ProcessResponseHandler.
> java:485)
> > >> >>     at
> > >> >> org.apache.uima.aae.handler.input.ProcessResponseHandler.han
> > >> >> dle(ProcessResponseHandler.java:767)
> > >> >>     at
> > >> >> org.apache.uima.aae.handler.HandlerBase.delegate(
> > HandlerBase.java:149)
> > >> >>     at
> > >> >> org.apache.uima.aae.handler.input.ProcessRequestHandler_impl
> > >> >> .handle(ProcessRequestHandler_impl.java:1113)
> > >> >>     at
> > >> >> org.apache.uima.aae.spi.transport.vm.UimaVmMessageListener.o
> > >> >> nMessage(UimaVmMessageListener.java:107)
> > >> >>     at
> > >> >> org.apache.uima.aae.spi.transport.vm.UimaVmMessageDispatcher
> > >> >> $1.run(UimaVmMessageDispatcher.java:70)
> > >> >>     at
> > >> >> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPool
> > >> >> Executor.java:1142)
> > >> >>     at
> > >> >> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoo
> > >> >> lExecutor.java:617)
> > >> >>     at
> > >> >> org.apache.uima.aae.UimaAsThreadFactory$1.run(UimaAsThreadFa
> > >> >> ctory.java:132)
> > >> >>     at java.lang.Thread.run(Thread.java:745)
> > >> >> </cite>
> > >> >>
> > >> >> The exception above does not happen when I use a remote broker,
so
> I
> > >> >> suspect that I am doing something wrong with my attempt to place
> all
> > >> parts
> > >> >> in the same JVM.
> > >> >>
> > >> >> Does anyone knows how to achieve my goal?
> > >> >>
> > >> >> Thanks in advance,
> > >> >> Manuel Fiorelli
> > >> >>
> > >> >
> > >> >
> > >>
> > >
> >
> >
> > --
> > Manuel Fiorelli
> >
>



-- 
Manuel Fiorelli

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message