Hi Deepal, >> Deploying a service in application scope , user want to have once >> service impl instance (im I were a user , I want that ) > > > Frankly I don't...
:) > Service impl class is a Axis2 bundled MR(eg: > RawXMLInOut..) specific notion... Service impl is meaning less if the > user has written a custom MR.. yes , I agree. btw we use all those concept in code gen as well , I mean all the generated MR support all those. > One example would be a BPELEngine > (which I did :) ), where we had our own Message Receiver and we stored > all the state data in the service context.. yes , as I told you earlier thats the perfect way , but there are users how want to store values in service impl. (And for me I think that is not that bad when you deploy a service in application scope) > See > http://issues.apache.org/jira/browse/AXIS2-1133 this too.. > >> so we're now talking about >> setting a TLS OperationContext.getCurrentContext() into the AxisEngine, >> right before it calls the MessageReceiver > > > I'm not sure about the impact of this change... If this is not a > straight forward change I doubt whether we should do this at this > moment... Don't want to take any chances towards 1.1 :(... no , if we are going to make this change we have to do that before 1.1 , and I dont think the change we are planing to do will affect that much :) > >> We should maintain both ,I mean >> - should have only one serviceContext >> - and only one service impl > > > any concrete use cases.... Use cases which cannot be implemented using > by storing the state data in the service context... > > >> What if user want to keep local variable inside the impl class . I know >> that is not the best practice bt ppl are using that . > > Then why we gonna encourage that ?? > > Thanks, > ~Thilina > >> >> > IMO anybody can use >> > the ServiceContext to store whatever the state data needed to be >> > shared across the life of the service...Are there any special cases >> > where we can't do that.. If there aren't any reasons my suggestion is >> > to create the service object per invocation. >> > >> > Also a user who uses the application scope might most probably be >> > working in the messagereceiver(MR) level, since MR is known to be the >> > ultimate message recipient in Axis2. One possible example is a BPEL >> > engine.. In that case the concept of one service object for the life >> > time of the service invalidates.. AFAIKS AXIS2-1133 is another >> > implication of this design... >> > >> > Thanks, >> > Thilina >> > >> > On 10/10/06, Sanjiva Weerawarana <[EMAIL PROTECTED]> wrote: >> > >> >> Other choices? >> >> >> >> The approach we used back in ApacheSOAP was to tell the user to >> add an >> >> additional first parameter to their methods if they wanted the >> >> context .. so the signature would have an additional param and that'd >> >> tell us to do the right thing. Very thread safe. >> >> >> >> Need to avoid reflection - but can be done by a codegen flag. For RPC >> >> case its reflective anyway so its not a big deal. >> >> >> >> Sanjiva. >> >> >> >> On Tue, 2006-10-10 at 09:40 -0400, Davanum Srinivas wrote: >> >> > Sanjiva, >> >> > >> >> > We had terrible problems with TLS in Axis1...let me recollect my >> >> > thougts and post. >> >> > >> >> > -- dims >> >> > >> >> > On 10/10/06, Sanjiva Weerawarana <[EMAIL PROTECTED]> wrote: >> >> > > I think I agree with you. How about we drop setOperationContext() >> >> and >> >> > > introduce Axis1-style MessageContext.getCurrentContext() which >> >> returns >> >> > > it for this thread? Have to be careful to put it in TLS and take >> >> it off! >> >> > > >> >> > > We must be careful to tell users that instance variables are not >> >> > > supported; you have to use MessageContext properties to store >> >> state (or >> >> > > wherever else). >> >> > > >> >> > > Sanjiva. >> >> > > >> >> > > On Sun, 2006-09-24 at 14:12 +0200, Christopher Sahnwaldt wrote: >> >> > > > Entered as http://issues.apache.org/jira/browse/AXIS2-1224 . >> >> > > > I set the priority to blocker as David suggested. >> >> > > > >> >> > > > IMHO it's probably best to drop the method. Many users will use >> >> it in an >> >> > > > intuitive but wrong way. The only way to store the data it >> >> provides is an >> >> > > > instance variable, and telling users to either use only request >> >> scope or use >> >> > > > a ThreadLocal to store the data does not seem to be compatible >> >> with the >> >> > > > rule of least surprise. Something like >> >> MessageContext.getCurrentContext() >> >> > > > in Axis 1 might be better. >> >> > > > >> >> > > > Bye, >> >> > > > Christopher. >> >> > > > >> >> > > > Davanum Srinivas wrote: >> >> > > > > Chris, >> >> > > > > >> >> > > > > Can you please raise a new issue in JIRA? >> >> > > > > >> >> > > > > thanks, >> >> > > > > dims >> >> > > > > >> >> > > > > On 9/23/06, Christopher Sahnwaldt <[EMAIL PROTECTED]> wrote: >> >> > > > >> Something worries me: >> >> > > > >> >> >> > > > >> > setOperationContext(OperationContext) - per call. The >> >> messageContext >> >> > > > >> > can be obtained to gain per call instance information. >> >> > > > >> >> >> > > > >> That doesn't seem to be thread-safe, does it? If I >> >> understand this >> >> > > > >> correctly, one service object is created per application (if >> >> the >> >> > > > >> service has application scope). When a request comes in, >> >> Axis calls >> >> > > > >> the setOperationContext method, and the service object may >> >> store the >> >> > > > >> OperationContext or the MessageContext. Then Axis calls the >> >> actual >> >> > > > >> service method, in which the service code can access the >> stored >> >> > > > >> OperationContext or MessageContext. But what if two requests >> >> come >> >> > > > >> in almost simultaneously? The following sequence of method >> >> calls >> >> > > > >> may occur: >> >> > > > >> >> >> > > > >> - Axis calls setOperationContext with context for request A, >> >> the >> >> > > > >> service object stores the context in an instance field. >> >> > > > >> - Axis calls setOperationContext with context for request B, >> >> the same >> >> > > > >> service object stores the context in the same instance >> >> field and >> >> > > > >> thus *overwrites* the context for call A. >> >> > > > >> - Axis calls the service method with the input parameters >> >> for request A. >> >> > > > >> - The service method processes the call, using data from the >> >> stored >> >> > > > >> context, and thus *mixes the input parameters for call A >> >> with the >> >> > > > >> context data for call B*. Anything can happen... >> >> > > > >> - Finally, Axis calls the service method with the input >> >> parameters >> >> > > > >> for call B, the service method processes the call, using >> >> data from >> >> > > > >> the stored context, and thus correctly uses the input >> >> parameters >> >> > > > >> for call B with the context data for call B. Probably ok, >> >> unless >> >> > > > >> the service method updated the context in some way during >> >> the call >> >> > > > >> for request A. >> >> > > > >> >> >> > > > >> But I hope I'm wrong or misunderstood or forgot something... >> >> ;-) >> >> > > > >> >> >> > > > >> Axis 1 avoided this problem by >> >> MessageContext.getCurrentContext(), >> >> > > > >> which gives access to the MessageContext *for the current >> >> thread* >> >> > > > >> from within any service method, without the need for a >> >> > > > >> setMessageContext (or setOperationContext) method on the >> >> service >> >> > > > >> object. >> >> > > > >> >> >> > > > >> Bye, >> >> > > > >> Christopher. >> >> > > > >> >> >> > > > >> >> >> > > > >> Tony Dean wrote: >> >> > > > >> >> >> > > > >> > Can we fully document the logical semantics behind each >> >> method? >> >> > > > >> > >> >> > > > >> > init(ServiceContext) - To me this use to mean application >> >> init. >> >> > > > >> Now it means session init. However, when running >> >> > > > >> scope="Application", it is analogous to application init >> >> since you >> >> > > > >> will only have one session; but, still probably not >> >> appropriate to >> >> > > > >> think in those terms. >> >> > > > >> > >> >> > > > >> > How should an application use this method? A session >> >> use-case >> >> > > > >> would be nice. >> >> > > > >> > >> >> > > > >> > destroy(ServiceContext) - inverse of init() >> >> > > > >> > Use-case? >> >> > > > >> > >> >> > > > >> > setOperationContext(OperationContext) - per call. The >> >> > > > >> messageContext can be obtained to gain per call instance >> >> information. >> >> > > > >> > >> >> > > > >> > StartUp() - one time initialization... DB connections >> etc... >> >> > > > >> > Shutdown() - inverse of StartUp() >> >> > > > >> > >> >> > > > >> > Any more insight or corrections to pattern usage would be >> >> grateful... >> >> > > > >> > >> >> > > > >> > Thanks. >> >> > > > >> > >> >> > > > >> > -----Original Message----- >> >> > > > >> > From: robert lazarski [mailto:[EMAIL PROTECTED] >> >> > > > >> > Sent: Friday, September 15, 2006 8:49 AM >> >> > > > >> > To: axis-dev@ws.apache.org >> >> > > > >> > Subject: Re: Improvements to Service life cycle in >> handling >> >> > > > >> > >> >> > > > >> > That makes sense to me. I've been using startUp() and it >> >> doesn't >> >> > > > >> really fit with the other methods of the interface in its >> >> current >> >> > > > >> form. +1 for 1.1 since its interface changes and it'd be >> >> better to do >> >> > > > >> it now. >> >> > > > >> > >> >> > > > >> > One question: Currently you need this in services.xml >> to get >> >> > > > >> startUp() to invoke: >> >> > > > >> > >> >> > > > >> > <parameter name="load-on-startup" >> >> locked="false">true</parameter> >> >> > > > >> > >> >> > > > >> > I plan on testing this when its ready ... since the spring >> >> tutorial >> >> > > > >> depends on it ... so I thought I'd ask if the services.xml >> >> param will >> >> > > > >> remain the same. >> >> > > > >> > >> >> > > > >> > Thanks, >> >> > > > >> > Robert >> >> > > > >> > >> >> > > > >> > On 9/14/06, Deepal Jayasinghe <[EMAIL PROTECTED]> >> wrote: >> >> > > > >> > >> >> > > > >> >> Hi All; >> >> > > > >> >> >> >> > > > >> >> Currently we have an interface called Service and which >> >> has few >> >> > > > >> >> methods that are used to manage session (or else user can >> >> add those >> >> > > > >> >> method into service impl class w.o implementing the >> >> interface). And >> >> > > > >> >> that interface has the following methods ; >> >> > > > >> >> >> >> > > > >> >> - startUp >> >> > > > >> >> - init >> >> > > > >> >> - setOperationContext >> >> > > > >> >> - destroy >> >> > > > >> >> >> >> > > > >> >> Three of them are for managing service life cycle ; >> >> > > > >> >> - init - will be called when the session start >> >> > > > >> >> - setOperationContext - immediately before calling actual >> >> java method >> >> > > > >> >> - destroy - will be call when the session finishes >> >> > > > >> >> >> >> > > > >> >> Remember all those method work if and only if you use >> >> Axis2 default >> >> > > > >> >> message receiver or you code gen. >> >> > > > >> >> >> >> > > > >> >> The method startUp is not session related method , which >> >> is useful >> >> > > > >> >> when you want to initialize database connections , create >> >> thread etc >> >> > > > >> >> ... at the time when you deploy the service. In the mean >> >> time >> >> > > > >> >> interface name Service is bit confusing to me AFAIK it >> >> should be >> >> > > > >> >> ServiceLifeCycle. And having method like startUp in that >> >> interface >> >> > > > >> confuses the users. >> >> > > > >> >> >> >> > > > >> >> So how about the following changes ; >> >> > > > >> >> - Rename Service interface into ServiceLifeCycle >> >> > > > >> >> - Then remove startUp method from that interface. >> >> > > > >> >> >> >> > > > >> >> There should be a some other interface (like Module >> >> interface) and >> >> > > > >> >> which should be optional as well , to have the method >> >> startUp. If >> >> > > > >> >> someone want to open DB connection or anything at the >> >> time of service >> >> > > > >> >> deploying , then he need to implement that interface (and >> >> for me >> >> > > > >> which >> >> > > > >> >> is identical to Module interface). So with this change >> >> service >> >> > > > >> element >> >> > > > >> >> inside the services.xml will be change to following >> >> > > > >> >> >> >> > > > >> >> <service name="foo" *class="implementation class of the >> >> interface "*> >> >> > > > >> >> <parameter name="ServiceClass">ServiceClass</parameter> >> >> > > > >> >> </service> >> >> > > > >> >> >> >> > > > >> >> Here the class attribute is optional , so if someone want >> >> to have >> >> > > > >> >> loadonStartup feature then he need to implement the >> >> Service interface >> >> > > > >> >> (new one) and put the impl name as the class attribute. >> >> This is very >> >> > > > >> >> useful if your service implementation class is not java >> >> (if you are >> >> > > > >> >> writing a groovy serice). >> >> > > > >> >> >> >> > > > >> >> So new Service interface will be look like follows; >> >> public interface >> >> > > > >> >> Service{ //will be called when service is deployed public >> >> void >> >> > > > >> >> startUp(ConfigurationContext configctx, AxisService >> >> service); //will >> >> > > > >> >> be called when Axis2 server showdown or when service >> >> removed from the >> >> > > > >> >> system public void shutDown(ConfigurationContext >> configctx, >> >> > > > >> >> AxisService service); } >> >> > > > >> >> >> >> > > > >> >> And ServiceLifeCycle interface will look like below; >> >> > > > >> >> >> >> > > > >> >> public interface ServiceLifeCycle { >> >> > > > >> >> public void init(ServiceContext sc); >> >> > > > >> >> public void setOperationContext(OperationContext >> >> operationContext); >> >> > > > >> >> void destroy(ServiceContext sc); } >> >> > > > >> >> >> >> > > > >> >> >> >> > > > >> >> I am +1 on doing this for Axis2 1.1 :) >> >> > > > >> >> >> >> > > > >> >> Suggestions ........ >> >> > > > >> >> >> >> > > > >> >> Thanks >> >> > > > >> >> Deepal >> >> > > > >> >> >> >> > > > >> >> >> >> > > > >> >> >> >> > > > >> >> >> >> --------------------------------------------------------------------- >> >> > > > >> >> To unsubscribe, e-mail: >> [EMAIL PROTECTED] >> >> > > > >> >> For additional commands, e-mail: >> [EMAIL PROTECTED] >> >> > > > >> >> >> >> > > > >> >> >> >> > > > >> >> >> >> > > > >> > >> >> > > > >> > >> >> --------------------------------------------------------------------- >> >> > > > >> > To unsubscribe, e-mail: [EMAIL PROTECTED] >> >> > > > >> > For additional commands, e-mail: >> [EMAIL PROTECTED] >> >> > > > >> > >> >> > > > >> > >> >> > > > >> > >> >> --------------------------------------------------------------------- >> >> > > > >> > To unsubscribe, e-mail: [EMAIL PROTECTED] >> >> > > > >> > For additional commands, e-mail: >> [EMAIL PROTECTED] >> >> > > > >> > >> >> > > > >> >> >> > > > >> >> >> > > > >> >> >> --------------------------------------------------------------------- >> >> > > > >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> >> > > > >> For additional commands, e-mail: [EMAIL PROTECTED] >> >> > > > >> >> >> > > > >> >> >> > > > > >> >> > > > > >> >> > > > >> >> > > > >> >> > > > >> >> --------------------------------------------------------------------- >> >> > > > To unsubscribe, e-mail: [EMAIL PROTECTED] >> >> > > > For additional commands, e-mail: [EMAIL PROTECTED] >> >> > > > >> >> > > >> >> > > >> >> > > >> >> --------------------------------------------------------------------- >> >> > > To unsubscribe, e-mail: [EMAIL PROTECTED] >> >> > > For additional commands, e-mail: [EMAIL PROTECTED] >> >> > > >> >> > > >> >> > >> >> > >> >> >> >> >> >> --------------------------------------------------------------------- >> >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> >> For additional commands, e-mail: [EMAIL PROTECTED] >> >> >> >> >> > >> > >> >> -- >> Thanks, >> Deepal >> ................................................................ >> ~Future is Open~ >> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] >> >> > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]