Hi Nishant,

where did you read that <distributable> will *enforce* serializability?
AFAIK <distributable> "only" means that your sessions can be distributed to different tomcat nodes (i.e. a cluster). It doesn't enforce anything, you have to make sure that your session attributes are serializable by yourself.

I've done this for my testing environment with a SessionListener:

public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener {

private ObjectOutputStream stream = new ObjectOutputStream(new OutputStream() {
            public void write(int b) {}
          });

public void attributeAdded(HttpSessionBindingEvent evt) {

    if (LOCAL_DEBUG) {
      // try to serialize attribute
      Object o = evt.getValue();
      synchronized (stream) {
        try {
          stream.writeObject(o);
        } catch (IOException e) {
System.err.println(evt.getName() + " is not serializable: " + e.getMessage());
          e.printStackTrace();
        }
      }
    }
  }

...
}

I disable LOCAL_DEBUG in the production environment, because trying to serialize every attribute is probably to expensive under heavy load.


@Lintang:

That wouldn't help any. If you put your attributes (which are not serializable) into a HashMap (which CAN (!) be serializable) the resulting object (map + attribute) still wouldn't be serializable. Serializable is more than just implementing the java.io.Serializable interface.


greetings,

Christoph




Lintang JP wrote:
hi Nishant,
You might want to put all your session variable inside HashMap or other datatypes that implements Serializable, rather than put it just in a single variable. Refer to the javadocs, what are those Serializable data types are. Or maybe you can build your own class with something like this :
 public class StoredSessionValue implements Serializable {
 // your session variable goes here
  // your setter and getter method for those variables goes here
}

You did right on your <distributable/> tags.
On 8/17/05, Nishant Deshpande <[EMAIL PROTECTED]> wrote:
Hoping for some help from the tomcat experts on this list.

I want to ensure all objects stored in sessions are serializable.

I read that I can put the <distributable/> tag in my web.xml file to
'enforce' this.

But I don't see any enforcing happening. I assumed it would throw
exceptions at runtime when I did 'setAttribute("xxx",
SomeNonSerializableObject)'.

I have put 'distributable' in

web.xml: <web-app> ... <distributable/> ... </web-app>

I also have the following in server.xml:

<DefaultContext reloadable="true" allowLinking="true">

<Loader className="org.apache.catalina.loader.DevLoader"
reloadable="true" debug="1"/>
<Manager className="org.apache.catalina.session.PersistentManager"
pathname="/cv/data/tmp" debug="5" saveOnRestart="true"
distributable="true">
<Store className="org.apache.catalina.session.FileStore"
directory="/cv/data/tmp"
debug="5"/>
</Manager>

</DefaultContext>


Am I missing something? How is the serializability enforced?

Also another question: the serialization does not happen in the
directory i specify for Store above, rather it happens in the
$CATALINA_HOME/work/Catalina/* directories. Any ideas about this one?

Thanks,

Nishant

---------------------------------------------------------------------
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]

Reply via email to