2012-09-20 2 views
-1

Strust2 및 최대 절전 모드로 작업하고 있습니다. 환율 (USD to INR)을 찾아야합니다. 이 정보를 두 곳 이상에서 사용해야합니다. 이를 위해 ThreadLocal을 사용하고 있습니다.ThreadLocal을 사용하여 데이터를 저장하는 방법

public class GetExchangeRate{ 
private ThreadLocal<Double> threadLocalRate = new ThreadLocal<Double>(); 
public double getCurrencyRate(UserDet userDet){ 
    LOG.info("Thread id is ---------------->"+Thread.currentThread().getId()); 
    Double currencyRate = (Double) threadLocalRate.get(); 
    if(currencyRate == null){ 
     LOG.info("Object does not exist"); 
    ---//my code which is used to find USD --> INR exchange rate 
    threadLocalRate.set(currencyRate);  
} 
return currencyRate ; 
} 
} 

나는 다른 방법에서 위의 메소드를 호출 할 필요가있다. 위 메서드를 다른 메서드에서 호출하면 위 코드가 실행 중입니다. 내 요구 사항은 단지 입니다. 전체 메소드를 실행해야합니다. 그리고 나머지는 세 번 총 메서드를 실행해서는 안됩니다. ThreadLocal 오브젝트에 격납되고있는 값이 돌려 주어집니다.

위의 전체 방법이 실행되었음을 보여주는 로그 보고서입니다.

[ INFO] 2012-09-20 10:20:04,611 [CommonFormats] (CommonFormats.java:getCurrencyRate:159) 
Thread id is ---------------------------->54 
[ INFO] 2012-09-20 10:20:04,611 [CommonFormats] (CommonFormats.java:getCurrencyRate:163) 
Object does not exist 

[ INFO] 2012-09-20 10:20:49,529 [CommonFormats] (CommonFormats.java:getCurrencyRate:159) 
Thread id is ---------------------------->54 
[ INFO] 2012-09-20 10:20:49,529 [CommonFormats] (CommonFormats.java:getCurrencyRate:163) 
Object does not exist 

내가 뭘 잘못하고 있는지 제안하십시오. 위의 방법은 네 개의 메소드에서 호출됩니다. 두 개의 메소드은 Action 클래스에 속하며 두 개의 메소드는 서비스 계층 클래스에 속합니다.

내 샘플 코드는

//Action class 
    public class StrutsAction1{ 
public String method1(){ 
     // my code 
    CommonFormats commonFormats= new CommonFormats(); 
    System.out.println(commonFormats.getCurrencyRate()); 
     // my code 
} 
public String method2(){ 
     // my code 
    CommonFormats commonFormats= new CommonFormats(); 
    System.out.println(commonFormats.getCurrencyRate()); 
     // my code 
} } 

//Business class 
public class BussinessLogic{ 
public String method1(){ 

     // my code 
    CommonFormats commonFormats= new CommonFormats(); 
    System.out.println(commonFormats.getCurrencyRate()); 
     // my code 

} 
public String method2(){ 

     // my code 
    CommonFormats commonFormats= new CommonFormats(); 
    System.out.println(commonFormats.getCurrencyRate()); 
     // my code 
} } 
+0

위의 611과 529는 위의 전화 번호 (발신자 번호)를 나타내는 라인 번호를 나타냅니다. – Daya

+0

요구 사항이 명확하지 않습니다. –

+0

@DaveNewton threadLocalRate 변수가 두 개 이상의 메소드가 필요합니다 (거의 4 개의 메소드에서). 그것은 환율 (USD -> INR)을 갖습니다. 환율을 알아내는 데 사용되는 코드는 한 번만 실행해야합니다. 나머지 3 번은 실행해서는 안됩니다. 그래서 ThreadLocale 개념을 사용했습니다. 그러나 그것은 작동하지 않습니다. 나는 그 질문을 갱신했다. – Daya

답변

2

나는 ThreadLocal를 여기에 적절하지 않다 생각합니다. 필자는 Struts 2를 사용한 적이 한번도 없었 습니다만, 이것은 셀벨 트 위에 구축 된 웹 프레임 워크라는 것을 알고 있습니다. 이들은 웹 컨테이너와 웹 컨테이너에서 실행되어 스레드가 열리는시기와 개발자로서 개발자가 이러한 결정을 방해해야하는지 결정합니다.

이제 로컬 스레드는 다른 스레드의 동일한 키에 대해 다른 값을 유지할 수 있도록 키 - 값 맵만 제공합니다. 예를 들어

, 두 개의 스레드 A가 있고 B와 키 - 값 쌍

  • "이름"유지하려면 -> '존'스레드 A과에게
  • "이름"-> ' 스레드 B에 대한 Fred '

로컬 스레드에서 그렇게 할 수 있습니다.

당신이 정말로 찾고있는 것은 일종의 응용 프로그램 컨텍스트입니다. 컨테이너의 모든 스레드가 공유하는 데이터를 저장하는 장소입니다. 또 다른 가능성은 싱글 톤 (Singleton)입니다.

기술적으로 이것이 어떻게 구현 될 수 있습니까? 당신은 thisthis

희망을 읽기에 관심이있을 수

1

는 아래의 코드 도움을 하는가하는 데 도움이? 웹 사이트에서 기사를 읽고 JDK7.0에서 무료로 컴파일 할 수 있도록 코드를 수정했습니다.I가 사용하는 리소스를

http://javapapers.com/core-java/threadlocal/

package com.javapapers; 

import java.text.SimpleDateFormat; 
import java.util.Date; 

public class ThreadLocalExample { 
    private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>() { 

    protected SimpleDateFormat initialValue() { 
     return new SimpleDateFormat("yyyyMMdd HHmm"); 
    } 
    }; 

    public String formatIt(Date date) { 
    return formatter.get().format(date); 
    } 

    public static void main(String[] args) 
    { 
     ThreadLocalExample example = new ThreadLocalExample(); 
     System.out.println(example.formatIt(new Date())); 
    } 
} 
여기

ThreadLocal를 정적 변수로서 사용된다.

0

코딩에 실수가 없습니다. 변수를 정적 변수로 설정하지 않았습니다.

private static final ThreadLocal<Double> threadLocalRate = new ThreadLocal<Double>(); 

이제 스레드 로캘 개념이 작동합니다.

관련 문제