diff --git a/xm-core/src/main/java/com/xm/core/ctrl/XmProjectStateController.java b/xm-core/src/main/java/com/xm/core/ctrl/XmProjectStateController.java index 06754302..bc5a81cc 100644 --- a/xm-core/src/main/java/com/xm/core/ctrl/XmProjectStateController.java +++ b/xm-core/src/main/java/com/xm/core/ctrl/XmProjectStateController.java @@ -139,11 +139,10 @@ public class XmProjectStateController { Map m = new HashMap<>(); RequestUtils.transformArray(xmProductState, "ids"); PageUtils.startPage(xmProductState); - List> xmProjectStateList = projectCacheService.getPortalProjectStates(); //列出XmProductState列表 + List> xmProjectStateList =null; //列出XmProductState列表 if(xmProjectStateList==null){ xmProjectStateList=xmProjectStateService.selectPortalProjectStates(xmProductState); - projectCacheService.putPortalProjectStates(xmProjectStateList); - } + } PageUtils.responePage(m, xmProjectStateList); m.put("data",xmProjectStateList); Tips tips=new Tips("查询成功"); diff --git a/xm-core/src/main/java/com/xm/core/service/cache/XmProductCacheService.java b/xm-core/src/main/java/com/xm/core/service/cache/XmProductCacheService.java index 38e0f13a..59d88d6c 100644 --- a/xm-core/src/main/java/com/xm/core/service/cache/XmProductCacheService.java +++ b/xm-core/src/main/java/com/xm/core/service/cache/XmProductCacheService.java @@ -1,13 +1,14 @@ package com.xm.core.service.cache; +import com.mdp.mq.sp.Publish; import com.xm.core.entity.XmProduct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.Calendar; -import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; @Service @@ -15,6 +16,12 @@ public class XmProductCacheService { @Autowired RedisTemplate redisTemplate; + + Map cache=new ConcurrentHashMap<>(); + + @Autowired + Publish publish; + String currDateKey=""; public String getKey(){ Calendar currCal=Calendar.getInstance(); @@ -30,34 +37,37 @@ public class XmProductCacheService { String getCacheKey() { return "xm_product"; } - public void putProduct(String productId,XmProduct Product){ + public void putProduct(String productId,XmProduct product){ String key=this.getKey(); String hashKey=productId; - redisTemplate.opsForHash().put(key, hashKey, Product); + redisTemplate.opsForHash().put(key, hashKey, product); + cache.put(productId,product); + publish.push("XM_PRODUCT_CACHE",productId); } public XmProduct getProduct(String productId){ - String key=this.getKey(); - String hashKey=productId; - return (XmProduct) redisTemplate.opsForHash().get(key, hashKey); + XmProduct product=cache.get(productId); + if(product==null){ + String key=this.getKey(); + String hashKey=productId; + product= (XmProduct) redisTemplate.opsForHash().get(key, hashKey); + cache.put(productId,product); + return product; + }else { + return product; + } } public void clear(String productId){ String key=this.getKey(); + cache.remove(productId); redisTemplate.opsForHash().delete(key,productId); - } - public void putPortalProductStates(List> products){ - String key=this.getKey(); - String hashKey="portal"; - redisTemplate.opsForHash().put(key, hashKey, products); + publish.push("XM_PRODUCT_CACHE",productId); } - public List> getPortalProductStates(){ - String key=this.getKey(); - String hashKey="portal"; - return (List>) redisTemplate.opsForHash().get(key, hashKey); - + public void clearLocalCache(String productId) { + this.cache.remove(productId); } } diff --git a/xm-core/src/main/java/com/xm/core/service/cache/XmProjectCacheService.java b/xm-core/src/main/java/com/xm/core/service/cache/XmProjectCacheService.java index 6fdf9e5d..3f5a1af2 100644 --- a/xm-core/src/main/java/com/xm/core/service/cache/XmProjectCacheService.java +++ b/xm-core/src/main/java/com/xm/core/service/cache/XmProjectCacheService.java @@ -1,13 +1,14 @@ package com.xm.core.service.cache; +import com.mdp.mq.sp.Publish; import com.xm.core.entity.XmProject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.Calendar; -import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; @Service @@ -16,6 +17,12 @@ public class XmProjectCacheService { @Autowired RedisTemplate redisTemplate; String currDateKey=""; + + Map cache=new ConcurrentHashMap<>(); + + @Autowired + Publish publish; + public String getKey(){ Calendar currCal=Calendar.getInstance(); String dateKey=currCal.get(Calendar.YEAR)+"-"+currCal.get(Calendar.DAY_OF_YEAR); @@ -30,29 +37,35 @@ public class XmProjectCacheService { String getCacheKey() { return "xm_project"; } - public void putProject(String projectId,XmProject Project){ + public void putProject(String projectId,XmProject project){ String key=this.getKey(); String hashKey=projectId; - redisTemplate.opsForHash().put(key, hashKey, Project); + redisTemplate.opsForHash().put(key, hashKey, project); + this.cache.put(projectId,project); } public XmProject getProject(String projectId){ - String key=this.getKey(); - String hashKey=projectId; - return (XmProject) redisTemplate.opsForHash().get(key, hashKey); + XmProject project=cache.get(projectId); + if(project==null) { + String key = this.getKey(); + String hashKey = projectId; + project= (XmProject) redisTemplate.opsForHash().get(key, hashKey); + cache.put(projectId,project); + return project; + }else{ + return project; + } } - - public void putPortalProjectStates(List> projects){ + public void clear(String projectId){ String key=this.getKey(); - String hashKey="portal"; - redisTemplate.opsForHash().put(key, hashKey, projects); - } + cache.remove(projectId); + redisTemplate.opsForHash().delete(key,projectId); - public List> getPortalProjectStates(){ - String key=this.getKey(); - String hashKey="portal"; - return (List>) redisTemplate.opsForHash().get(key, hashKey); + publish.push("XM_PROJECT_CACHE",projectId); + } + public void clearLocalCache(String projectId) { + this.cache.remove(projectId); } } diff --git a/xm-core/src/main/java/com/xm/core/service/cache/sub/CacheMessageListener.java b/xm-core/src/main/java/com/xm/core/service/cache/sub/CacheMessageListener.java new file mode 100644 index 00000000..97d5107e --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/service/cache/sub/CacheMessageListener.java @@ -0,0 +1,70 @@ +package com.xm.core.service.cache.sub; + +import com.xm.core.service.cache.XmProductCacheService; +import com.xm.core.service.cache.XmProjectCacheService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.connection.Message; +import org.springframework.data.redis.connection.MessageListener; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +@Service +public class CacheMessageListener implements MessageListener { + + + RedisSerializer stringSerializer=RedisSerializer.string(); + + @Autowired + StringRedisTemplate redisTemplate; + + @Autowired + XmProductCacheService xmProductCacheService; + + + @Autowired + XmProjectCacheService xmProjectCacheService; + + + private static final Logger logger = LoggerFactory.getLogger(CacheMessageListener.class); + + /*定时心跳*/ + @Scheduled(cron = "0/10 * * * * *") + public void timer() { + redisTemplate.convertAndSend("XM_PRODUCT_CACHE", ""); + redisTemplate.opsForValue().set("headbea", "1"); + } + + + @Override + public void onMessage(Message message, byte[] pattern) { + try { + // TODO Auto-generated method stub + String msg=message.toString(); + logger.debug("消息下行开始----》"+msg); + //logger.debug(msg); + //心跳包 + if("".equals(msg)||"\"\"".equals(msg)) { + return; + } + String channelName=stringSerializer.deserialize(pattern); + if(channelName.startsWith("XM_PRODUCT")) { + xmProductCacheService.clearLocalCache(msg); + }else if(channelName.startsWith("XM_PROJECT")) { + xmProjectCacheService.clearLocalCache(msg); + }else if(channelName.startsWith("XM_GROUP")) { + + } + } catch (Exception e) { + logger.error("",e); + }finally { + logger.debug("消息下行结束!!!!!!!!"); + } + + } + + +} diff --git a/xm-core/src/main/java/com/xm/core/service/cache/sub/CahceChannelConfig.java b/xm-core/src/main/java/com/xm/core/service/cache/sub/CahceChannelConfig.java new file mode 100644 index 00000000..f977b959 --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/service/cache/sub/CahceChannelConfig.java @@ -0,0 +1,65 @@ +package com.xm.core.service.cache.sub; + +import com.mdp.mq.sp.ChannelConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.MessageListener; +import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.data.redis.listener.Topic; + +@Configuration +public class CahceChannelConfig implements ChannelConfig { + + RedisMessageListenerContainer container; + + @Autowired + CacheMessageListener messageListener; + + @Override + public RedisMessageListenerContainer container(RedisMessageListenerContainer container) { + // TODO Auto-generated method stub + this.container=container; + + container.addMessageListener(messageListener, topic("XM_PRODUCT_CACHE")); + container.addMessageListener(messageListener, topic( "XM_PROJECT_CACHE")); + container.addMessageListener(messageListener, topic( "XM_GROUP_CACHE")); + return container; + } + + public void setMessageListener(MessageListener messageListener,Topic topic){ + container.addMessageListener(messageListener, topic); + } + + + Topic topic(String channelName){ + ChannelTopic topic=new ChannelTopic(channelName); + return topic; + + } + + @Override + public void removeMessageListener(MessageListener messageListener, Topic topic) { + container.removeMessageListener(messageListener,topic); + + } + + @Override + public void removeMessageListener(MessageListener messageListener) { + container.removeMessageListener(messageListener); + + } + + @Override + public void removeMessageListener(String listenerName,Topic topic) { + + container.removeMessageListener(messageListener,topic); + } + + @Override + public void addMessageListener(String listenerName, Topic topic) { + container.addMessageListener(messageListener,topic); + } + + +}