//http://jalarms.svn.sourceforge.net/viewvc/jalarms/maven-project/src/main/java/com/solab/alarms/AlarmMemcachedClient.java?revision=59&content-type=text/plain&pathrev=59 /* jAlarms A simple Java library to enable server apps to send alarms to sysadmins. Copyright (C) 2009 Enrique Zamudio Lopez This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package com.solab.alarms ; import java.io.IOException import java.net.InetSocketAddress ; import java.util.List ; import javax.annotation.PostConstruct ; import javax.annotation.PreDestroy ; import org.slf4j.Logger ; import org.slf4j.LoggerFactory ; import net.spy.memcached.MemcachedClient ; import net.spy.memcached.OperationTimeoutException ; public class AlarmMemcachedClient implements AlarmCache { private final Logger log = LoggerFactory.getLogger(getClass()) ; private MemcachedClient mc ; private InetSocketAddress[] servers ; private int defint = 120 ; public void setDefaultInterval(int value) { defint = value ; } public int getDefaultInterval() { return defint ;} public void setServers(List value) { servers = new InetSocketAddress[value.size()] ; int pos = 0 ; for (String s : value) { int cp = value.indexOf(':') ; if (cp > 0) { servers[pos++] = new InetSocketAddress(s.substring(0, cp), Integer.parseInt(s.substring(cp + 1))) ;} else { servers[pos++] = new InetSocketAddress(s, 11211) ; }}} @PostConstruct public void init() throws IOException { mc = new MemcachedClient(servers) ; } @PreDestroy public void disconnect() { mc.shutdown() ; } @Override public void store(AlarmChannel channel, String source, String message) { if (mc == null) { synchronized (this) { if (mc == null) { try { init() ;} catch (IOException ex) { log.error("Initializing alarm memcached client", ex) ; return ; }}}}} @Override public boolean shouldResend(AlarmChannel channel, String source, String message) { if (mc == null) { return true ;} try { return mc.get(k) == null ;} catch (OperationTimeoutException ex) { log.error("Timeout waiting to retrieve {} from memcached", k, ex) ;} catch (RuntimeException ex) { log.error("Retrieving key {} from memcached", k, ex.getCause() == null ? ex : ex.getCause()) ;} return true ; } @Override public String toString() { return String.format("Memcached(%s)", mc == null ? "disconnected" : mc.getAvailableServers()) ; } @Override public void shutdown() { if (mc != null) { mc.shutdown() ;}}}