2015-11-27 4 views
0

Я пытаюсь настроить репликацию Ehcache с помощью JMS WebsphereMQ v7 в качестве поставщика. Я сделал эту репликацию с помощью ActiveMQ, и все в порядке, но я пытаюсь выяснить, какой класс мне нужно использовать для создания initialContext.Ehcache jms replication websphereMQ

Это текущий код с использованием ActiveMQ и работает хорошо, я хорошо это от this post.

ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="ehcache.xsd" 
updateCheck="true" 
monitoring="autodetect" 
dynamicConfig="true"> 
<diskStore path="java.io.tmpdir" /> 
<cacheManagerPeerProviderFactory 
class="net.sf.ehcache.distribution.jms.JMSCacheManagerPeerProviderFactory" 
properties="initialContextFactoryName=ca.toyota.testcache.cache.ActiveMQContextFactory, 
    providerURL=tcp://127.0.0.1:61616, 
    replicationTopicConnectionFactoryBindingName=topicConnectionFactory, 
    getQueueConnectionFactoryBindingName=queueConnectionFactory, 
    getQueueBindingName=ehcacheGetQueue, 
    listenToTopic=true, 
    replicationTopicBindingName=ehcache" 
propertySeparator="," /> 


<cache name="cacheTest1" 
    maxEntriesLocalHeap="10000" 
    maxEntriesLocalDisk="1000" 
    eternal="false" 
    diskSpoolBufferSizeMB="20" 
    timeToIdleSeconds="300" timeToLiveSeconds="600" 
    memoryStoreEvictionPolicy="LFU" 
    transactionalMode="off"> 
    <persistence strategy="localTempSwap" /> 

    <cacheEventListenerFactory 
    class="net.sf.ehcache.distribution.jms.JMSCacheReplicatorFactory" 
properties="replicateAsynchronously=true, 
       replicatePuts=true, 
       replicateUpdates=true, 
       replicateUpdatesViaCopy=true, 
       replicateRemovals=true,             
       asynchronousReplicationIntervalMillis=500" 
    propertySeparator="," /> 
</cache> 

ActiveMQContextFactory.java:

package ca.toyota.testcache.cache; 

import java.net.URISyntaxException; 
import java.util.Hashtable; 
import java.util.Map; 

import javax.naming.Context; 
import javax.naming.NamingException; 

import org.apache.activemq.jndi.ActiveMQInitialContextFactory; 

import net.sf.ehcache.distribution.jms.JMSUtil; 
import net.sf.ehcache.util.concurrent.ConcurrentHashMap; 

public class ActiveMQContextFactory extends ActiveMQInitialContextFactory { 
    @Override 
    public Context getInitialContext(Hashtable environment) 
      throws NamingException { 

     Map<String, Object> data = new ConcurrentHashMap<String, Object>(); 

     // Configure the Topic connection factory binding name 
     String factoryBindingName = (String) environment 
       .get(JMSUtil.TOPIC_CONNECTION_FACTORY_BINDING_NAME); 
     try { 
      data.put(factoryBindingName, createConnectionFactory(environment)); 
     } catch (URISyntaxException e) { 
      throw new NamingException("Error initialisating ConnectionFactory" 
        + " with message " + e.getMessage()); 
     } 

     String topicBindingName = (String) environment 
       .get(JMSUtil.REPLICATION_TOPIC_BINDING_NAME); 
     data.put(topicBindingName, createTopic(topicBindingName)); 

     // Configure queue connection factory binding name 
     String getQueueConnectionfactoryBindingName = (String) environment 
       .get(JMSUtil.GET_QUEUE_CONNECTION_FACTORY_BINDING_NAME); 

     if (getQueueConnectionfactoryBindingName != null) { 
      try { 
       data.put(getQueueConnectionfactoryBindingName, 
         createConnectionFactory(environment)); 
      } catch (URISyntaxException e) { 
       throw new NamingException(
         "Error initialisating TopicConnectionFactory with message " 
           + e.getMessage()); 
      } 
     } 

     String getQueueBindingName = (String) environment 
       .get(JMSUtil.GET_QUEUE_BINDING_NAME); 
     if (getQueueBindingName != null) { 
      data.put(getQueueBindingName, createQueue(getQueueBindingName)); 
     } 

     return createContext(environment, data); 
    } 

} 

Наконец мой вопрос: Какие InitialContextFactory я должен использовать для работы с WebpshereMQ.

Благодаря

ответ

0

Для кого такая же проблема, я почти 100% уверен, что нет никакого способа, чтобы использовать репликацию JMS на WAS.

После установки репликации EHCache с помощью WebsphereMQ я получаю сообщение об ошибке следовать:

Caused by: net.sf.ehcache.CacheException: Exception while creating JMS connections: Method setExceptionListener not permitted 
    at net.sf.ehcache.distribution.jms.JMSCacheManagerPeerProvider.init(JMSCacheManagerPeerProvider.java:193) 
    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 net.sf.ehcache.CacheManager.newInstance(CacheManager.java:1116) 
    at net.sf.ehcache.CacheManager.newInstance(CacheManager.java:1092) 
    at net.sf.ehcache.CacheManager.create(CacheManager.java:1075) 
    at org.springframework.cache.ehcache.EhCacheManagerFactoryBean.afterPropertiesSet(EhCacheManagerFactoryBean.java:139) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562) 
    ... 127 more 
Caused by: javax.jms.IllegalStateException: Method setExceptionListener not permitted 
    at com.ibm.ejs.jms.JMSCMUtils.methodNotPermittedException(JMSCMUtils.java:244) 
    at com.ibm.ejs.jms.JMSConnectionHandle.checkRestrictedMethod(JMSConnectionHandle.java:854) 
    at com.ibm.ejs.jms.JMSConnectionHandle.setExceptionListener(JMSConnectionHandle.java:353) 
    at net.sf.ehcache.distribution.jms.JMSCacheManagerPeerProvider.init(JMSCacheManagerPeerProvider.java:162) 
    ... 136 more 

Глядя на эту проблему я нашел следование общей проблемы:

Ehcache руководство репликации говорит:
WebSphere Application Server предотвращает создание MessageListeners, которые не являются MDB, от , создаваемых в контейнере. Хотя это общее ограничение Java EE, большинство других серверов приложений либо разрешены , либо могут быть настроены как разрешающие. WebSphere 4 работал, но 5 и 6 применяли ограничение . Соответственно, Ehcache вместе с JMS не могут быть использованы с WebSphere 5 и 6.

На Websphere 8 документации (http://www-01.ibm.com/support/knowledgecenter/SSAW57_8.0.0/com.ibm.websphere.nd.doc/info/ae/ae/tmj_desap.html?lang=it): В разделе "Служба сообщений Java (JMS) Требования" спецификации J2EE дает список методов, которые не должны быть названы в веб и EJB контейнеры: ограничение

javax.jms.Session method setMessageListener 
    javax.jms.Session method getMessageListener 
    javax.jms.Session method run 
    javax.jms.QueueConnection method createConnectionConsumer 
    javax.jms.TopicConnection method createConnectionConsumer 
    javax.jms.TopicConnection method createDurableConnectionConsumer 
    javax.jms.MessageConsumer method getMessageListener 
    javax.jms.MessageConsumer method setMessageListener 
    javax.jms.Connection setExceptionListener 
    javax.jms.Connection stop 
    javax.jms.Connection setClientID 

Этот метод вступил в силу в WebSphere Application Server, бросая javax.jms.IllegalStateExcept ионное исключение.

+0

Является ли EHCache JMS совместимым? Я не вижу «replicationTopic» что-либо в спецификации JMS, поэтому я не думаю, что нет. Кроме того, вы пытаетесь заставить MQ использовать это или WAS? Потому что вопрос отмечен ibm-mq, но ответ говорит о WAS. –

Смежные вопросы