2016-03-30 15 views
1

Belirli metni indeksleyen ve daha hızlı arama yapmak için bellekte saklayan bir SearchService grades uygulamasına çalışıyordum. Bu verileri depolamak için, verileri depolamak için Hizmet'te özel bir statik özellik kullanmaya çalışıyordum, ancak özellik değerleri rastgele sıfırlıyordu. Belgeleri yeniden okuduktan sonra, bunun büyük olasılıkla, çalışanların tekil paterninden bu yana vatansız hizmetlerin vatansız olması gerektiği ihtimalini fark ettim. Yine de, statik bir değişkenin nasıl değişebileceğini anladığımdan emin değilim. JVM, iş parçacığı başına hizmet sınıflarının ayrı kopyalarını yükler mi? Kafamı neler olup bittiğine dair emin değilim.Vatansız grails hizmetinde paylaşılan verilerle nasıl başa çıkıyorsunuz?

Yine de, şimdi uygulama genelindeki verileri saklamak için durağan değişkenlere güvenemediğimi biliyorum, uygulama boyunca kullanım için veri depolamak ve erişmek için en iyi yaklaşım nedir, senkronizasyonu koruyor ve ırklardan kaçınıyor musunuz? java.lang.IllegalStateException:


tarafından neden [TEXTSTORE] sınıf Yöntemi Grails uygulama dışında kullanıldı. Alaycı API veya bootstrap Grails kullanarak bir test bağlamında çalışıyorsa doğru şekilde. SearchService $ tt__rebuildIndex (SearchService.groovy de .: SearchService.indexAllDomains (41 SearchService.groovy): en : SearchService $ _indexAllDomains_closure2.doCall (42 SearchService.groovy) en : SearchService.buildIndex (63 SearchService.groovy) en 48) SearchService.afterPropertiesSet (SearchService.groovy de : 35) ... 4 daha

+0

Bu hizmetlerin, kodunuzdaki değişikliklerin hizmetin yeniden yüklenmesine neden olduğunda üretimde veya geliştirme sırasında güvenilmez olduğunu görüyor musunuz? Grails 1.x'ten bu yana hizmetlerde paylaşılan durumu (örneğin arama ya da endeksli veri) tutmanın çeşitli yollarını kullanıyorum ve bunu üretimde hiç görmedim. Bir kez değil. –

+0

Geliştirme aşamasında. Sorun, hizmet tarafından bir NPE hatası atılırsa ve açıkça yakalanmıyorsa (yine de bazı hatalar çalışıyorsa) yinelenen ortaya çıkar. Sınıf böyle bir durumda yeniden yüklendi mi? – SWS3D

+1

Sınıflar, bunları değiştirirseniz geliştirmeye yeniden yüklenir, böylece aslında bunu görmenizin nedeni olabilir. Fasulyenin yaşam döngüsüne girerek hizmetinizi daha güvenilir hale getirmeli ve başladığında veriyi yeniden oluşturmalı/yüklemelidir. Tipik olarak servis uygulamanız olan org.springframework.beans.factory.InitializingBean' ve 'afterPropertiesSet()', bunu yapmanın iyi bir tanıtımıdır. –

cevap

2

Sen Grails hizmetleri hakkında biraz karışık gibi görünüyor. Bir hizmetin (singleton'a varsayılan olarak) neden paylaşılan bir duruma sahip olamayacağının bir nedeni yoktur. Bir hizmetin, oluşturulduğunda önbelleğe alınmış veya dizinlenmiş bazı verileri doldurması nadir değildir, bu nedenle birden fazla kişi tarafından kullanılabilir.

Çoğu zaman bu, org.springframework.beans.factory.InitializingBean arabirimini uygulayarak ve hizmet (Spring bean) uygulama bağlamında oluşturulduğunda ve tüm bağımlılıklar çözüldüğünde çağrılan afterPropertiesSet() yöntemini kullanarak yapılır. hatta (Servis reloads bazı kod değiştirdik çünkü) gelişiminde hala veriye sahip olacağı oldukça emin olabilir fasulye yaşam döngüsü içine çengel ile

package com.example 

import org.springframework.beans.factory.InitializingBean 

class MyExampleService implements InitializingBean { 
    private List data 
    def otherService 

    void afterPropertiesSet() { 
    data = otherService.doSomethingToFetchData() 
    } 
    // .. other stuff 
} 

: Örneğin

gerekli.

Bu yardımcı olur umarız!

+0

Josh, bu yardımcı oldu, ama hemen başka bir sorunla karşılaştım. DB'deki bazı verilerden dizin oluşturmaya çalışıyorum. Ancak, hizmetin başlatıldığı sırada etki alanı nesneleri kullanıma hazır değil gibi görünür ve aşağıdakileri alırım. – SWS3D

+0

Nedeni: java.lang.IllegalStateException: [TEXTSTORE] sınıfındaki yöntem Grails uygulamasının dışında kullanıldı. Alaycı API veya bootstrap Grails kullanarak bir test bağlamında çalışıyorsa doğru şekilde. SearchService'te, SearchService.indexAllDomains'de (SearchService.groovy: 41), SearchService'de $ SearchTervice.buildIndex (SearchService.groovy: 63) 'da (SearchService.groovy: 63), SearchService. $ tt__rebuildIndex (SearchService.groovy: 48). afterPropertiesSet (SearchService.groovy: 35) ... 4 daha fazla – SWS3D

+0

Bu, GORM uygulama başlatma ve kullanılan classloader sırasında kurulum yolu ile ilgili olarak hep birlikte ayrı bir sorun gibi görünüyor. Bu konuyla ilgili yeni bir soru göndermenizi tavsiye ederim çünkü bu, yaşadığınız orijinal konu değil ve aslında yeni bir sorun/soru. –