Menggunakan proksi CGLIB dengan Ehcache CacheManager

Saya ingin menggunakan Spring AOP di aplikasi pegas saya. Saat membuat proksi AOP untuk net.sf.ehcache.CacheManager, inisialisasi konteks pegas gagal dengan pengecualian di bawah ini:

nested exception is org.springframework.aop.framework.AopConfigException: Could not
generate CGLIB subclass of class [class net.sf.ehcache.CacheManager]: Common causes of 
this problem include using a final class or a non-visible class; nested exception is 
net.sf.cglib.core.CodeGenerationException: net.sf.ehcache.CacheException-->Another   
unnamed CacheManager already exists in the same VM. Please provide unique names for 
each CacheManager in the config or do one of following:
1. Use one of the CacheManager.create() static factory methods to reuse same  
CacheManager with same name or create one if necessary
2. Shutdown the earlier cacheManager before creating new one with same name.
The source of the existing CacheManager is: InputStreamConfigurationSource 
[stream=java.io.ByteArrayInputStream@955b34]

Inilah pemahaman saya tentang masalah ini - Spring mencoba membuat proxy AOP untuk net.sf.ehcache.CacheManager, dan berhasil pertama kali dan memberikan nama default ke CacheManager __DEFAULT__ (menemukan ini dengan menambahkan pernyataan debug ke kode ehcache, membuatnya berdasarkan sumber dan menggunakannya dalam lamaran saya). Sekarang jika saya memiliki beberapa pengelola cache seperti 'abcCacheManager' dan 'xyzCacheManager' (dari tipe EhCacheManagerFactoryBean), Spring menemukan beberapa net.sf.ehcache.CacheManagers dan mencoba membuat objek proxy (seperti net.sf.ehcache.CacheManager$$EnhancerByCGLIB$$b18c5958) untuk semuanya, tetapi dengan EhCache >= versi 2.5, kami tidak dapat memiliki lebih dari satu cache dengan nama yang sama di bawah VM yang sama.

Saya menggunakan EhCache 2.5.1 dan ingin menghindari kembali ke 2.4 hanya untuk tujuan ini. Saya tidak yakin apakah ini benar-benar masalahnya, bagaimana saya bisa mengatasi masalah ini.

Catatan: Perhatikan pasti apakah ini akan membantu, tetapi saya juga memperhatikan dari pernyataan debug bahwa konstruktor CacheManager no-arg hanya dipanggil oleh generator proxy pegas/CGLIB dan xyzCacheManager memanggilnya dengan meneruskan konfigurasi sebagai argumen.


person Swapnil    schedule 09.09.2012    source sumber
comment
Apakah Anda benar-benar memerlukan proxy CGLIB untuk CacheManager?   -  person jeha    schedule 10.09.2012


Jawaban (1)


Catatan : Saya menjawabnya sendiri karena dapat membantu orang lain yang menghadapi masalah yang sama.

Komentar jeha pada pertanyaan saya masuk akal karena saya seharusnya tidak memerlukan proxy itu sejak awal, tetapi karena saya Saya baru mengenal Spring AOP dan proksi, saya tidak tahu cara kerja mekanisme proksi otomatis. Saat saya memodifikasi ekspresi pointcut dalam saran saya, saya tidak menghadapi masalah di atas setelah itu. Sebelumnya, hampir semua kacang dalam wadah telah diproksi dan karenanya menjadi masalah.

person Swapnil    schedule 12.09.2012