2013-08-29 1 views
1

Google 구아바를 사용하여 개체를 캐시하는 프로그램을 작성했습니다. 내 문제는 Guava Load 메서드에 추가 매개 변수를 전달하는 방법입니다. 여기에 코드가 있습니다. 아래에서이 줄을 보게됩니다. fileId와 pageno를 key - cache.get (fileID + pageNo);로 만들었습니다. 이제 cache.get이 호출되고 그 키가 캐시에 없을 때 - 구아바는 아래에 주어진 PreviewCacheLoader 클래스의 load 메소드를 호출합니다. 이는 위의 매개 변수를 전달하는 방법 구글 구아바 - 메서드를로드하는 매개 변수를 추가로 전달하십시오.

public class PreviewCache { 
    static final LoadingCache<String, CoreObject> cache = CacheBuilder.newBuilder() 
      .maximumSize(1000) 
      .expireAfterWrite(5, TimeUnit.MINUTES) 
      .build(new PreviewCacheLoader()); 

    public CoreObject getPreview(String strTempPath, int pageNo, int requiredHeight, String fileID, String strFileExt, String ssoId) throws IOException 
    { 
     CoreObject coreObject = null; 
     try { 
      coreObject = cache.get(fileID+pageNo, HOW TO PASS pageNO and requiredHeight because I want to keep key as ONLY fileID+pageNo); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 
     return coreObject; 
    } 
} 

키 매개 변수

public class PreviewCacheLoader extends CacheLoader<String, CoreObject> { 

@Override 
public CoreObject load(String fileIDpageNo, HOW TO GET pageNO and requiredHeight) throws Exception { 

    CoreObject coreObject = new CoreObject(); 
    // MAKE USE OF PARAMETERS pageNO and requiredHeight 
    // Populate coreObject here 
    return coreObject; 


} 

} 우선 들어

답변

1

에 추가로드 방법을 아래에 INT와 문자열입니다, 그것은 fileId + pageNo를 사용하는 매우 나쁜 프로그래밍 연습이다 적절한 개체를 만드는 대신 String 키로 사용하십시오. 이 문제를 해결할 수있는 가장 좋은 방법은 다음과 같습니다.

class FileIdAndPageNo { 
    private final String fileId; 
    private final int pageNo; 
    ...constructor, hashCode, equals... 
} 
public CoreObject getPreview(final int pageNo, final int requiredHeight, String fileID) { throws IOException 
{ 
    CoreObject coreObject = null; 
    try { 
     coreObject = cache.get(new FileIdAndPageNo(fileID, pageNo), 
      new Callable<CoreObject>() { 
      public CoreObject call() throws Exception { 
       // you have access to pageNo and requiredHeight here 
      } 
      }); 
    } catch (ExecutionException e) { 
     e.printStackTrace(); 
    } 
    return coreObject; 
} 
+0

감사합니다 Louis - 그렇다면이 두 가지가 필요합니까? 1. .build (새 PreviewCacheLoader()); 2. 전체 PreviewCacheLoader 클래스. 내가 이해 한 것은 호출 가능한 호출 메소드로 PreviewCacheLoader 클래스의 load 메소드의 로직을 이동해야한다는 것이다. 그 맞습니까 ? – user2565431

+0

아니요,이 시점 이후에 더 이상 'CacheLoader'를 가질 필요는 없습니다. 단지'.build()'만 할 수 있습니다; 예, 모든 논리를 '호출 가능'으로 옮깁니다. –

+1

좋은 답변입니다. 나는 hashCode()와 equals() 구현이 ** Required **를 FieldIdAndPageNo 클래스에 추가 할 것입니다. 그렇지 않으면 Cache는 2 개의 키를 같은 것으로 간주하지 않습니다. –

관련 문제