Hi Geoff

I'm truly sorry for asking so many questions.  I only write after trying a
lot of different options, looking through source, test cases and examples.
It is tough going when one doesn't have as much familiarity as you.

Here's a paraphrase of what I've configured....

Application
    *service1*
       name "hts"
       entity -  an API server based on VanillaJavaApp (Jetty under the
hood)  that has a very long initialization phase and make take a minute or
more to be ready.   It has a simple /up  url for testing whether it is
ready to start processing.  As soon as it returns a 200 status and this:
{"server_version":"1.0.3 built 07-02-2019"}  , it is ready:


*   service2*
         entity:   DynamicCluster of about 20 instances of
               Another  VanillaJavaApp  client application  that works its
way through a chunk of a large data set sending requests to the above
server, beginning as soon as it is ready.
               This client app exits if the server is not present via the
/up command mentioned above.  So it should not even be started until then


*What I'd like to do, is to retard the spawning of the cluster until the
server side is ready (not just running)*


*My strategy was to create an HttpRequestSensor in service1 that would poll
that /up command*

brooklyn.initializers:
      - type: org.apache.brooklyn.core.sensor.http.HttpRequestSensor
        brooklyn.config:
          period: 20000
          name: ctakesReady
          targetType: java.lang.String
          URI: 
$brooklyn:formatString("http://localhost:%s/up",$brooklyn:config("port")
)
          suppressDuplicates: true
          jsonPath: "/server_version"



*Then to create a variable in the server entity's map, which transformed
the sensor result into a boolean-like value*

server.isUp:
        regexReplacement:
          - $brooklyn:sensor("ctakesReady")
          - ".*"
          - "true"

*And finally, in the dynamicCluster's startup to add a latch*

id: client_cluster
    type: org.apache.brooklyn.entity.group.DynamicCluster
    brooklyn.config:
      latch.start:
$brooklyn:component("hts").attributeWhenReady("server.isUp")
      cluster.initial.size: 2
      dynamiccluster.memberspec:
        $brooklyn:entitySpec:
          ......



I've tested all the bits in Brooklyn separately:  I can launch the server,
I can create the cluster,  I can get that cluster to talk to a server I
launch manually, but I just can't tie it all together

In the logs I can see that the HttpRequestSensor task is scheduling each
20s but I can't tell if it is doing what I want.   I can't tell what
happens when the HttpRequestSensor receives a connection refused... which
it will do for the first minute or two.

The only thing I can tell is I'm getting the following error, maybe because
it is trying to access ctakesReady before the sensor has a chance to create
it.

2019-08-03T12:37:27,005 DEBUG 123 o.a.b.c.f.Poller [er-OjlhJH1g-3908]
PollJob for org.apache.brooklyn.feed.http.HttpFeed$2@6fb72eb8 handling
java.lang.NullPointerException using
org.apache.brooklyn.core.feed.DelegatingPollHandler@19d3dd8a[ctakesReady @
paxy3zlxqx <- http[ctakesReady]]
2019-08-03T12:37:27,005 DEBUG 123 o.a.b.c.f.AttributePollHandler
[er-OjlhJH1g-3908] Read of VanillaJavaAppImpl{id=paxy3zlxqx}->Sensor:
ctakesReady (java.lang.String) gave exception (in grace period):
java.lang.NullPointerException
......
2019-08-03T12:38:07,011 WARN  123 o.a.b.c.f.AttributePollHandler
[er-OjlhJH1g-3907] Read of VanillaJavaAppImpl{id=paxy3zlxqx}->Sensor:
ctakesReady (java.lang.String) gave exception (grace period expired,
occurring for 40s 6ms): java.lang.NullPointerException

I feel as if there should be a way to create that HTTP sensor with a
starting value.  Also I'm sure there may be a better way to link the
success of the HTTPSensor to the latch without the regex transformation,
but I just can't find a good example.   All of the examples just use a
handy boolean attribute value that's already present in the entity
definition.

There's need to solve my problem completely - but if you can point me in
the right direction, that would be great.

 Many thanks

Peter

Reply via email to