Thanks Cyrrile,

  I got pulled into another project and am just getting back to this.

Dean

-----Original Message-----
From: Cyrille Le Clerc [mailto:[email protected]] 
Sent: Sunday, November 08, 2009 10:21 AM
To: [email protected]
Subject: Re: [cas-user] CAS + EHCache Ticket Registry

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