mac环境下ehcache 广播rmi异常解决和JMX相关


title: mac环境下ehcache 广播rmi异常解决和JMX相关 tags: categories: 工作日志 date: 2016-08-25 18:18:55

分布式环境下对于数据的一致性一直比较麻烦,因此缓存的为使用一定要谨慎。

为防止缓存在各个环境下出现不一致,需要缓存同步机制。由于系统中原先使用了

ehcache,因此顺理成章大家ehcache的集群环境。

对于ehcache的集群环境下的缓存同步大家可以参考EHCache分布式缓存集群环境配置

本系统使用较为简单的rmi广播。

<!--cache组播 rmi  http://www.ehcache.org/documentation/2.8/replication/rmi-replicated-caching-->

<cacheManagerPeerProviderFactory

        class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"

properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,

multicastGroupPort=4446, timeToLive=32"/>

解释如下

By convention:

0 is restricted to the same host
1 is restricted to the same subnet
32 is restricted to the same site
64 is restricted to the same region
128 is restricted to the same continent
255 is unrestricted

The default value in Java is 1, which propagates to the same subnet. Change the timeToLive property to restrict or expand propagation.

对于在mac环境下此配置抛出异常如下

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cacheMBean': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private net.sf.ehcache.CacheManager com.air.tqb.spring.jmx.CacheMBean.cacheManager; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cacheManagerFactory' defined in URL [file:/Users/qixiaobo/work/src/f6-erp/trunk/biz-web/target/biz-web-1.0-SNAPSHOT/WEB-INF/classes/spring-cache.xml]: Invocation of init method failed; nested exception is net.sf.ehcache.CacheException: Can't assign requested address

    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1146)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)

    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)

    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)

    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)

    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:628)

    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)

    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)

    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:410)

    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)

    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)

    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5099)

    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5615)

    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)

    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899)

    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)

    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)

    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1863)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    at java.lang.reflect.Method.invoke(Method.java:601)

    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)

    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:792)

    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:618)

    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:565)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    at java.lang.reflect.Method.invoke(Method.java:601)

    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)

    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:792)

    at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1486)

    at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:96)

    at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1327)

    at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1419)

    at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:847)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    at java.lang.reflect.Method.invoke(Method.java:601)

    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)

    at sun.rmi.transport.Transport$1.run(Transport.java:177)

    at sun.rmi.transport.Transport$1.run(Transport.java:174)

    at java.security.AccessController.doPrivileged(Native Method)

    at sun.rmi.transport.Transport.serviceCall(Transport.java:173)

    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)

    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)

    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

    at java.lang.Thread.run(Thread.java:722)

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private net.sf.ehcache.CacheManager com.air.tqb.spring.jmx.CacheMBean.cacheManager; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cacheManagerFactory' defined in URL [file:/Users/qixiaobo/work/src/f6-erp/trunk/biz-web/target/biz-web-1.0-SNAPSHOT/WEB-INF/classes/spring-cache.xml]: Invocation of init method failed; nested exception is net.sf.ehcache.CacheException: Can't assign requested address

    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:517)

    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)

    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286)

    ... 56 more

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cacheManagerFactory' defined in URL [file:/Users/qixiaobo/work/src/f6-erp/trunk/biz-web/target/biz-web-1.0-SNAPSHOT/WEB-INF/classes/spring-cache.xml]: Invocation of init method failed; nested exception is net.sf.ehcache.CacheException: Can't assign requested address

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1512)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)

    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)

    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)

    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)

    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:912)

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:855)

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:770)

    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:489)

    ... 58 more

Caused by: net.sf.ehcache.CacheException: Can't assign requested address

    at net.sf.ehcache.distribution.MulticastRMICacheManagerPeerProvider.init(MulticastRMICacheManagerPeerProvider.java:99)

    at net.sf.ehcache.CacheManager.doInit(CacheManager.java:479)

    at net.sf.ehcache.CacheManager.init(CacheManager.java:395)

    at net.sf.ehcache.CacheManager.<init>(CacheManager.java:356)

    at org.springframework.cache.ehcache.EhCacheManagerFactoryBean.afterPropertiesSet(EhCacheManagerFactoryBean.java:139)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1571)

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1509)

    ... 68 more

此处由于mac默认返回IPv6格式的地址

需要在启东市增加jvm参数如下

-Djava.net.preferIPv4Stack=true

即可。

对于缓存的监控也是必须的,包括清除缓存(以防数据库中存在错误数据更改后无法立刻生效)

使用jmx监控缓存的数据

/**

 * Created by qixiaobo 16/7/10.

 */

@Component

public class CacheMBean {

 

    @Autowired

    private CacheManager cacheManager;

 

 

    public void clearCache() {

        cacheManager.clearAll();

    }

 

    public String clearCache(String name) {

        Ehcache cache = cacheManager.getEhcache(name);

        if (cache == null) {

            return "name not match!";

        else {

            cache.removeAll();

            return "remove " + name + " success!";

        }

    }

 

    public String getCacheStatistics(String name) {

        Ehcache cache = cacheManager.getEhcache(name);

        if (cache == null) {

            return "name not match!";

        else {

            StatisticsGateway cacheStatistics = cache.getStatistics();

            return MoreObjects.toStringHelper(StatisticsGateway.class.getName())

                    .add("cachePutCount",cacheStatistics.cachePutCount())

                    .add("cachePutAddedCount",cacheStatistics.cachePutAddedCount())

                    .add("cacheEvictedCount", cacheStatistics.cacheEvictedCount())

                    .add("cacheExpiredCount", cacheStatistics.cacheExpiredCount())

                    .add("cacheEMissExpiredCount", cacheStatistics.cacheMissExpiredCount())

                    .add("cacheHitRatio", cacheStatistics.cacheHitRatio())

                    .toString();

 

        }

    }

 

    public String getCacheStatistics() {

        String[] names = cacheManager.getCacheNames();

        StringBuilder stringBuilder = new StringBuilder();

        for (String name : names) {

            stringBuilder.append(name).append(":").append(getCacheStatistics(name)).append("\r\n");

        }

        return stringBuilder.toString();

    }

 

 

}

结果如下

同理,相关配置也可以通过该方法去开启或关闭。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值