Hi Dale,

Thank you for the details. Yes, my use case is to dynamically load and
control topologies run on edge devices by an external application. So as a
starter I am running a simple scenario. When the DynamicAppLoader class is
run, it'll simply load the jar containing the topology and execute it
straightaway. I tried doing this in two ways directly calling registerJar
and then calling it via reflection.

   1. using AppService#registerJar method which is followed by a "submit"
   control request.
   service.registerJar(cpuTempAppJarUrl.toExternalForm(), null);
   JsonObject submitCpuTempAppRequest = newOperationRequest("MyCPUTempApp",
   "submit");
   jsonControlService.controlRequest(submitCpuTempAppRequest);

   2. using a "registerJar" control request which is followed by a "submit"
   control request
   JsonObject registerJarRequest =
   newOperationRequest(cpuTempAppJarUrl.toExternalForm(), "registerJar");
   jsonControlService.controlRequest(registerJarRequest);
   JsonObject submitCpuTempAppRequest = newOperationRequest("MyCPUTempApp",
   "submit");
   jsonControlService.controlRequest(submitCpuTempAppRequest);

Are there any other (*recommended*) ways to do this?

I would be glad to contribute to the doc and code, and perhaps with a
sample as well. What do you mean by a sample exactly? It is not clear to me.

I'll check out the IotProvider as well. It seems interesting, but I don't
yet understand how to instantiate an IotProvider. I also need to understand
how the ControlService works as well. Need to dig in to the documents and
code more.

Thank you again for the support.

/Gayashan

On Thu, Jun 1, 2017 at 2:01 AM, Dale LaBossiere <dml.apa...@gmail.com>
wrote:

> Yeah, this is a ~confusing and an under doc’d area.
> Glad you’re back on track.
>
> There has been some improvement in recent time - e.g., [1][2][3] all post
> 1.1.0.
> Any concrete suggestions regarding that would be appreciated.
> Please consider contributing doc improvements, a new sample or recipe,
> etc! :-)
>
> If you were not aware of IotProvider[4], you may want to check it out.
> IotProvider includes those services you’re manually instantiating/adding to
> your DirectProvider.
>
> Just to be sure… registerJar() is mostly about being able to dynamically
> add topology implementations to a running Edgent app/provider.  Is that
> your use case / can you elaborate on your use case?
>
> — Dale
>
> [1] https://issues.apache.org/jira/browse/EDGENT-406
> [2] https://issues.apache.org/jira/browse/EDGENT-405
> [3] https://issues.apache.org/jira/browse/EDGENT-401
> [4] https://github.com/apache/incubator-edgent/blob/master/
> api/topology/src/main/java/org/apache/edgent/topology/
> services/ApplicationService.java <https://github.com/apache/
> incubator-edgent/blob/master/api/topology/src/main/java/
> org/apache/edgent/topology/services/ApplicationService.java>
>
> > On May 31, 2017, at 4:49 AM, Gayashan Amarasinghe <
> gayashan.amarasin...@gmail.com> wrote:
> >
> > Hi all,
> >
> > After more digging I was able to figure out the issue. In my first jar (
> > cputemptopology-1.0.0.jar) which contains the TopologyBuilder
> > implementation, I haven't registered the service provider and hence the
> > ServiceLoader was unable to pick up the service. After fixing this I was
> > able to get it running.
> >
> > So my current cputemptopology-1.0.0.jar has the following structure.
> >
> > ├── META-INF
> > │   ├── MANIFEST.MF
> > │   ├── maven
> > │   │   └── org.amrsnghe.test.topology
> > │   │       └── cputemptopology
> > │   │           ├── pom.properties
> > │   │           └── pom.xml
> > │   └── services
> > │       └── org.apache.edgent.topology.services.TopologyBuilder
> > └── org
> >    └── amrsnghe
> >        └── test
> >            └── topology
> >                ├── CPUTempSensor.class
> >                └── MyTopology.class
> >
> > And
> > the META-INF/services/org.apache.edgent.topology.services.
> TopologyBuilder
> > has the following line:
> > org.amrsnghe.test.topology.MyTopology
> >
> > Let me know if I am doing something wrong here. But this seems to work,
> and
> > the topology loaded from the jar is submitted to the direct provider and
> > executed without an issue.
> >
> > Thank you.
> >
> > /Gayashan
> >
> > On Wed, May 31, 2017 at 1:11 PM, Gayashan Amarasinghe <
> > gayashan.amarasin...@gmail.com> wrote:
> >
> >> Hi Edgent community,
> >>
> >> I am a PhD student from University of Melbourne and I am interested in
> the
> >> Apache Edgent project. I need some help to implement a scenario to
> submit a
> >> topology externally to a provider. Unfortunately apart from some test
> cases
> >> in the source code and [1], I couldn't find any documentation on this.
> So
> >> here's what I have done so far,
> >>
> >>   - I have implemented the TopologyBuilder interface and created a
> >>   separate jar. This is the code in the class.
> >>
> >> public class MyTopology implements TopologyBuilder {
> >>
> >>    @Override
> >>
> >>    public String getName() {
> >>
> >>        return "MyCPUTempApp";
> >>
> >>    }
> >>
> >>
> >>    @Override
> >>
> >>    public BiConsumer<Topology, JsonObject> getBuilder() {
> >>
> >>        CPUTempSensor cpuTempSensor = new CPUTempSensor();
> >>
> >>        return (t, c) -> t.poll(cpuTempSensor, 2, TimeUnit.SECONDS)
> >>
> >>                .filter(readings -> readings >
> >> 35).sink(System.out::println);
> >>
> >>    }
> >>
> >> }
> >>
> >>
> >>   - In a separate project, I have created another class to instantiate a
> >>   DirectProvider and to load the previous jar using an AppService
> similar to
> >>   the IotAppServiceTest. Here's the code,
> >>
> >> public class DynamicAppLoader {
> >>    public static void main(String[] args) {
> >>        DirectProvider directProvider = new DirectProvider();
> >>        JsonControlService jsonControlService = new JsonControlService();
> >>        directProvider.getServices().addService(ControlService.class,
> >> jsonControlService);
> >>        ApplicationService service = AppService.createAndRegister(
> directProvider,
> >> directProvider);
> >>        File cpuTempAppJar =
> >>                new File("/home/gayashan/projects/
> >> research/cputemptopology/target/cputemptopology-1.0.0.jar");
> >>        try {
> >>            URL cpuTempAppJarUrl = cpuTempAppJar.toURI().toURL();
> >>            JsonObject registerJar = newRegisterJarRequest(
> >> cpuTempAppJarUrl.toExternalForm());
> >>            jsonControlService.controlRequest(registerJar);
> >>            JsonObject submitCpuTempApp = newSubmitRequest("
> >> MyCPUTempApp");
> >>            jsonControlService.controlRequest(submitCpuTempApp);
> >>            System.out.println(service.getApplicationNames());
> >>        } catch (Exception e) {
> >>            System.err.println("Error: " + e.getLocalizedMessage());
> >>        }
> >>    }
> >>
> >> ...
> >> // newRegisterJarRequest and newSubmitRequest methods are as same as in
> >> the IotAppServiceTest class.
> >> }
> >>
> >> But unfortunately I don't understand how to get this to work. Can
> someone
> >> help me with this and point where I am making a mistake? Apologies in
> >> advance if this seems like a trivial question.
> >>
> >> Thank you.
> >>
> >> [1] https://edgent.apache.org/recipes/recipe_dynamic_
> >> analytic_control.html#loosely-coupled-edgent-applications
> >>
> >> Best regards,
> >> Gayashan
> >>
>
>

Reply via email to