I didn't mean to be so matter of fact. A session bean is surely not the only way to fa�ade enterprise resources, such as a security service. Here�s where I thought the design would not work.
When the client published a message to the JMS Queue, the EJB container would automatically pull a MDB from the pool to service the request. Since MDB�s are anonymous, there�s no reference from the client to the MDB. For the MDB to know which session bean to perform a callback on, it would probably need to have a remote reference or handle to actually perform the callback. I don�t think serializing a remote reference or handle through a JMS Queue, on to a MDB, so that it can perform a callback on the session bean, is a good idea. Not to mention the performance issue. Remember, the session bean method is blocking the entire time that this is going on. If the MDB didn�t have a remote reference, I don�t think it would be able to return the login result back synchronously to the client. If there�s a way, it�s no clear to me. Remember, MDB�s are anonymous. There�s not remote reference to them. The container is the one that passes the JMS message to the MDB, not the client or the Queue. These are the problems that I see with the approach. You just don�t see this design used for this type of problem. The mainstream approach is to use a session bean (if you are using EJB). There are very common and accepted patterns for something like this. Even if you weren�t using EJB, you could use an ordinary class to communicate with a DB and get the response. That�s why I mentioned using a proxy. I would hide the fact that it�s a session bean or not by using a business delegate interface and that�s what the Action class would know about. I never import any EJB packages into Struts at all. I hide this using a proxy. Again, just my thoughts. Chuck > > > > Chuck, > > I appreciate your insight here. Thanks. > > In general, I agree with your recommendations of using the standard session > bean front to the facade. Storing the remote reference somewhere in the > session context (perhaps in a User bean) again is the right approach. > > But I still feel that a MBD/JMS queue is not always innapropriate as the > front to the facade. Specifically, I think it makes sense when you need to > queue up requests to a particular resource and manage the resource more > closely than having multiple concurrent session beans attempting to access > it. > > The MBD/JMS approach allows you to have a single thread in the back-end > getting the requests off the queue and managing access to the resource one > at a time. This allows you, for example, to serialize transactions against > a back-end system that for some reason can't participate in more than one > transaction concurrently. > > > FWIW - > Kevin > > > > > > > > Chuck Cavaness <[EMAIL PROTECTED]> on 04/26/2002 08:48:25 AM > > Please respond to "Struts Users Mailing List" > <[EMAIL PROTECTED]> > > To: "Struts Users Mailing List" <[EMAIL PROTECTED]> > cc: > Subject: Re: Action + Session Beans + JMS > > > The Action class isn't the only place to store a remote reference to a > session bean. In fact, it's not a good place. Each user needs to have its > own remote reference due to the restrictions how many threads can access a > single EJBObject. > > In what you describe (locking on a queue), you are in fact, using JMS > really as you would a session bean. You can store the remote reference or a > handle in a proxy object and put that proxy object into the user's > sesson. I like JMS/MDB for many different scenarios, but I don't think it > fits here. > > But obviously everyone has their own approach to architectures. I just > would take a closer look at some other documentation and books to see what > the pros and cons. Pick up one of the EJB books. The fact that you're using > Struts really has nothing to do with this design. You would have the same > issues if you were using any other presentation framework. > > Don't let the fact that you have Action classes throw you. They have > nothing to do with this situtation. > > Chuck > > At 08:15 AM 4/26/2002 -0400, you wrote: > > > > >I disagree - though not completely. I think that the approach Chuck > >recommends is fine - and is likely the most popular choice. > > > >But I think that using a JMS queue or MDB as the front to the facade isn't > >always inapropriate. Especially in this case, because: > > > > - The Action classes are singletons. You can't store a reference to a > >session bean in one because other sessions will be using the same object. > >- A reference to an MDB or JMS queue doesn't have to have session scope. > >Its reference can be stored in the action class and reused. > > > >- Also, you can write to a JMS Queue/MDB and the immediately lock on a > read > >on the same to wait for your response. > >- Multiple sessions can concurrently lock on a read on the queue - each > >waiting for just their own response. > > - Make sure when you lock on it, that you specify a timeout so you don't > >hang. This way you'll be interrupted if you timeout. > > - You can lock on a JMS queue waiting for a particular response - you'll > >need to figure out how to look for a particular reponse on the queue - > look > >at the JMS spec, there are a number of ways to do this. > > > >I think a MDB/JMS queue may be an appropriate front to the facade whenever > >you need to queue up access to a limited resource (such as a specific > >entity bean instance, or some other remote system). An MDB makes it easier > >to ensure that no two session beans are concurrently attempting to lock a > >resource or engage the resource in a transaction. > > > >Both Weblogic and JBoss have good JMS/MDB implementations. I haven't used > >or reviewed other containers' JMS/MDB implementations. > > > >I agree with Chuck on the use of value objects instead of booleans as a > >response. JMS/MDB allow you to write objects into them and also to read > >them back out as responses. > > > >Also, the action class itself cannot be a session bean. The primary > >org.apache.struts.action.Action servlet wouldn't be able to instantiate it > >or store a reference to it correctly - unless you modified how struts > >itself works (you have the source code - go ahead of you want!). > > > > > > > > > > > > > > > > > > > > > > > > > > > >Chuck Cavaness <[EMAIL PROTECTED]> on 04/25/2002 10:08:21 PM > > > >Please respond to "Struts Users Mailing List" > > <[EMAIL PROTECTED]> > > > >To: "Struts Users Mailing List" <[EMAIL PROTECTED]> > >cc: > >Subject: Re: Action + Session Beans + JMS > > > > > >I think I understand your design and I really think you need to stick to a > >synchronous call, instead of the asynchronous JMS call. By its very > nature, > >the client publishing the message will not get an immediate response, > other > >than an acknowledgement for the message itself. > > > >I think you're better off putting the session bean back into the picture. > >You don't have to use entity beans, but a session bean method like > >authenticate() that returns some type of ValueObject. I wouldn't just > >return a boolean. You would be wise to use an object, where you can plan > >for growth. Later, if you needed to return more data, you would need to > >change the method signature. If you go ahead and return a lightweight > >JavaBean-like object now, more data would only mean additional properties > >in the view object. > > > >This is a very common approach to this type of problem. There are plenty > of > >design patterns for this scenario. Check out the Session Facade and > >ValueObject patterns here: > >http://java.sun.com/blueprints/patterns/j2ee_patterns/catalog.html > > > > > >My two cents. > >Chuck > > > > > > > >At 04:57 PM 4/25/2002 -0500, you wrote: > > >Hey all, > > > > > >I have a design question and I'm looking for the best practice in > > >handling it. > > > > > > > > > > > >I am using a customer login for a proof of concept with regards to the > > >architecture, here is the current architecture. > > > > > > > > > > > >I have a logon jsp that invokes a logonAction. This action takes the > > >login information and publishes a message (JMS) to a MDB (message Driven > > >Bean). > > > > > >The MDB calles a Session Bean the authenticates the user. > > > > > > > > > > > >Here is the problem - the action pubs the message and once sent - it > > >does not know when the process is complete. > > > > > > > > > > > >I initially didn't have the JMS layer - So the LogonAction was calling a > > >SessionBean Method - ValidateUser and that method returned a Boolean. > > >The LogonAction would use the returned Boolean to figure out what view > > >to display. > > > > > > > > > > > > > > > > > >I want an elegant way to know when the validation is complete. I was > > >thinking about creating a generic action class that's a session bean. > > >But I'm wondering since the action classes are singletons, am I creating > > >threading problems by doing this. If I was able to make the action a > > >SessionBean - The actionSessionBean could become the manager of the > > >process and determine what view to display. > > > > > > > > > > > >I also thought about sticking something in the session itself - the > > >problem with that is the action will not know when to inspect the > > >session since the action is only able to publish the message - but not > > >listen to it. > > > > > > > > > > > >I hope this is a good enough explanation about what I am trying to > > >accomplish. Any suggestions would be greatly appreciated. > > > > > > > > > > > >DD > > > > > >-- > >To unsubscribe, e-mail: < > >mailto:[EMAIL PROTECTED]> > >For additional commands, e-mail: < > >mailto:[EMAIL PROTECTED]> > > > > > > > > > > > > > > > > > --------------------------------------------------------------------------- > >This e-mail message (including attachments, if any) is intended for the > use > >of the individual or entity to which it is addressed and may contain > >information that is privileged, proprietary , confidential and exempt from > >disclosure. If you are not the intended recipient, you are notified that > >any dissemination, distribution or copying of this communication is > >strictly prohibited. If you have received this communication in error, > >please notify the sender and erase this e-mail message immediately. > > > --------------------------------------------------------------------------- > > > > > >-- > >To unsubscribe, e-mail: < > mailto:[EMAIL PROTECTED]> > >For additional commands, e-mail: < > mailto:[EMAIL PROTECTED]> > > > -- > To unsubscribe, e-mail: < > mailto:[EMAIL PROTECTED]> > For additional commands, e-mail: < > mailto:[EMAIL PROTECTED]> > > > > > > > > --------------------------------------------------------------------------- > This e-mail message (including attachments, if any) is intended for the use > of the individual or entity to which it is addressed and may contain > information that is privileged, proprietary , confidential and exempt from > disclosure. If you are not the intended recipient, you are notified that > any dissemination, distribution or copying of this communication is > strictly prohibited. If you have received this communication in error, > please notify the sender and erase this e-mail message immediately. > --------------------------------------------------------------------------- > > > -- > To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> > For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> > -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

