Any chance you'd be interested in putting this in a JIRA issue? ;-)

Cheers,
Scott


On Sun, Nov 8, 2009 at 1:21 PM, Cyrille Le Clerc <[email protected]> wrote:

> Hello Dean,
>
> Sorry for the delay. Here is the EhCacheTicketRegistry.java with a
> JA-SIG Licence. I send it both as an attachment and doing a copy-paste
> in the email body in case the mailing mist would reject attachments.
>
> Hope this helps,
>
> Cyrille
>
>
> /*
>  * Copyright 2007 The JA-SIG Collaborative. All rights reserved. See
> license
>  * distributed with this file and available online at
>  * http://www.uportal.org/license.html
>  */
>  package org.jasig.cas.ticket.registry.ehcache;
>
> import java.util.Collection;
>
> import net.sf.ehcache.Cache;
> import net.sf.ehcache.Element;
>
> import org.inspektr.common.ioc.annotation.NotNull;
> import org.jasig.cas.ticket.ServiceTicket;
> import org.jasig.cas.ticket.Ticket;
> import org.jasig.cas.ticket.TicketGrantingTicket;
> import org.jasig.cas.ticket.registry.AbstractDistributedTicketRegistry;
> import org.jasig.cas.ticket.registry.TicketRegistry;
> import org.springframework.core.style.ToStringCreator;
>
> /**
>  * <p>
>  * <a href="http://ehcache.sourceforge.net/";>EHCache</a> based
> distributed ticket registry.
>  * </p>
>  * <p>
>  * Use distinct caches for ticket granting tickets (TGT) and service
> tickets (ST) for:
>  * <ul>
>  * <li>Tuning : use cache level time to live with different values for
> TGT an ST.</li>
>  * <li>Tuning : have different replication strategies for TGT and ST
> (ST should be synchronized more quickly).</li>
>  * <li>Monitoring : follow separately the number of TGT and ST.</li>
>  * <ul>
>  * </p>
>  *
>  * @author <a href="mailto:[email protected]";>Cyrille Le
> Clerc</a>
>  */
> public class EhCacheTicketRegistry extends
> AbstractDistributedTicketRegistry implements TicketRegistry {
>
>    @NotNull
>    protected Cache serviceTicketsCache;
>
>    @NotNull
>    protected Cache ticketGrantingTicketsCache;
>
>    @Override
>    public void addTicket(Ticket ticket) {
>        Element element = new Element(ticket.getId(), ticket);
>        if (ticket instanceof ServiceTicket) {
>            serviceTicketsCache.put(element);
>        } else if (ticket instanceof TicketGrantingTicket) {
>            ticketGrantingTicketsCache.put(element);
>        } else {
>            throw new IllegalArgumentException("Invalid ticket type " +
> ticket);
>        }
>    }
>
>    @Override
>    public boolean deleteTicket(String ticketId) {
>        boolean result;
>        if (ticketId.startsWith(TicketGrantingTicket.PREFIX)) {
>            result = ticketGrantingTicketsCache.remove(ticketId);
>        } else if (ticketId.startsWith(ServiceTicket.PREFIX)) {
>            result = serviceTicketsCache.remove(ticketId);
>        } else {
>            result = false;
>            if (log.isInfoEnabled()) {
>                log.info("Unsupported ticket prefix for ticketId '" +
> ticketId + "', return " + result);
>            }
>        }
>        return result;
>    }
>
>    @Override
>    public Ticket getTicket(String ticketId) {
>        Element element;
>        if (ticketId.startsWith(TicketGrantingTicket.PREFIX)) {
>            element = ticketGrantingTicketsCache.get(ticketId);
>        } else if (ticketId.startsWith(ServiceTicket.PREFIX)) {
>            element = serviceTicketsCache.get(ticketId);
>        } else {
>            element = null;
>            if (log.isInfoEnabled()) {
>                log.info("Unsupported ticket prefix for ticketId '" +
> ticketId + "', return " + element);
>            }
>        }
>        return element == null ? null :
> getProxiedTicketInstance((Ticket)element.getValue());
>    }
>
>    @Override
>    public Collection<Ticket> getTickets() {
>        throw new UnsupportedOperationException("GetTickets not
> supported.");
>    }
>
>    public void setServiceTicketsCache(Cache serviceTicketsCache) {
>        this.serviceTicketsCache = serviceTicketsCache;
>    }
>
>    public void setTicketGrantingTicketsCache(Cache
> ticketGrantingTicketsCache) {
>        this.ticketGrantingTicketsCache = ticketGrantingTicketsCache;
>    }
>
>    @Override
>    public String toString() {
>        return new
> ToStringCreator(this).append("ticketGrantingTicketsCache",
> this.ticketGrantingTicketsCache)
>            .append("serviceTicketsCache",
> this.serviceTicketsCache).toString();
>    }
>
>    @Override
>    protected void updateTicket(Ticket ticket) {
>        addTicket(ticket);
>     }
> }
>
> On Tue, Nov 3, 2009 at 9:52 PM, Dean Heisey <[email protected]>
> wrote:
> >
> > Hi Cyrille,
> >
> >   Thanks for sharing your experience.  If you can share the code that
> would be great, if not.  I will implement my own.
> >
> > Dean
> >
> > -----Original Message-----
> > From: Cyrille Le Clerc [mailto:[email protected]]
> > Sent: Tuesday, November 03, 2009 12:56 AM
> > To: [email protected]
> > Subject: Re: [cas-user] CAS + EHCache Ticket Registry
> >
> >  Hello Dean,
> >
> >  We happily use a Distributed EHCache Ticket Registry on a high
> > volume french portal that reaches a max of 40 ticket granting tickets
> > and 80 service tickets created per second. That is about 120 tickets
> > replicated per second.
> >
> >  This EH Cache Ticket Registry has been used for more than six month
> > without causing major issues and the traffic is increasing. We are
> > very happy with EH Cache and RMI because they almost do not require
> > configuration and tuning. We would have been interested in Memcached
> > but we didn't have skills to provide 7x24 support on this technology
> > we don't use in-house.
> >
> > For this, we have a cluster of three nodes :
> > * HP ProLiant G5 dual quad cores 54xx Intel Xeon.
> > * Red Hat Enterprise Linux 4 / 2.6.9-78.0.8.ELsmp 32 bits
> > * Sun jdk 1.6.0.13
> > * Tomcat 6.0.18
> > * CAS 3.3.1
> > * EHCache 1.6.1 with :
> >  ** Auto discovery of the peers
> >  ** RMI Synchronous Replicator for service tickets :
> >      service tickets validation doesn't benefit of server affinity
> > and can occur few ms after creation
> >  ** RMI Asynchronous Replicator for the ticket granting tickets :
> >      ticket granting ticket benefit of server affinity because they
> > are always accessed via the end user browser
> >      (no server-to-server exchanges)
> >
> >  The CPU consumed by this application remain quite low and we have
> > deployed other high traffic web applications on these physical
> > servers.
> >
> >  The biggest problem we faced was the saturation of the Network
> > Interface Cards because we didn't know but we used and 100 Mbits/s
> > switch (pretty surprising in 2009 ;-) ). The servers froze on RMI
> > socket establishment calls. Once we upgraded to a Giga Bits Ethernet
> > switch, everything came back to normal.
> >
> >  Another point you may worry about is long
> > stop-the-world-garbage-collection phases on peer servers if you set
> > aggressive RMI read timeouts.
> >  We didn't feel the need to define RMI timeouts on our CAS cluster
> > but we use it on another application that also heavily rely on
> > Distributed Sync RMI EHCache and face sparse RMI timeouts that seem to
> > be caused by long stop-the-world-garbage collections on peer servers.
> >
> >  I am no longer member of the SSO team but I am sure we can give you
> > the one hundred lines of code of the EHCacheTicketRegistry.
> >
> >  Hope this helps,
> >
> >  Cyrille
> >
> > --
> > Cyrille Le Clerc
> > [email protected] [email protected]
> > http://blog.xebia.fr
> >
> > On Thu, Oct 29, 2009 at 10:29 PM, Scott Battaglia
> > <[email protected]> wrote:
> > >
> > > On Thu, Oct 29, 2009 at 5:11 PM, Dean Heisey <
> [email protected]> wrote:
> > >>
> > >> After reading through the old postings and the CASUM I have not found
> any
> > >> mention of an EHCache backed ticket registry.  I have two questions:
> > >>
> > >> 1) has anyone implemented one yet?
> > >
> > > When we first tried it, it didn't scale very well.  We haven't tried
> with newer versions.
> > >
> > >>
> > >> 2) the Users Manual mentions terracotta and the default ticket
> registry.
> > >> Does that actually work and has anyone implemented it?
> > >
> > > There have a been a few instances where its been deployed.  We include
> a sample config in SVN.
> > >
> > > Cheers,
> > > Scott
> > >
> > >>
> > >> Dean
> > >> --
> > >> View this message in context:
> http://n4.nabble.com/CAS-EHCache-Ticket-Registry-tp278045p278045.html
> > >> Sent from the CAS Users mailing list archive at Nabble.com.
> > >>
> > >> --
> > >> You are currently subscribed to [email protected] as:
> [email protected]
> > >> To unsubscribe, change settings or access archives, see
> http://www.ja-sig.org/wiki/display/JSG/cas-user
> > >
> > > --
> > > You are currently subscribed to [email protected] as:
> [email protected]
> > > To unsubscribe, change settings or access archives, see
> http://www.ja-sig.org/wiki/display/JSG/cas-user
> >
> > --
> > You are currently subscribed to [email protected] as:
> [email protected]
> > To unsubscribe, change settings or access archives, see
> http://www.ja-sig.org/wiki/display/JSG/cas-user
> >
> > --
> > You are currently subscribed to [email protected] as:
> [email protected]
> > To unsubscribe, change settings or access archives, see
> http://www.ja-sig.org/wiki/display/JSG/cas-user
> >
>
> --
> You are currently subscribed to [email protected] as:
> [email protected]
> To unsubscribe, change settings or access archives, see
> http://www.ja-sig.org/wiki/display/JSG/cas-user
>

-- 
You are currently subscribed to [email protected] as: 
[email protected]
To unsubscribe, change settings or access archives, see 
http://www.ja-sig.org/wiki/display/JSG/cas-user

Reply via email to