मैं डेटा कैश करना चाहता हूं, लेकिन मैं अपने स्प्रिंग-बूट प्रोजेक्ट में @Cacheable एनोटेशन की नियुक्ति के बारे में थोड़ा उलझन में हूं।

    @Override
    public Map<String, String> getSampleMethod1() {
        Map<String, String> map = getSampleMethod2();
        return map;
    }

    @Override
    @Cacheable
    public Map<String, String> getSampleMethod2() {
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Map<String, String> map1 = getSampleMethod3();
        return map1;
    }

    private Map<String, String> getSampleMethod3(){
        Map<String, String> map2 = new HashMap<>();
        map2.put("name1", "value1");
        map2.put("name2", "value2");
        map2.put("name3", "value3");
        return map2;
    }

उपरोक्त कोड डेटा को कैश करने में सक्षम नहीं है। मैं अपने नियंत्रक से getSampleMethod1() को कॉल कर रहा हूं और getSampleMethod2() हर बार जब मैं नियंत्रक पर एपीआई हिट करता हूं तो चल रहा है।

क्या कोई कृपया मुझे कैशिंग में प्रॉक्सी ऑब्जेक्ट की अवधारणा को समझने में मदद कर सकता है?

1
Devender Kumar 10 सितंबर 2019, 09:53

1 उत्तर

सबसे बढ़िया उत्तर

केवल बाहरी वर्ग से getSampleMethod2() पर कॉल को इंटरसेप्ट किया जाएगा (वास्तव में प्रॉक्सी के माध्यम से आने वाली कॉल)। तो, आपके मामले में, जैसा कि आप उसी कक्षा से कॉल कर रहे हैं, आपकी विधि कॉल को इंटरसेप्ट नहीं किया जाएगा, इसलिए @Cacheable काम नहीं करेगा।

यदि यह काम करना चाहते हैं तो आपको अपनी कक्षा की स्वयं ऑटोवायर ऑब्जेक्ट बनाने और उस ऑब्जेक्ट पर विधि को कॉल करने की आवश्यकता है।

class MyService{

    @Autowired
    private ApplicationContext applicationContext;      

    MyService self;

    @PostConstruct
    private void init() {
        self = applicationContext.getBean(MyService.class);
    }

    public Map<String, String> getSampleMethod1() {
        Map<String, String> map = self.getSampleMethod2();
        return map;
    }
}
1
Amit Bera 10 सितंबर 2019, 08:05