Why aren't you just writing samza tasks directly in clojure using gen-class and implementing the samza interfaces? Works great for us. Much simpler.
> On Feb 10, 2016, at 7:39 PM, Jacob Maes <jacob.m...@gmail.com> wrote: > > Hey Andy, > > That's good news! Do you mind sharing the revelation for any other Samza > users in Clojure-land? > > -Jake > > On Wed, Feb 10, 2016 at 4:07 PM, Andy Chambers < > andy.chamb...@fundingcircle.com> wrote: > >> My co-worker has figured out how to do this without any changes required in >> samza. >> Andy Chambers | Full-Stack Software Developer >> >> andy.chamb...@fundingcircle.com | 707-205-6502 (m) >> >> >> >> >> 747 Front St, 4th Fl | San Francisco, CA 94111 >> >> Our Mission: T o build a better financial world >> >> >> >> >> >> >> Unless specifically indicated, this e-mail is not an offer to sell or a >> solicitation of any investment products or other financial product or >> service, >> an official confirmation of any transaction, or an official statement of >> Funding >> Circle USA. This e-mail is meant only for the intended recipient of this >> transmission, and >> contains trade secret and strictly confidential information belonging to >> the >> sender. It is unlawful for unauthorized individuals to review, use, copy, >> disclose, or disseminate confidential information. If you have received >> this >> e-mail in error, please notify the sender immediately by telephone at >> 857.285.1263 or by return email and promptly delete this message from >> your system. >> >> >> >> On 9 February 2016 at 23:47, Andy Chambers < >> andy.chamb...@fundingcircle.com > wrote: >> No Problem. I'm new to samza so it is entirely possible there's already a >> way to >> do this that I'm missing. >> What I'm aiming for, is to implement the features described in the README >> of my >> project https://github.com/ cddr/samza-config . For discussion purposes, >> I'll copy the example here... >> (ns example.word-counter >> (:require >> [samza-config.core :refer [stateful-task key-value-store]])) >> >> (defn count-words [store sentence output] >> (doseq [word (split sentence)] >> (update-in store word inc) >> (output :word-count {:word word >> :count (get store word)}))) >> >> (defjob word-counter >> {:inputs [(topic “words”)] >> :outputs [(topic “word-counts”)] >> :storage (key-value-store :word-counts) >> :task (stateful-task >> (fn [store input output] >> (count-words store input output)))}) >> >> I thought the easiest way to implement this would be for defjob to setup >> some >> metadata that points to implementations of StreamTask/InitableTask and >> have a >> custom ConfigFactory that can return the config for a named job. >> Here is the (in development) implementation of ConfigFactory >> (defrecord JobConfigFactory [] ConfigFactory (getConfig [this uri] (let >> [job (find-job uri)] (println “found job:” job) job))) >> Unfortunately when I run the job runner, passing the name of this class as >> the >> --config-factory, I get the following stacktrace. I believe this is because >> Clojure uses a special “DynamicClassLoader” to find these classes. That is >> what >> I'd set the classloader to if there was the option to do so. >> $ lein do run -m samza-config.job example.jobs.hello-world Running samza >> job: notifications.jobs.send-email Config Factory: samza_config.job. >> JobConfigFactory Class Loader: #object[sun.misc.Launcher$ AppClassLoader >> 0x4aa298b7 sun.misc.Launcher$ AppClassLoader@4aa298b7] Exception in >> thread “main” java.lang. ClassNotFoundException: samza_config.job. >> JobConfigFactory, compiling:(/private/var/ folders/yt/ >> ch58t4q565g3vjvyj5wjfkt00000gp /T/form-init23293643677066296. clj:1:123) at >> clojure.lang.Compiler.load( Compiler.java:7391) at clojure.lang.Compiler. >> loadFile(Compiler.java:7317) at clojure.main$load_script. >> invokeStatic(main.clj:275) at clojure.main$init_opt. >> invokeStatic(main.clj:277) at clojure.main$init_opt.invoke( main.clj:277) >> at clojure.main$initialize. invokeStatic(main.clj:308) at >> clojure.main$null_opt. invokeStatic(main.clj:342) at >> clojure.main$null_opt.invoke( main.clj:339) at clojure.main$main. >> invokeStatic(main.clj:421) at clojure.main$main.doInvoke( main.clj:384) at >> clojure.lang.RestFn.invoke( RestFn.java:421) at >> clojure.lang.Var.invoke(Var. java:383) at clojure.lang.AFn. >> applyToHelper(AFn.java:156) at clojure.lang.Var.applyTo(Var. java:700) at >> clojure.main.main(main.java: 37) Caused by: java.lang. >> ClassNotFoundException: samza_config.job. JobConfigFactory at >> java.net.URLClassLoader. findClass(URLClassLoader.java: 381) at >> java.lang.ClassLoader. loadClass(ClassLoader.java: 424) at >> sun.misc.Launcher$ AppClassLoader.loadClass( Launcher.java:331) at >> java.lang.ClassLoader. loadClass(ClassLoader.java: 357) at >> java.lang.Class.forName0( Native Method) at java.lang.Class.forName(Class. >> java:264) at org.apache.samza.util. CommandLine.loadConfig( >> CommandLine.scala:66) at org.apache.samza.job. JobRunner$.main(JobRunner. >> scala:65) at org.apache.samza.job. JobRunner.main(JobRunner. scala) at >> samza_config.job$_main. invokeStatic(job.clj:102) at >> samza_config.job$_main. doInvoke(job.clj:96) at clojure.lang.RestFn.invoke( >> RestFn.java:408) at clojure.lang.Var.invoke(Var. java:379) at >> user$eval63.invokeStatic(form- init23293643677066296.clj:1) at >> user$eval63.invoke(form- init23293643677066296.clj:1) at >> clojure.lang.Compiler.eval( Compiler.java:6927) at >> clojure.lang.Compiler.eval( Compiler.java:6917) at >> clojure.lang.Compiler.load( Compiler.java:7379) ... 14 more >> That repo also has similarly defined implementations of serde factories >> that >> serialize/deserialize avro messages and check them against the confluent >> schema >> registry. >> The biggest pain point IMO is the requirement to build a jar to run a job >> during >> development. I think it would be possible to define these classes in Java >> and >> have them call into a Clojure API but that's basically what I'm trying to >> avoid >> as I'm more likely to get the Java wrong. >> Thanks for taking the time to understand this request. >> Cheers, AndyAndy Chambers | Full-Stack Software Developer >> >> andy.chambers@fundingcircle. com | 707-205-6502 (m) >> >> >> >> >> 747 Front St, 4th Fl | San Francisco, CA 94111 >> >> Our Mission: T o build a better financial world >> >> >> >> >> >> >> Unless specifically indicated, this e-mail is not an offer to sell or a >> solicitation of any investment products or other financial product or >> service, >> an official confirmation of any transaction, or an official statement of >> Funding >> Circle USA. This e-mail is meant only for the intended recipient of this >> transmission, and >> contains trade secret and strictly confidential information belonging to >> the >> sender. It is unlawful for unauthorized individuals to review, use, copy, >> disclose, or disseminate confidential information. If you have received >> this >> e-mail in error, please notify the sender immediately by telephone at >> 857.285.1263 or by return email and promptly delete this message from >> your system. >> >> >> On 9 February 2016 at 22:46, Yi Pan < nickpa...@gmail.com > wrote: >> Hi, Andy, >> >> Forgive me for my ignorance on the topic of Clojure. Could you give some >> simple example that Config and Serde Factories are in "Clojure-land" and >> how would a customized ClassLoader help in this case? >> >> Thanks a lot! >> >> -Yi >> >> On Tue, Feb 9, 2016 at 10:36 PM, Andy Chambers < >> andy.chambers@fundingcircle. com > wrote: >> >>> That would help but if I understand it correctly, it would still be >>> necessary to implement things like Config and Serde Factories in Java. It >>> would be nice to stay in "Clojure-land" to implement those too. >>> >>> *Andy Chambers* | Full-Stack Software Developer >>> >>> * andy.chambers@fundingcircle. com < andy.chambers@fundingcircle. com >>> * | >>> 707-205-6502 (m) >>> >>> >>> 747 Front St, 4th Fl | San Francisco, CA 94111 >>> >>> *Our Mission: **T**o build a better financial world* >>> >>> >>> Unless specifically indicated, this e-mail is not an offer to sell or a >>> solicitation of any investment products or other financial product or >>> service, an official confirmation of any transaction, or an official >>> statement of Funding Circle USA. This e-mail is meant only for the >>> intended recipient of this transmission, and contains trade secret and >>> strictly confidential information belonging to the sender. It is unlawful >>> for unauthorized individuals to review, use, copy, disclose, or >> disseminate >>> confidential information. If you have received this e-mail in error, >> please >>> notify the sender immediately by telephone at 857.285.1263 or by return >>> email and promptly delete this message from your system. >>> >>>> On 9 February 2016 at 22:25, Yi Pan < nickpa...@gmail.com > wrote: >>>> >>>> Hi, Andy, >>>> >>>> I think that you are looking for the feature in SAMZA-697. Or are you >>>> looking for something even more specific? >>>> >>>> On Tue, Feb 9, 2016 at 10:22 PM, Andy Chambers < >>>> andy.chambers@fundingcircle. com > wrote: >>>> >>>>> Hey Folks, >>>>> I'm trying to build some tooling to make writing jobs in Clojure a >>> little >>>>> bit >>>>> more interactive. One feature that I think would help a lot is to >> allow >>>>> specification of a ClassLoader that is able to find classes defined >>>>> dynamically >>>>> in Clojure. >>>>> Would you consider a feature/patch that adds a config parameter for >>> this >>>>> that >>>>> was respected everywhere Class/forName is called? >>>>> Is there anything else I should consider? >>>>> Thanks, >>>>> Andy >>>>> Andy Chambers | Full-Stack Software Developer >>>>> >>>>> andy.chambers@fundingcircle. com | 707-205-6502 (m) >>>>> >>>>> >>>>> >>>>> >>>>> 747 Front St, 4th Fl | San Francisco, CA 94111 >>>>> >>>>> Our Mission: T o build a better financial world >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> Unless specifically indicated, this e-mail is not an offer to sell >> or a >>>>> solicitation of any investment products or other financial product or >>>>> service, >>>>> an official confirmation of any transaction, or an official statement >>> of >>>>> Funding >>>>> Circle USA. This e-mail is meant only for the intended recipient of >>> this >>>>> transmission, and >>>>> contains trade secret and strictly confidential information belonging >>> to >>>>> the >>>>> sender. It is unlawful for unauthorized individuals to review, use, >>> copy, >>>>> disclose, or disseminate confidential information. If you have >> received >>>>> this >>>>> e-mail in error, please notify the sender immediately by telephone at >>>>> 857.285.1263 or by return email and promptly delete this message >> from >>>>> your system. >>