001
014
015 package com.liferay.portal.cache.cluster.clusterlink.messaging;
016
017 import com.liferay.portal.cache.ehcache.EhcachePortalCacheManager;
018 import com.liferay.portal.dao.orm.hibernate.region.LiferayEhcacheRegionFactory;
019 import com.liferay.portal.dao.orm.hibernate.region.SingletonLiferayEhcacheRegionFactory;
020 import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
021 import com.liferay.portal.kernel.cache.cluster.PortalCacheClusterEvent;
022 import com.liferay.portal.kernel.cache.cluster.PortalCacheClusterEventType;
023 import com.liferay.portal.kernel.log.Log;
024 import com.liferay.portal.kernel.log.LogFactoryUtil;
025 import com.liferay.portal.kernel.messaging.BaseMessageListener;
026 import com.liferay.portal.kernel.messaging.Message;
027
028 import java.io.Serializable;
029
030 import net.sf.ehcache.CacheManager;
031 import net.sf.ehcache.Ehcache;
032 import net.sf.ehcache.Element;
033
034
037 public class ClusterLinkPortalCacheClusterListener extends BaseMessageListener {
038
039 public ClusterLinkPortalCacheClusterListener() {
040 LiferayEhcacheRegionFactory liferayEhcacheRegionFactory =
041 SingletonLiferayEhcacheRegionFactory.getInstance();
042
043 _hibernateCacheManager = liferayEhcacheRegionFactory.getCacheManager();
044
045 EhcachePortalCacheManager ehcachePortalCacheManager =
046 (EhcachePortalCacheManager)PortalBeanLocatorUtil.locate(
047 _MULTI_VM_PORTAL_CACHE_MANAGER_BEAN_NAME);
048
049 _portalCacheManager = ehcachePortalCacheManager.getEhcacheManager();
050 }
051
052 @Override
053 protected void doReceive(Message message) throws Exception {
054 PortalCacheClusterEvent portalCacheClusterEvent =
055 (PortalCacheClusterEvent)message.getPayload();
056
057 if (portalCacheClusterEvent == null) {
058 if (_log.isWarnEnabled()) {
059 _log.warn("Payload is null");
060 }
061
062 return;
063 }
064
065 String cacheName = portalCacheClusterEvent.getCacheName();
066
067 Ehcache ehcache = _portalCacheManager.getEhcache(cacheName);
068
069 if (ehcache == null) {
070 ehcache = _hibernateCacheManager.getEhcache(cacheName);
071 }
072
073 if (ehcache != null) {
074 PortalCacheClusterEventType portalCacheClusterEventType =
075 portalCacheClusterEvent.getEventType();
076
077 if (portalCacheClusterEventType.equals(
078 PortalCacheClusterEventType.REMOVE_ALL)) {
079
080 ehcache.removeAll(true);
081 }
082 else if (portalCacheClusterEventType.equals(
083 PortalCacheClusterEventType.PUT) ||
084 portalCacheClusterEventType.equals(
085 PortalCacheClusterEventType.UPDATE)) {
086
087 Serializable elementKey =
088 portalCacheClusterEvent.getElementKey();
089 Serializable elementValue =
090 portalCacheClusterEvent.getElementValue();
091
092 if (elementValue == null) {
093 ehcache.remove(
094 portalCacheClusterEvent.getElementKey(), true);
095 }
096 else {
097 Element oldElement = ehcache.get(elementKey);
098 Element newElement = new Element(elementKey, elementValue);
099
100 if (oldElement != null) {
101 ehcache.replace(newElement);
102 }
103 else {
104 ehcache.put(newElement);
105 }
106 }
107 }
108 else {
109 ehcache.remove(portalCacheClusterEvent.getElementKey(), true);
110 }
111 }
112 }
113
114 private static final String _MULTI_VM_PORTAL_CACHE_MANAGER_BEAN_NAME =
115 "com.liferay.portal.kernel.cache.MultiVMPortalCacheManager";
116
117 private static Log _log = LogFactoryUtil.getLog(
118 ClusterLinkPortalCacheClusterListener.class);
119
120 private CacheManager _hibernateCacheManager;
121 private CacheManager _portalCacheManager;
122
123 }