+1
On 16/11/2016 11:07, Richard Nicholson wrote: > Agree with Niclas. I don’t understand the resolution comment. > > Not only is OSGi <> Jini integration feasible but it is a historical fact. > Paremus did this - and a pretty good job we did - in … something like 2006 > :-/ > > If the River community decided that there is interest in OSGi - then I’d > suggest reading the Remote Service and Remote Service Admin specifications > and thinking about how Jini concepts might enhance that world view. There are > well over 10 million OSGi enabled IoT gateways out there! > > Sorry - I see no compelling technical or commercial arguments for the JBoss > Module route. > > >> On 16 Nov 2016, at 08:11, Niclas Hedhman <nic...@hedhman.org> wrote: >> >> I am curious, what do you mean by "non-deterministic dependency resolution" >> ? You can make it as predictable as you wish with attributes and >> directives. >> >> Cheers >> Niclas >> >> On Wed, Nov 16, 2016 at 4:07 PM, Michał Kłeczek <michal.klec...@xpro.biz> >> wrote: >> >>> While non-hierarchical class loading is crucial, OSGI with its >>> non-deterministic dependency resolution is very difficult ( if not >>> impossible ) to target. >>> I'm working on JBoss Module based class loading for River which I'm going >>> to propose as contribution soon. >>> >>> Thanks, >>> Michal >>> >>> On Wednesday, 16 November 2016, Dawid Loubser <da...@travellinck.com> >>> wrote: >>> >>>> +1 for OSGi providing the best solution to the class resolution problem, >>>> though I think some work will have to be done around trust, as you say. >>>> >>>> >>>> On 16/11/2016 02:23, Peter wrote: >>>>> The conventional alternatives will remain; the existing ClassLoader >>>> isolation and the complexities surrounding multiple copies of the same or >>>> different versions of the same classes interacting within the same jvm. >>>> Maven will present a new alternative of maximum sharing, where different >>>> service principals will share the same identity. >>>>> Clearly, the simplest solution is to avoid code download and only use >>>> reflection proxy's >>>>> An inter process call isn't remote, but there is a question of how a >>>> reflection proxy should behave when a subprocess is terminated. >>>>> UndeclaredThrowableException seems appropriate. >>>>> >>>>> It would plug in via the existing ClassLoading RMIClassLoader provider >>>> mechanism, it would be a client concern, transparent to the service or >>>> server. >>>>> The existing behaviour would remain default. >>>>> >>>>> So there can be multiple class resolution options: >>>>> >>>>> 1. Existing PrefferedClassProvider. >>>>> 2. Maven class resolution, where maximum class sharing exists. This >>> may >>>> be preferable in situations where there is one domain of trust, eg within >>>> one corporation or company. Max performance. >>>>> 3. Process Isolation. Interoperation between trusted entities, where >>>> code version incompatibilities may exist, because of separate development >>>> teams and administrators. Each domain of trust has it's own process >>>> domain. Max compatibility, but slower. >>>>> 4. OSGi. >>>>> >>>>> There may be occassions where simpler (because developers don't need to >>>> understand ClassLoaders), slow, compatible and reliable wins over fast >>> and >>>> complex or broken. >>>>> A subprocess may host numerous proxy's and codebases from one principal >>>> trust domain (even a later version of River could be provisioned using >>>> Maven). A subprocess would exist for each trust domain. So if there are >>>> two companies, code from each remains isolated and communicates only >>> using >>>> common api. No unintended code versioning conflicts. >>>>> This choice would not prevent or exclude other methods of >>> communication, >>>> the service, even if isolated within it's own process will still >>>> communicate remotely over the network using JERI, JSON etc. This is >>>> orthogonal to and independant of remote communication protocols. >>>>> OSGi would of course be an alternative option, if one wished to execute >>>> incompatible versions of libraries etc within one process, but different >>>> trust domains will have a shared identity, again this may not matter >>>> depending on the use case. >>>>> Cheers, >>>>> >>>>> Peter. >>>>> >>>>> ESent from my Samsung device. >>>>> >>>>> Include original message >>>>> ---- Original message ---- >>>>> From: "Michał Kłeczek (XPro Sp. z o. o.)" <michal.klec...@xpro.biz >>>> <javascript:;>> >>>>> Sent: 15/11/2016 10:30:29 pm >>>>> To: dev@river.apache.org <javascript:;> >>>>> Subject: Re: Maven Build >>>>> >>>>> While I also thought about out-of-process based mechanism for execution >>>> of dynamically downloaded code, I came to the conclusion that in the >>>> context of River/Java in-process mechanism is something that MUST be done >>>> right. All other things can (and should) be built on that. >>>>> I think that the proposal to implement "remote calls on smart proxy >>>> interfaces that aren't remote" is somewhat a misnomer. The call is either >>>> remote or local - you cannot have both at the same time. AFAIK Jini >>>> community always believed there is no possibility to have local/remote >>>> transparency. That is why there exists java.rmi.Remote marker interface >>> in >>>> the first place. >>>>> There is also the question about the level of isolation you want to >>>> achieve. Simple "out-of-process" is not enough, chroot is not enough, >>>> CGROUPS/containers/jails/zones might be not enough, virtual machines >>> might >>>> be not enough :) - going the route you propose opens up the whole world >>> of >>>> new questions to answer. At the same time you loose the most important >>>> advantages of in-process execution: >>>>> - simplicity of communication between components (basic function call, >>>> no need to do anything complicated to implement callbacks etc.) >>>>> - performance >>>>> >>>>> In the end you either standardize on the well known set of >>> communication >>>> protocols (such as JERI) OR you say "end of protocols" by allowing >>>> execution of dynamically downloaded code in-process. >>>>> If River is going to choose the first route - IMHO it is going to fail >>>> since it does not propose anything competitive comparing to current >>>> mainstream HTTP(S)/REST/JSON stack. >>>>> Thanks, >>>>> Michal >>>>> Peter November 15, 2016 at 8:28 AM >>>>> I've been thinking about process isolation (instead of using >>>> ClassLoader's for isolation). Typically, smart proxy's are isolated in >>>> their own ClassLoader, with their own copies of classes, however with >>>> Maven, a lot more class sharing occurs. Since River uses codebase >>>> annotations for identity, using maven codebase annotations will result in >>>> proxy's from different services sharing identity. >>>>> A better way to provide for different identities coexisting on the same >>>> node, would be to use subprocess jvm's for each Service's server >>> principal >>>> identity, to keep classes from different services in different processes. >>>>> This way, each principal would have their own process & Maven namespace >>>> for their proxy's. >>>>> Presently JERI only exports interfaces in reflection proxy's that >>>> implement Remote, so I'd need an endpoint that can export all >>> interfaces, >>>> accross a local interprocess connection to allow remote calls on smart >>>> proxy interfaces that aren't remote. >>>>> This also means that memory resource consumption of smart proxy's can >>> be >>>> controlled by the client and a smart proxy's process killed without >>> killing >>>> the client jvm. >>>>> Cheers, >>>>> >>>>> Peter. >>>>> >>>>> >>>>> >>>>> Dawid Loubser November 15, 2016 at 8:50 AM >>>>> As a very heavy Maven user, I wanted to say that this is great news. >>>>> This is encouraging indeed! >>>>> >>>>> Dawid >>>>> >>>>> >>>>> Peter November 15, 2016 at 4:08 AM >>>>> Some other news that might encourage participation, I've been working >>>> on Dennis Reedy's script to modularise the codebase, I haven't run the >>> test >>>> suites against it and it isn't generating stubs yet, and I'll need to >>>> modify the platform modules for the IoT effort after the conversion is >>>> complete. >>>>> Here's the output of the River maven build: >>>>> >>>>> Reactor Summary: >>>>> >>>>> River-Internet Project ............................ SUCCESS [0.689s] >>>>> Module :: River Policy ............................ SUCCESS [8.395s] >>>>> Module :: River Resources ......................... SUCCESS [0.607s] >>>>> Module :: River Platform .......................... SUCCESS [23.521s] >>>>> Module :: River Service DL Library ................ SUCCESS [8.999s] >>>>> Module :: River Service Library ................... SUCCESS [8.014s] >>>>> Module :: River Service Starter ................... SUCCESS [3.930s] >>>>> Module :: River SharedGroup Destroy ............... SUCCESS [3.018s] >>>>> Module :: Outrigger .............................. SUCCESS [0.056s] >>>>> Module :: Outrigger Service Download classes ...... SUCCESS [2.416s] >>>>> Module :: Outrigger Service Implementation ........ SUCCESS [4.118s] >>>>> Module :: Outrigger Snaplogstore ................. SUCCESS [3.273s] >>>>> Module :: Lookup Service ......................... SUCCESS [0.048s] >>>>> Module :: Reggie Service Download classes ........ SUCCESS [3.966s] >>>>> Module :: Reggie Service Implementation .......... SUCCESS [3.621s] >>>>> Module :: Mahalo ................................. SUCCESS [0.436s] >>>>> Module :: Mahalo Service Download classes ......... SUCCESS [2.059s] >>>>> Module :: Mahalo Service Implementation ........... SUCCESS [4.175s] >>>>> Module :: Mercury the Event Mailbox ............... SUCCESS [0.497s] >>>>> Module :: Mercury Service Download classes ........ SUCCESS [3622s] >>>>> Module :: Mercury Service Implementation .......... SUCCESS [3.562s] >>>>> Module :: Norm .................................... SUCCESS [0.013s] >>>>> Module :: Norm Service Download classes ........... SUCCESS [2.867s] >>>>> Module :: Norm Service Implementation ............. SUCCESS [6.390s] >>>>> Module :: Group ................................... SUCCESS [0.025s] >>>>> Module :: Mahalo Service Download classes ......... SUCCESS [2.877s] >>>>> Module :: Group Service Implementation ............ SUCCESS [2.037s] >>>>> Module :: Tools ................................... SUCCESS [0.485s] >>>>> Module :: Check ConfigurationFile ................. SUCCESS [2.720s] >>>>> Module :: Check serialversionUid .................. SUCCESS [2.129s] >>>>> Module :: ClassDep ................................ SUCCESS [4.157s] >>>>> Module :: Class Server ............................. SUCCESS [3.353s] >>>>> Module :: Compute message digest .................. SUCCESS [1.734s] >>>>> Module :: Compute httpmd codebase ................. SUCCESS [2.102s] >>>>> Module :: Environment Check ...................... SUCCESS [2.837s] >>>>> Module :: Jar wrapper ............................ SUCCESS [2.179s] >>>>> Module :: Preferred classes list generator ........ SUCCESS [2.495s] >>>>> Module :: Phoenix Activation ..................... SUCCESS [0.029s] >>>>> Module :: Phoenix Download ....................... SUCCESS [2.685s] >>>>> Module :: Phoenix ................................ SUCCESS [4.095s] >>>>> Module :: Phoenix Group ........................... SUCCESS [2.445s] >>>>> Module :: Phoenix Init ............................ SUCCESS [1.740s] >>>>> River Distribution ................................ SUCCESS [10.523s] >>>>> ------------------------------------------------------------ >>> ------------ >>>>> BUILD SUCCESS >>>>> ------------------------------------------------------------ >>> ------------ >>>>> Total time: 2:29.804s >>>>> Finished at: Mon Nov 14 22:22:31 EST 2016 >>>>> Final Memory: 145M/247M >>>>> ------------------------------------------------------------ >>> ------------ >>>>> >>>>> >>>>> >>>> >> >> >> -- >> Niclas Hedhman, Software Developer >> http://zest.apache.org - New Energy for Java