2016-04-25 15 views
0

Ich verwende Hibernate 5.1.0.Final, Spring 3.2.11.RELEASE und JBoss 7.1.3.Final. Ich habe folgende ehcache.xml Konfiguration ...Wie bekomme ich mehrere WAR-Anwendungen, um den gleichen Second-Level-Cache zu verwenden?

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd" updateCheck="false"> 

    <!-- This is a default configuration for 256Mb of cached data using the JVM's heap, but it must be adjusted 
     according to specific requirement and heap sizes --> 
    <defaultCache maxElementsInMemory="10000" 
     eternal="false" 
     timeToIdleSeconds="86400" 
     timeToLiveSeconds="86400" 
     overflowToDisk="false" 
     memoryStoreEvictionPolicy="LRU"> 
    </defaultCache> 
    <cache name="main" maxElementsInMemory="10000" /> 

    <cacheManagerPeerProviderFactory 
     class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
     properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, 
     multicastGroupPort=4446, timeToLive=32"/> 

    <cacheManagerPeerListenerFactory 
     class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" 
     properties="hostName=localhost, port=40001, 
     socketTimeoutMillis=2000"/>  

</ehcache> 

Diese Datei in einer Reihe von meinen Web-Anwendungen enthalten ist (innerhalb eines JAR, Whcih dann in den Krieg WEB-INF/lib verpackt ist), von denen alle werden auf derselben JBoss-Instanz bereitgestellt. Ich möchte, dass alle Anwendungen die gleiche ehcache.xml-Konfiguration verwenden und somit Daten im selben Cache teilen. Aber viele Male, wenn ich versuche, und alle diese Anwendungen auf diesem Spiel Instanz bereitstellen, erhalte ich die folgenden Fehler ...

2016-04-25 15:21:41,007 ERROR [net.sf.ehcache.distribution.MulticastRMICacheManagerPeerProvider] (ServerService Thread Pool -- 128) Error starting heartbeat. Error was: Can't assign requested address: java.net.SocketException: Can't assign requested address 
     at java.net.PlainDatagramSocketImpl.socketSetOption0(Native Method) 
     at java.net.PlainDatagramSocketImpl.socketSetOption(PlainDatagramSocketImpl.java:74) 
     at java.net.AbstractPlainDatagramSocketImpl.setOption(AbstractPlainDatagramSocketImpl.java:310) 
     at java.net.MulticastSocket.setNetworkInterface(MulticastSocket.java:554) 
     at java.net.MulticastSocket.joinGroup(MulticastSocket.java:320) 
     at net.sf.ehcache.distribution.MulticastKeepaliveHeartbeatReceiver.init(MulticastKeepaliveHeartbeatReceiver.java:88) 
     at net.sf.ehcache.distribution.MulticastRMICacheManagerPeerProvider.init(MulticastRMICacheManagerPeerProvider.java:95) 
     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:270) 
     at org.hibernate.cache.ehcache.EhCacheRegionFactory.start(EhCacheRegionFactory.java:69) 
     at org.hibernate.internal.CacheImpl.<init>(CacheImpl.java:49) 
     at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:28) 
     at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:20) 
     at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.initiateService(SessionFactoryServiceRegistryImpl.java:46) 
     at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:234) 
     at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:208) 
     at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189) 
     at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:240) 
     at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:465) 
     at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:881) 
     at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:135) 
     at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:50) 
     at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:290) 
     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1573) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1511) 
     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:293) 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191) 
     at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1119) 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:924) 
     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 io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:187) 
     at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:195) 
     at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:100) 
     at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:82) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 
     at org.jboss.threads.JBossThread.run(JBossThread.java:320) 

Meine Frage ist, wie kann ich jede Web-Anwendung anweisen, den gleichen Cache der zweiten Ebene zu verwenden und ehcache-konfiguration?

+0

Checkout-Eigenschaft 'hibernate .cache.region_prefix "- dies wird vom Anwendungsserver festgelegt, um eine eindeutige Cache-Region für jede Bereitstellung zu erstellen, aber möglicherweise können Sie sie in persistence.xml überschreiben –

+0

K, meine Frage ist, wenn ich diese Eigenschaft auf" appA "für appA setze" AppB "für AppB und dann AppA Caches Entity X, wird App B in der Lage sein, Entity X im Second Level Cache zu finden? – Dave

+0

Nein, Sie müssten es auf den gleichen Wert setzen - der Punkt dieser Eigenschaft (und die Einstellung anders) besteht darin, die Apps zu isolieren. Ich weiß jedoch nicht, wie dies mit Classloadern funktionieren wird, da die Klasse foo.X in AppA wahrscheinlich in verschiedenen Classloads geladen ist als in appB. –

Antwort

0

Versuchen Sie, die WARs in einem einzigen zusammengesetzten EAR-Projekt zu verpacken. Wahrscheinlich möchten Sie auch, dass sich Ihre ehcache.xml-Datei außerhalb Ihres gepackten EAR befindet (aber immer noch im Klassenpfad), sodass sie separat nach Umgebung konfiguriert werden kann (Dev, Test, Prod usw.)

+0

Sie sagen also, es ist unmöglich, WAR-Anwendungen in der gleichen JVM (Anwendungsserver) zu implementieren, wo jeder die gleiche ehcache.xml-Konfiguration hat? – Dave

+0

Wenn Ihre ehcache.xml extern zu Ihren Projekten ist (irgendwo im Dateisystem gespeichert), denke ich, dass sie dieselbe Konfiguration haben könnten. Meine Sorge wäre die Classpath-Isolation, die die meisten Container (z.B. JBoss EAP) verwenden würden, um die tatsächliche Information zu teilen. Am Ende würden alle WARs ihren Cache auf die gleiche Weise konfigurieren, aber nicht den gleichen Cache im Speicher teilen. –

+0

Sie raten nur, Sie haben das nicht wirklich versucht? Ich frage, weil ich die JBoss-Classloading-Dokumentation lese und es geht um das Unified Class Loading (es speichert nur eine Klasse pro JVM). Das legt nahe, dass es in der Lage sein sollte, Dinge zu teilen, wie ich es oben beschrieben habe. – Dave