For this release I will overload both sendCAS(..) and sendAndReceive(..) to
enable targeting. In the future if there is a need to further extend these
APIs we can revisit the idea of a new method.

-Jerry

On Tue, Dec 12, 2017 at 3:00 PM, Jaroslaw Cwiklik <cwik...@apache.org>
wrote:

> The UimaAsynchronousEngine interface has only two sendAndReceive()
> methods.
>
> There was only one change made to the sendXXX API since UIMA-AS inception.
> The
> change under discussion here would be the second one.
>
> The sendCAS ( CAS cas, Map options )  has an advantage of keeping the API
> simple and extensible but it kinda hides the parameters. The user must
> lookup
> documentation to discover what options are available and how to use them
> sync or async, target or not, etc.
> Granted, the UIMA-AS initialize(Map options) uses this style already :)
>
> This new method will create ambiguity since:
>
> sendAndReceiveCAS(CAS cas, List<AnalysisEnginePerformanceMetrics>
> componentMetricsList)
>
> and
>
> Map<String, Object> options = new HashMap<String,Object>();
> options.put(MODE,SYNCHRONOUS );
> options.put(METRICS, new ArrayList<AnalysisEnginePerformanceMetrics>());
> sendCAS(cas, options);
>
> are equivalent, and the second one being quite verbose.
>
> What should we say in the documentation?  Which style should the user
> use? Perhaps we can say that
> the new code should use sendCAS(cas, options) since it is more extensible
> and ready for future changes
> to this API
>
> Jerry
>
>
> On Tue, Dec 12, 2017 at 2:15 PM, Burn Lewis <burnle...@gmail.com> wrote:
>
>> I would vote against deprecating existing methods.
>> I think the issue is do we expect to add more arguments in the future if
>> another variant is needed.
>> If not then adding 2 new methods is consistent with past extensions ...
>> but
>> I do see a 3rd sendAndReceiveCAS method that is not in the Javadocs.
>> Alternatively Lou's 1 new method would provide for future extensions.  The
>> 2nd arg could be a map, just as the initialize method takes a map:
>>
>>            String sendCAS ( CAS cas, Map options )
>>
>> Burn
>>
>>
>> On Tue, Dec 12, 2017 at 10:33 AM, Marshall Schor <m...@schor.com> wrote:
>>
>> > Re: 2nd & 3rd proposal, the client would supply an instance of
>> > "ProcessingOptions".  I assume the user would create this using new
>> > ProcessingOptions() and then call the setters it wants.  Or perhaps
>> there
>> > would
>> > be a short-hand positional-arg constructor, as well.
>> >
>> > Overall, it seems to me that it would be less disruptive to the API
>> > stability,
>> > and easier for users to learn and use, to just add an overloaded call
>> > (proposal
>> > #1), and not deprecate anything.   I think users would appreciate not
>> > having to
>> > update older code.
>> >
>> > -Marshall
>> >
>> > On 12/11/2017 5:42 PM, Jaroslaw Cwiklik wrote:
>> > > Hi, I need to extend UIMA-AS client API as defined by
>> > > interface UimaAsynchronousEngine.java
>> > >
>> > > The new feature I've been working on, should allow a client to send a
>> CAS
>> > > to a specific instance of a service. Such targeting is optional and
>> could
>> > > be useful to test if a service is viable (processing can be done).
>> > >
>> > > To support targeting, a service uses a JMS selector which expects a
>> > message
>> > > property that uniquely identifies the service. By default, the
>> selector
>> > > uses  IP:PID as a unique identifier, but a service deployer can
>> define a
>> > > custom identifier using -D property on the  service command line.
>> > >
>> > > An application client must be able to invoke a UIMA-AS client method
>> > which
>> > > takes a CAS, unique id of a service to target, and other properties.
>> The
>> > > targeting is again optional and used for special use cases.
>> > >
>> > > Current UIMA-AS client uses two styles of calls: asynchronous and
>> > > synchronous
>> > >
>> > > sendCAS(CAS cas) - this is an asynchronous style
>> > >
>> > > and there are two APIs for synchronous style:
>> > >
>> > > sendAndReceive(CAS cas)
>> > > sendAndReceiveCAS(CAS cas, List<AnalysisEnginePerformanceMetrics>
>> > > componentMetricsList)
>> > >
>> > > To support targeting, I can overload the above creating two new
>> methods
>> > >
>> > > sendCAS(CAS cas, String serviceTargetId)
>> > > sendAndReceiveCAS(CAS cas, List<AnalysisEnginePerformanceMetrics>
>> > > componentMetricsList, String serviceTargetId )
>> > >
>> > > Another suggestion from Lou Degenaro is to create a new method
>> > >
>> > > submit(CAS cas, ProcessingOptions pos);
>> > >
>> > > where
>> > >
>> > > ProcessingOptions() {
>> > >   void setAsynchronous();  // if this is not called the default is
>> > > synchronous
>> > >   void setMetrics(List<AnalysisEnginePerformanceMetrics> list);
>> //null
>> > for
>> > > asynchronous style
>> > >   void setTargetInstance(String id);  // if not called ,targeting is
>> not
>> > > done
>> > > }
>> > >
>> > > Burn Lewis commented on this proposal with:
>> > >
>> > > "Has the advantage of being extendable without having to add another
>> send
>> > > method.
>> > >
>> > > Could be a map with a specified set of legal keys but a special class
>> is
>> > > good too ... especially if had extra constructors, e.g. for a targeted
>> > > async request:
>> > >
>> > > submit ( cas, new ProcessingOptions(true, null, "127.0.0.1:12345") )"
>> > >
>> > > If submit() is a preferred choice should the sendCAS() and
>> > sendAndReceive()
>> > > be deprecated to encourage new code to use more flexible API? Or
>> should
>> > we
>> > > just document that submit() is only
>> > > for targeting services?
>> > >
>> > > Are there any suggestions perhaps which should be considered?
>> > >
>> > > Jerry
>> > >
>> >
>> >
>>
>
>

Reply via email to