Hi Peter, and list:

A couple of things here - 

1 - We’re collaborating on an email list, and we’re pretty evenly spread across 
the global timezones, not to mention that River is a part-time pursuit for most 
of us.  There may be some delay between when a point is made and when anyone 
else actually reads it.  Then it may take some time to digest a statement and 
craft a well-reasoned reply.  Then it’ll be a while before the original sender 
reads the reply, and so on.  So I think we have to accept that it takes some 
time to reach consensus.

2 - We follow the standard Apache voting conventions at 
(http://www.apache.org/foundation/voting.html).  Code review votes require lazy 
consensus, i.e. no “-1” votes.  The three-vote requirement is for releases.  
So, you’re actually good to go, although, given the above I’d wait for while.  
Also, for some issues, it might be a good idea to launch a “Discuss” thread and 
let that settle out prior to a “vote” thread.

So, following the voting norms, you’re proposal is good-to-go (although given 
1, I’d give it a little more time).  I haven’t seen any negative votes.  
Certainly my comment was “+0”.  In fact I’ve seen good discussion from people I 
consider experts in the field.  Even if someone was critical of the idea (which 
I haven’t seen), critics give you good information, and it’s usually a good 
idea to consider opposing points of view.

Cheers,

Greg.

On Dec 19, 2013, at 11:49 PM, Peter <j...@zeus.net.au> wrote:

> This only needs one more +1 vote to pass or -1 for a blocking vote.
> 
> I only need a single method interface so I can fix a serious flaw with our 
> api?  It's not even a breaking change!
> 
> Get over your fear people, let us develop, we are maintaining backward 
> compatibility.
> 
> Without development River will go to the Attic, this is supposed to be an 
> open source development project, not a Jini code museum.
> 
> Get used to the fact there will be a beta release for testing soon. 
> 
> I have people declining to participate because of the hostility towards 
> development that exists on this list.  Lets show some determination, ignore 
> the fear and get the job done.
> 
> The Jini team, they had vision, they might not have delivered what they 
> promised, their marketing might have been mixed up, the limitations of Java 
> might have gotten in the way, but by God, they had vision.  When you reach 
> high you risk failure, but without failure there is no success either.
> 
> We need to decide, is River a Jini code museum, or are we planning to make 
> River work outside local networks and become part of the internet?  Are there 
> people here with vision? IPv6 is on our doorstep, there are data silo's and 
> high powered mobile devices everywhere we could be connecting to make useful 
> applications.  Or do we live in fear and squander our opportunities?
> 
> Perhaps we should fork into two projects, one for Jini 2.x  and one for those 
> who can see a future, have vision and would like to share but keep getting 
> shouted down? 
> 
> Lets create a Jini maintenance project, there's no trademark now, let it have 
> it's own lists, and set River free. 
> 
> Don't take it personal we can still cooperate, I understand people have 
> established niche's, but fresh developers have itches to scratch.
> 
> And before you go flaming me, food for thought: People can only judge on what 
> they know, they cannot judge upon what they don't, fear the unknown, or learn.
> 
> Regards,
> 
> Peter.
> 
> ----- Original message -----
>> 
>> I don’t really see a need to mess around with the existing
>> infrastructure services.   Surely if we can start them as it is and they
>> can be reached through lookup, that’s good enough?   I’m more concerned
>> with having an interface that makes sense for developers to write their
>> own services with.   I suspect we need to just do a few experiments and
>> see what works.
>> 
>> I guess that’s one of my frustrations with all this “refactoring” of the
>> existing codebase - if it doesn’t make it easier for people to use
>> Jini/River to create their own service-oriented architectures, then it
>> just seems like a lot of navel-gazing.   Similarly, we’ve had statements
>> about reorganizing the source code to make it easier to develop with. 
>> To which I ask, “when was the last time anyone worried about the source
>> code of Tomcat, or Websphere, or Weblogic?, or whether they used Maven
>> or not?”.   Even talking about performance is not very helpful until the
>> average corporate coder at the City of Wherever can actually use the
>> product.
>> 
>> We need to get to a point where people are building real things on top
>> of River, not messing around with River.   That’s not to say that the
>> River code can’t be improved or modernized, but it reached “good enough”
>> back in 2003 or so.   
>> 
>> Lest I sound like I’m complaining, let me say it’s great that we’ve had
>> this much traffic on the list in the last few weeks!   I think we’re
>> having great discussions- keep it up, folks!
>> 
>> Greg.
>> 
>> On Dec 19, 2013, at 8:54 PM, Peter <j...@zeus.net.au> wrote:
>> 
>>> If you can work put what a common reflective constructor signature you
>>> need is, any lifecycle methods required, I'll include these for every
>>> existing Jini service and we can make a standard.
>>> 
>>> We can also support JSR330 which is AL2 licensed.
>>> 
>>> Support @Inject for the constructor.
>>> 
>>> Provider<JavaSpace05>
>>> 
>>> Regards,
>>> 
>>> Peter.
>>> 
>>> 
>>> ----- Original message -----
>>>> Hopefully Startable will get enough votes to get across the line, we
>>>> need to make progress, if you care about River you'll vote for it,
>>>> not because it's the perfect solution, simply because it's an
>>>> acceptable solution that makes sense and it marks a progress
>>>> milestone.
>>>> 
>>>> The reflective constructor signature is acceptable and is used by the
>>>> starter kit and Activation.
>>>> 
>>>> We've got Groovy Configuration.
>>>> 
>>>> The service class can also define a static main method.
>>>> 
>>>> If we at least accept these signatures for our services, they could
>>>> run in any container.
>>>> 
>>>> Perhaps you also want a public shutdown method for lifecycle
>>>> management? Closeable would also be acceptable?
>>>> 
>>>> Is there anything else you need?
>>>> 
>>>> Regards,
>>>> 
>>>> Peter.
>>>> 
>>>> ----- Original message -----
>>>>> "What we need is a discussion on a more developer-friendly service
>>>>> startup convention to replace ServiceStarter."
>>>>> 
>>>>> Maybe, that is to say, I'm not anti but I feel there's an
>>>>> additional wider aspect to kickaround as well....
>>>>> 
>>>>> Should there be a failure of the type we've discussed so far, where
>>>>> does the responsibility for sorting it out lie? The service writer,
>>>>> they created the bug in the first place. BUT, has it occurred to
>>>>> anyone that export() isn't the only place multi-threading problems
>>>>> can occur in a service implementation?
>>>>> 
>>>>> Even if they've got service construction right (with whatever
>>>>> convention or pattern you care to adopt, me, I'm in the camp of if
>>>>> it works because it accounts for the JMM it's fine) have they got
>>>>> all their multi-threading right elsewhere? What about all those
>>>>> service methods exported and advertised by JoinManager?
>>>>> 
>>>>> Do we actually think it's possible to address that challenge? (You
>>>>> could do it by single-locking the entire service so only one call
>>>>> can be dispatched at a time, yeah right, that's palatable). What
>>>>> makes export a special case in this context? Why does that matter
>>>>> so when there are many other ways to screw up?
>>>>> 
>>>>> 
>>>>> On 19 December 2013 20:16, Greg Trasuk <tras...@stratuscom.com>
>>>>> wrote:
>>>>> 
>>>>>> 
>>>>>> +0.       Let me explain…
>>>>>> 
>>>>>> Having a separate interface to say start() is all very well and
>>>>>> harmless in itself, but:
>>>>>> 
>>>>>> (a) It doesn’t really address the issue of how service instances
>>>>>> should be started.       We don’t actually have solid
>>>>>> recommendations on this issue, although there have been attempts
>>>>>> in various containers to systematize it.
>>>>>> 
>>>>>> (b) the proposed warning addresses a case where a service
>>>>>> instance is doing “exporter.export(this);”, which I’d call bad
>>>>>> practice in any case. It happens that ServiceStarter appears to
>>>>>> encourage this use case because it works by calling a
>>>>>> constructor.       But the called constructor could (and should)
>>>>>> construct an instance of some other class, and then export and
>>>>>> register that instance rather than “this”.     That style doesn’t
>>>>>> mandate a Startable interface, and having Startable doesn’t
>>>>>> mandate good multi-threaded code.       In other words, you could
>>>>>> implement Startable and still have poor thread-safety.
>>>>>> 
>>>>>> (c) even where there is an apparent problem, the exposure window
>>>>>> is very small.       Consider the last bits of the init(…) method in
>>>>>> “com.sun.jini.reggie.ServiceRegistrarImpl”
>>>>>> 
>>>>>> myRef = (Registrar) serverExporter.export(this);
>>>>>> proxy = RegistrarProxy.getInstance(myRef, myServiceID);
>>>>>> myLocator = (proxy instanceof RemoteMethodControl) ?
>>>>>> new ConstrainableLookupLocator(
>>>>>> unicastDiscoveryHost, unicaster.port, null) :
>>>>>> new LookupLocator(unicastDiscoveryHost, unicaster.port);
>>>>>> /* register myself */
>>>>>> Item item = new Item(new ServiceItem(myServiceID,
>>>>>> proxy,
>>>>>> lookupAttrs));
>>>>>> SvcReg reg = new SvcReg(item, myLeaseID, Long.MAX_VALUE);
>>>>>> addService(reg);
>>>>>> if (log != null) {
>>>>>> log.snapshot();
>>>>>> }
>>>>>> 
>>>>>> try {
>>>>>> DiscoveryGroupManagement dgm = (DiscoveryGroupManagement)
>>>>>> discoer;
>>>>>> String[] groups = dgm.getGroups();
>>>>>> if (groups == null || groups.length > 0) {
>>>>>> throw new ConfigurationException(
>>>>>> "discoveryManager must be initially configured with " +
>>>>>> "no groups");
>>>>>> }
>>>>>> DiscoveryLocatorManagement dlm =
>>>>>> (DiscoveryLocatorManagement) discoer;
>>>>>> if (dlm.getLocators().length > 0) {
>>>>>> throw new ConfigurationException(
>>>>>> "discoveryManager must be initially configured with " +
>>>>>> "no locators");
>>>>>> }
>>>>>> dgm.setGroups(lookupGroups);
>>>>>> dlm.setLocators(lookupLocators);
>>>>>> } catch (ClassCastException e) {
>>>>>> throw new ConfigurationException(null, e);
>>>>>> }
>>>>>> joiner = new JoinManager(proxy, lookupAttrs, myServiceID,
>>>>>> discoer, null, config);
>>>>>> 
>>>>>> /* start up all the daemon threads */
>>>>>> serviceExpirer.start();
>>>>>> eventExpirer.start();
>>>>>> unicaster.start();
>>>>>> multicaster.start();
>>>>>> announcer.start();
>>>>>> 
>>>>>> /* Shutdown hook so reggie sends a final announcement
>>>>>> * packet if VM is terminated.       If reggie is terminated
>>>>>> * through DestroyAdmin.destroy() this hook will have no effect.
>>>>>> * A timeout on announcer.join() was considered but not deemed
>>>>>> * necessary at this point in time.
>>>>>> */
>>>>>> Runtime.getRuntime().addShutdownHook(new Thread( new Runnable() {
>>>>>> public void run() {
>>>>>> try {
>>>>>> announcer.interrupt();
>>>>>> announcer.join();
>>>>>> } catch (Throwable t) {
>>>>>> logThrow(Level.FINEST, getClass().getName(),
>>>>>> "run", "exception shutting announcer down",
>>>>>> new Object[]{}, t);
>>>>>> }
>>>>>> }
>>>>>> }));
>>>>>> 
>>>>>> snapshotter.start();
>>>>>> if (logger.isLoggable(Level.INFO)) {
>>>>>> logger.log(Level.INFO, "started Reggie: {0}, {1}, {2}",
>>>>>> new Object[]{ myServiceID,
>>>>>> Arrays.asList(memberGroups),
>>>>>> myLocator });
>>>>>> }
>>>>>> ready.ready();
>>>>>> }
>>>>>> 
>>>>>> 
>>>>>> The window from when the join manager is started up (ignore the
>>>>>> serverExporter.export().       The only way a client gets to this
>>>>>> endpoint is through a proxy downloaded from the registrar) to
>>>>>> when the init() method exits is effectively 9 lines of code,
>>>>>> during which time a _lot_ of network i/o would have to happen in
>>>>>> order for the object to be used prior to the constructor exit.   
>>>>>>    As well, the actual remote calls are filtered through a command
>>>>>> interface and through the tasker object, and the command classes
>>>>>> often go through synchronized() blocks, which (I think) act as
>>>>>> happens-before fences.
>>>>>> 
>>>>>> The whole thing seems to me a little like the old servlet days,
>>>>>> when we got the SingleThreadModel interface and it only served
>>>>>> to give naive developers a false sense of security.
>>>>>> 
>>>>>> What we need is a discussion on a more developer-friendly service
>>>>>> startup convention to replace ServiceStarter.
>>>>>> 
>>>>>> Having said that, I’m not overly opposed to having Startable,
>>>>>> given that as Dan suggested, any output from the ServiceStarter
>>>>>> is in the form of a suggestion rather than an error.
>>>>>> 
>>>>>> Cheers,
>>>>>> 
>>>>>> Greg.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> On Dec 18, 2013, at 7:42 PM, Peter <j...@zeus.net.au> wrote:
>>>>>> 
>>>>>>> +1 Peter.
>>>>>>> 
>>>>>>> 
>>>>>>> I've been going over the Exporter implementations and Exporter
>>>>>>> interface.
>>>>>>> 
>>>>>>> The Exporter interface specifies that export and unexport
>>>>>>> behaviour is
>>>>>> defined by the implementation.
>>>>>>> 
>>>>>>> That means it's up to the implementation to specify whether a
>>>>>>> happens
>>>>>> before edge occures before export.
>>>>>>> 
>>>>>>> I propose we document in Exporter, that if export is called
>>>>>>> during
>>>>>> object construction then that object's implementation cannot
>>>>>> safely use final fields.
>>>>>>> 
>>>>>>> We should also provide a @see reference to Startable to
>>>>>>> reccommend its
>>>>>> use when final fields are desirable and include Startable in the
>>>>>> spec.
>>>>>>> 
>>>>>>> We don't need to rewrite the example of exporting in
>>>>>>> net.jini.config as
>>>>>> export isn't performed during construction.
>>>>>>> 
>>>>>>> This is a minor update to the Jini Specification.
>>>>>>> 
>>>>>>> The FINE log message is an implementation detail and won't be
>>>>>>> included.
>>>>>>> 
>>>>>>> Regards,
>>>>>>> 
>>>>>>> Peter.
>>>>>>> 
>>>>>>> ----- Original message -----
>>>>>>>> No, an effectively immutable field is one whose reference
>>>>>>>> doesn't change after the service objects safe publication.
>>>>>>>> 
>>>>>>>> An immutable field is final.
>>>>>>>> 
>>>>>>>> It would be Jeri's responsibility to safely publish the
>>>>>>>> service during export to ensure a happens before event
>>>>>>>> occurs, ensuring all non volatile fields the service
>>>>>>>> contains are safely published and visible.
>>>>>>>> 
>>>>>>>> It's possible to have mutable fields guarded by synchronized
>>>>>>>> methods, or volatile fields.
>>>>>>>> 
>>>>>>>> But it isn't possible to have final fields when exporting
>>>>>>>> within the constructor.
>>>>>>>> 
>>>>>>>> If the service contains effectively immutable field
>>>>>>>> references, it must be safely published or if another thread
>>>>>>>> accesses those fields through unsynchronized methods, the
>>>>>>>> thread may only see their default value.
>>>>>>>> 
>>>>>>>> All our service implementations have final fields.           All
>>>>>>>> our services
>>>>>> had
>>>>>>>> some unsynchronized access to non volatile, non final fields.
>>>>>>>> 
>>>>>>>> Trouble is, when you can't have final fields, it's very
>>>>>>>> difficult to determine which fields are effectively
>>>>>>>> immutable and the original programmers design intent, if
>>>>>>>> there's no comment.
>>>>>>>> 
>>>>>>>> Our service implementations all had unsynchronized init()
>>>>>>>> methods called from with the constructor that started
>>>>>>>> threads and exported           Some
>>>>>> fields
>>>>>>>> were final.
>>>>>>>> 
>>>>>>>> For me, a service that contains final fields and is exported
>>>>>>>> after construction is easier to maintain and understand.
>>>>>>>> 
>>>>>>>> I suspect, like our Jini service imlementations, most people
>>>>>>>> get it wrong most of the time.
>>>>>>>> 
>>>>>>>> I get that others won't want to use this method, however it
>>>>>>>> would be detrimental if we don't have such a method for
>>>>>>>> those who would.
>>>>>>>> 
>>>>>>>> Regards,
>>>>>>>> 
>>>>>>>> Peter.
>>>>>>>> 
>>>>>>>> ----- Original message -----
>>>>>>>>> 
>>>>>>>>> I feel like we’re going down a rabbit hole here when you
>>>>>>>>> start talking about exporting immutable objects.             
>>>>>>>>> Wouldn’t it be kind of silly to export an immutable
>>>>>>>>> service?               Isn’t the whole point that you interact
>>>>>>>>> with the service (i.e. alter its state) over a remote
>>>>>>>>> interface?
>>>>>>>>> 
>>>>>>>>> Perhaps it’s better to say that exported services need to
>>>>>>>>> be thread-safe (which should be fairly obvious).             
>>>>>>>>> Yes, immutable objects are inherently thread-safe, so for
>>>>>>>>> sharing information inside a VM, it makes some sense to
>>>>>>>>> minimize the number of mutable objects you pass around.     
>>>>>>>>>          But fundamentally, we’re talking about shared-state
>>>>>>>>> systems here.
>>>>>>>>> 
>>>>>>>>> Cheers,
>>>>>>>>> 
>>>>>>>>> Greg.
>>>>>>>>> 
>>>>>>>>> On Dec 18, 2013, at 7:42 AM, Peter <j...@zeus.net.au>
>>>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>>> Pat your comment about non final fields is interesting.
>>>>>>>>>> 
>>>>>>>>>> Isn't it also the case that we need to safely publish an
>>>>>>>>>> effectively immutable object to share it among threads? 
>>>>>>>>>>            That usually means copying it to a thread safe
>>>>>>>>>> collection or shared via a synchronized method, volatile
>>>>>>>>>> field, or final field in another object?
>>>>>>>>>> 
>>>>>>>>>> So we should also make sure that Jeri uses safe
>>>>>>>>>> publication during export.
>>>>>>>>>> 
>>>>>>>>>> That would allow a service that has no final fields to
>>>>>>>>>> start threads, then export from within a constructor
>>>>>>>>>> safely, provided all operations on non final fields
>>>>>>>>>> happen before starting threads and exporting.
>>>>>>>>>> 
>>>>>>>>>> All our services have final fields, so Starter is more
>>>>>>>>>> appropriate for River's own services.
>>>>>>>>>> 
>>>>>>>>>> Regards,
>>>>>>>>>> 
>>>>>>>>>> Peter.
>>>>>>>>>> 
>>>>>>>>>> ----- Original message -----
>>>>>>>>>>> Hmm, good point, Startable, makes more sense.
>>>>>>>>>>> 
>>>>>>>>>>> An object can be exported using Startable.
>>>>>>>>>>> 
>>>>>>>>>>> I think we should have a policy to strongly discourage
>>>>>>>>>>> exporting from constructors.
>>>>>>>>>>> 
>>>>>>>>>>> Regards,
>>>>>>>>>>> 
>>>>>>>>>>> Peter.
>>>>>>>>>>> 
>>>>>>>>>>> ----- Original message -----
>>>>>>>>>>>> As far as I can tell, the special properties of
>>>>>>>>>>>> completing a constructor                       in the JLS memory
>>>>>>>>>>>> model are:
>>>>>>>>>>>> 
>>>>>>>>>>>> 1. A happens-before edge from the end of the
>>>>>>>>>>>> constructor to the start of                       a finalizer.
>>>>>>>>>>>> (17.4.5)
>>>>>>>>>>>> 
>>>>>>>>>>>> 2. The guarantee that any thread that only sees a
>>>>>>>>>>>> reference to an object                       after the end of
>>>>>>>>>>>> the constructor will see the correctly initialized   
>>>>>>>>>>>>                  values of all final fields. (17.5)
>>>>>>>>>>>> 
>>>>>>>>>>>> The special issue with final fields is that
>>>>>>>>>>>> implementations have freedom                       to optimize
>>>>>>>>>>>> access to final fields in ways that are not permitted
>>>>>>>>>>>> for                       non-final fields. Strategies for
>>>>>>>>>>>> thread safety that work for non-final                     
>>>>>>>>>>>> fields do not necessarily work for final fields. The
>>>>>>>>>>>> requirement for     final field safety is that the
>>>>>>>>>>>> constructor end before another thread accesses the
>>>>>>>>>>>> newly constructed object.
>>>>>>>>>>>> 
>>>>>>>>>>>> Calling a start() method after construction if the
>>>>>>>>>>>> class implements a               new interface seems to me
>>>>>>>>>>>> to be harmless, backwards compatible, and             
>>>>>>>>>>>> useful. It enables the simplest and most direct way
>>>>>>>>>>>> of preventing access                       to the new object by
>>>>>>>>>>>> another thread during construction.
>>>>>>>>>>>> 
>>>>>>>>>>>> The roadmap issue is whether it should be required,
>>>>>>>>>>>> and if so the level                       of enforcement. For
>>>>>>>>>>>> example, there is no reason to require it if the       
>>>>>>>>>>>>                class does not declare any final fields.
>>>>>>>>>>>> 
>>>>>>>>>>>> Incidentally, and as a detail, "Commission" does not
>>>>>>>>>>>> immediately make me                       think of having a
>>>>>>>>>>>> start() method that should be called after             
>>>>>>>>>>>> construction. If you do go this way, the name needs
>>>>>>>>>>>> thought. "Startable"                       would be more
>>>>>>>>>>>> obvious, more memorable, more likely to be found on 
>>>>>>>>>>>>                    searches, and more compatible with familiar
>>>>>>>>>>>> interface names such as                       "Cloneable" and
>>>>>>>>>>>> "Iterable".
>>>>>>>>>>>> 
>>>>>>>>>>>> Patricia
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> On 12/18/2013 2:18 AM, Peter wrote:
>>>>>>>>>>>>> Well, now seems like a good time to have the
>>>>>>>>>>>>> conversation.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Yes there are other ways, but I haven't seen one
>>>>>>>>>>>>> safe implementation yet, so...
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Does someone have a better way to solve this
>>>>>>>>>>>>> problem, has someone already solved this problem
>>>>>>>>>>>>> I'm unaware of that we can adopt, or is there a
>>>>>>>>>>>>> way that's more satisfactory?
>>>>>>>>>>>>> 
>>>>>>>>>>>>> If not, is there something objectionable with the
>>>>>>>>>>>>> Commission interface and if so, how can we fix it?
>>>>>>>>>>>>> 
>>>>>>>>>>>>> The SEVERE log message is logged by the River start
>>>>>>>>>>>>> package, other containers or frameworks can choose
>>>>>>>>>>>>> whether or not to do so, but I'd encourage them to
>>>>>>>>>>>>> do something similar, yes we can change it to WARN.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> A much harsher option is to throw an exception
>>>>>>>>>>>>> during export which breaks backward compatibility.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Regards,
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Peter.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> ----- Original message -----
>>>>>>>>>>>>>> "org.apache.river.api.util.Commission is an
>>>>>>>>>>>>>> interface services should implement"
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> If it's a SHOULD, not a MUST, chucking out a
>>>>>>>>>>>>>> SEVERE is incorrect logger behaviour IMO. You
>>>>>>>>>>>>>> could issue a WARN if you like but for even that
>>>>>>>>>>>>>> I'd say you need to provide a roadmap explaining
>>>>>>>>>>>>>> why the warning and what you intend to do in
>>>>>>>>>>>>>> future and what you expect of service writers
>>>>>>>>>>>>>> such as myself.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Commission, at least from my point of view, is
>>>>>>>>>>>>>> your means (maybe the River community's - did
>>>>>>>>>>>>>> you ask us?) for satisfying your needs in
>>>>>>>>>>>>>> respect of the JMM. As we've discussed
>>>>>>>>>>>>>> previously, there are other ways too and they
>>>>>>>>>>>>>> work and they are safe if you know what you're
>>>>>>>>>>>>>> doing. Your contention was that most don't know
>>>>>>>>>>>>>> what they're doing hence, presumably, Commission.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> So the thing is, you are seemingly on a road to
>>>>>>>>>>>>>> asserting more structure (gosh, a standard?) on
>>>>>>>>>>>>>> the way people write their services. If so,
>>>>>>>>>>>>>> you'd best start flagging that honestly and
>>>>>>>>>>>>>> openly via a roadmap, deprecation and
>>>>>>>>>>>>>> such/whatever rather than sticking out logger
>>>>>>>>>>>>>> messages with no clear guidance and at the cost
>>>>>>>>>>>>>> of a certain amount of nuisance (no admin I know
>>>>>>>>>>>>>> likes SEVERE's being logged for something which
>>>>>>>>>>>>>> isn't critical cos it's noise they don't want in
>>>>>>>>>>>>>> log files).
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> And of course, we all know that when some entity
>>>>>>>>>>>>>> asserts a standard or requirement on others for
>>>>>>>>>>>>>> entry, they may choose not to enter. Does this
>>>>>>>>>>>>>> help your community or hinder it? The answer to
>>>>>>>>>>>>>> that is, it depends. On what? Have you asked or
>>>>>>>>>>>>>> tested? How have you tested? What would be
>>>>>>>>>>>>>> considered validation or lack of support?
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> I am not out to flame or troll rather I want to
>>>>>>>>>>>>>> see this community demonstrating good behaviour
>>>>>>>>>>>>>> and I'm not feeling like what's going on around
>>>>>>>>>>>>>> Commission (what is that big change in version
>>>>>>>>>>>>>> number really saying?) is such.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> On 18 December 2013 08:52, Peter
>>>>>>>>>>>>>> <j...@zeus.net.au> wrote:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Just to clarify
>>>>>>>>>>>>>>> org.apache.river.api.util.Commission is an
>>>>>>>>>>>>>>> interface services should implement, I would
>>>>>>>>>>>>>>> encourage all container projects to pick up the
>>>>>>>>>>>>>>> interface and make suggestions for improvement
>>>>>>>>>>>>>>> if there are any issues.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Interface Commission {
>>>>>>>>>>>>>>> void start () throws Exception;
>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> It's called after JMM safe construction to
>>>>>>>>>>>>>>> allow the service to start any threads and be
>>>>>>>>>>>>>>> exported.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Regards,
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Peter.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> ----- Original message -----
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> The way that services are instantiated and
>>>>>>>>>>>>>>>> setup is an implementation detail.                   
>>>>>>>>>>>>>>>>                      When I think of compatibility
>>>>>>>>>>>>>>>> I think of the API and the lookup methods. We
>>>>>>>>>>>>>>>> think of compatibility from a client point of
>>>>>>>>>>>>>>>> view.                                                          
>>>>>>>>>>>>>>>>                    
>>>>>>>>>>>>>>>> From the client point of view, using a
>>>>>>>>>>>>>>>> service looks like this:
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> - Use multicast of unicast discovery to find
>>>>>>>>>>>>>>>> one or more ServiceRegistrar instances           
>>>>>>>>>>>>>>>>                  - Call
>>>>>>>>>>>>>>>> lookup(…) on one or more of these instances
>>>>>>>>>>>>>>>> to get a set of service candidates               -
>>>>>>>>>>>>>>>> Choose a candidate and prepare() it using a
>>>>>>>>>>>>>>>> ProxyPreparer, to yield a usable service
>>>>>>>>>>>>>>>> proxy. 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> - Make calls on it.                                            
>>>>>>>>>>>>>>>>      
>>>>>>>>>>>>>>>>      Ideally hang on to this proxy
>>>>>>>>>>>>>>>> instance, so you can skip the discovery and
>>>>>>>>>>>>>>>> lookup next time you need it.                             
>>>>>>>>>>>>>>>>          - If the call
>>>>>>>>>>>>>>>> fails, repeat the lookup (and possibly
>>>>>>>>>>>>>>>> discovery) til you get a proxy that works.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Nowhere does the client need to know whether
>>>>>>>>>>>>>>>> the service instance is started up using the
>>>>>>>>>>>>>>>> “com.sun.jini.start” mechanism, your
>>>>>>>>>>>>>>>> Commission interface, some other IOC
>>>>>>>>>>>>>>>> container (Rio, Harvester, Seven or
>>>>>>>>>>>>>>>> RiverContainer) or some unknown mechanism
>>>>>>>>>>>>>>>> that starts with a static main() method.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> JSK2.0 was 2.0 because of the introduction
>>>>>>>>>>>>>>>> of the proxy verification mechanisms, as
>>>>>>>>>>>>>>>> well as JERI. Absent some new client usage
>>>>>>>>>>>>>>>> mechanism, River doesn’t need to go to 3.0.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Greg.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> On Dec 17, 2013, at 1:58 PM, Peter
>>>>>>>>>>>>>>>> <j...@zeus.net.au> wrote:
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> I think changing services to use safe
>>>>>>>>>>>>>>>>> construction techniques is enough to cause
>>>>>>>>>>>>>>>>> the version jump.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> At this point I've allowed services to
>>>>>>>>>>>>>>>>> continue unsafe construction practices,
>>>>>>>>>>>>>>>>> while logging a SEVERE warning when the
>>>>>>>>>>>>>>>>> Commission interface isn't implemented,
>>>>>>>>>>>>>>>>> rather than fail.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> This is a fundamental change to the way
>>>>>>>>>>>>>>>>> services are written.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Regards,
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Peter.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> ----- Original message -----
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Assuming that there aren’t major
>>>>>>>>>>>>>>>>>> incompatibilities, I think that would be
>>>>>>>>>>>>>>>>>> a “minor” version change according to our
>>>>>>>>>>>>>>>>>> versioning policy, so we’d be looking at
>>>>>>>>>>>>>>>>>> the “2.3” branch rather than a “3.0”
>>>>>>>>>>>>>>>>>> release.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> I’m still unnerved by the massive
>>>>>>>>>>>>>>>>>> amounts of changes to both code and
>>>>>>>>>>>>>>>>>> tests in the qa_refactor branch, as well
>>>>>>>>>>>>>>>>>> as the apparent instability of the code,
>>>>>>>>>>>>>>>>>> although that seems to be improving. In
>>>>>>>>>>>>>>>>>> the next few weeks I’m going to try and
>>>>>>>>>>>>>>>>>> setup a cross-test case, to see what the
>>>>>>>>>>>>>>>>>> “2.2” tests say about the potential
>>>>>>>>>>>>>>>>>> “2.3” release and vice-versa.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> I think what I’d really like to see is an
>>>>>>>>>>>>>>>>>> incremental approach where we update
>>>>>>>>>>>>>>>>>> limited components of the “2.2” branch,
>>>>>>>>>>>>>>>>>> one at a time. Is there anything that we
>>>>>>>>>>>>>>>>>> could pull out piecemeal? Maybe it
>>>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>> make sense to split out the
>>>>>>>>>>>>>>>>>> infrastructure services, like Reggie,
>>>>>>>>>>>>>>>>>> Mahalo, and Outrigger into different
>>>>>>>>>>>>>>>>>> sub-projects that could be updated
>>>>>>>>>>>>>>>>>> separately?
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Any thoughts?
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Greg.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> On Dec 17, 2013, at 5:03 AM, Peter
>>>>>>>>>>>>>>>>>> <j...@zeus.net.au> wrote:
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> When the qa_refactor branch
>>>>>>>>>>>>>>>>>>> stabilises, I plan to merge trunk and
>>>>>>>>>>>>>>>>>>> provide a beta release for client
>>>>>>>>>>>>>>>>>>> compatibility testing.
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> Changes made have been focused on
>>>>>>>>>>>>>>>>>>> making our code thread safe, there are
>>>>>>>>>>>>>>>>>>> significant changes internally, the
>>>>>>>>>>>>>>>>>>> public api remains focused on backward
>>>>>>>>>>>>>>>>>>> compatibility, however it is advisable
>>>>>>>>>>>>>>>>>>> that client services adopt new safe
>>>>>>>>>>>>>>>>>>> construction techniques for services
>>>>>>>>>>>>>>>>>>> and implement the new Commission
>>>>>>>>>>>>>>>>>>> interface.
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> What's a suitable test period for
>>>>>>>>>>>>>>>>>>> client testing?
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> Regards,
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> Peter.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>> 
>>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>> 
>>>> 
>>> 
>> 
> 

Reply via email to