2017-05-11 15 views
0

웹 서비스에서 데이터를 소비하고 낙타 eh-cache에 저장하려고합니다. 나중에 낙타 컨텍스트 외부에서이 캐시를 CacheManager 통해 사용하고 싶습니다. 나는 그것을 할 어떤 방법을 찾고 있지 않다.낙타 컨텍스트 외부의 Apache camel eh-cache에 액세스하는 방법은 무엇입니까?

아래 코드에서는 Map에서 데이터를 사용하여 웹 캐시를 제공했지만 CacheManager을 사용하여이 캐시에 액세스 할 수 없습니다.

CamelRouter 클래스

package com.camel; 


import java.net.URL; 
import java.util.HashMap; 
import java.util.Map; 

import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.component.ehcache.EhcacheConstants; 
import org.apache.camel.main.Main; 
import org.ehcache.Cache; 
import org.ehcache.CacheManager; 
import org.ehcache.config.Configuration; 
import org.ehcache.config.builders.CacheManagerBuilder; 
import org.ehcache.xml.XmlConfiguration; 

public class Test { 

    private static Main main; 

    public static void main(String[] args) throws Exception { 

     main = new Main(); 
     main.addRouteBuilder(new RouteBuilder() { 

      @Override 
      public void configure() throws Exception { 
       from("timer:foo?period=5s&repeatCount=1") 
       .process(exchange ->{ 
        Map<String, String> inputMap = new HashMap<>(); 
        inputMap.put("name", "murli"); 
        inputMap.put("lastname", "hiware"); 
        inputMap.put("city", "pune"); 
        exchange.getIn().setBody(inputMap); 
        exchange.getIn().setHeader("CamelEhcacheAction", EhcacheConstants.ACTION_PUT_ALL); 
       }) 
       .to("ehcache://testCache?configUri=ehcache.xml&keyType=java.lang.String&valueType=java.lang.String") 
       .process(exchange -> { 
        URL myUrl = getClass().getResource("/ehcache.xml"); 
        Configuration xmlConfig = new XmlConfiguration(myUrl); 
        CacheManager myCacheManager = CacheManagerBuilder.newCacheManager(xmlConfig); 
        myCacheManager.init(); 
        //here I want to access already created testCache component but it is creating new one. 
        Cache<String, String> cache = myCacheManager.getCache("testCache", String.class, String.class); 
        System.out.println("Cache Element:"+cache.get("name")); 
        System.out.println("Exchange Message:"+exchange.getIn().getBody()); 

       }); 
      } 
     }); 

     main.run(); 
    } 

} 

으로 Ehcache 설정 파일

<config 
    xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
    xmlns='http://www.ehcache.org/v3' 
    xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd"> 

    <cache alias="testCache"> 
    <key-type>java.lang.String</key-type> 
    <value-type>java.lang.String</value-type> 
    <resources> 
     <heap unit="entries">2000</heap> 
     <offheap unit="MB">100</offheap> 
    </resources> 
    </cache> 

    <cache-template name="myDefaults"> 
    <key-type>java.lang.Long</key-type> 
    <value-type>java.lang.String</value-type> 
    <heap unit="entries">200</heap> 
    </cache-template> 

    <cache alias="bar" uses-template="myDefaults"> 
    <key-type>java.lang.Number</key-type> 
    </cache> 

    <cache alias="simpleCache" uses-template="myDefaults" /> 

</config> 

제가 달성하기 위해 노력하고 유스 케이스는 낙타으로 Ehcache 가능합니다 여부를 알려 주시기 바랍니다?

+0

@ claus-ibsen는 도움이 될 수 있습니까? – Murli

답변

1

일반적으로 from("ehcache://...)의 값을 검색 할 수 있어야합니다.

그러나 캐시 또는 캐시 관리자에 실제로 액세스하려고한다고 가정합니다.

public static void main(String[] args) throws Exception { 
    URL url = App.class.getResource("/ehcache.xml"); 
    Configuration xmlConfig = new XmlConfiguration(url); 

    CacheManager cacheManager = CacheManagerBuilder.newCacheManager(xmlConfig); 
    cacheManager.init(); 

    Main main = new Main(); 
    main.bind("cacheManager", cacheManager); 

    main.addRouteBuilder(new RouteBuilder() { 

     @Override 
     public void configure() throws Exception { 
      from("timer:foo?period=5s&repeatCount=1") 
       .process(exchange ->{ 
        Map<String, String> inputMap = new HashMap<>(); 
        inputMap.put("name", "murli"); 
        inputMap.put("lastname", "hiware"); 
        inputMap.put("city", "pune"); 
        exchange.getIn().setBody(inputMap); 
        exchange.getIn().setHeader("CamelEhcacheAction", EhcacheConstants.ACTION_PUT_ALL); 
       }) 
       .to("ehcache://testCache?cacheManager=#cacheManager&keyType=java.lang.String&valueType=java.lang.String") 
       .process(exchange -> { 
        //here I want to access already created testCache component but it is creating new one. 
        Cache<String, String> cache = cacheManager.getCache("testCache", String.class, String.class); 
        System.out.println("Cache Element:"+cache.get("name")); 
        System.out.println("Exchange Message:"+exchange.getIn().getBody()); 

       }); 
     } 
    }); 

    main.run(); 
} 
+0

감사합니다 Henri. 이것은 내가 필요한 것입니다. – Murli

1

당신이 찾고있는 무슨이다 :

  • 중 하나는, 어디서든 액세스 낙타 컨텍스트
  • 에서 포함하거나 노출 할 수있는 방법을 찾을 필요가 있습니다 CacheManager의 저장소 Cache 또는 CacheManager 문맥에서

Ehcache 2.x의 첫 번째 오류는 Ehcache 3.x에서 기본적으로 제거되었습니다. 슬프게도 나는 최선의 방법으로 어느 쪽이든을 추천 할만큼 충분히 낙타를 모른다.

1

당신은 사용하여 캐시 관리자를 설정하고 URI와 같은 수 있습니다 :

그것을 할 수있는 방법입니다 myCacheManager는 낙타 레지스트리에 콩 당신의 참조입니다

to("ehcache:myCache?cacheManager=#myCacheManager") 

+0

감사! 나는 완전히 작동하는 코드로 나의 대답을 업데이트했다. – Henri