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 > <[email protected]> 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 < > [email protected]> 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 >>
