2012-04-18 39 views
7

Osgi paketlerimi günde 4 kez yeniden yüklemem gereken bir gereksinim var. Bir paketi yeniden yüklemek, statik örneğin yeniden oluşturma, deve yollarını yeniden yükleme, yeniden oluşturma ve enjekte etme iş parçacığı havuzları, veritabanı bağlantı havuzları ..etc (diğer bahar xml öğeleri) anlamına gelir. Paketlerimi ssh ile yenilemeyi denedim, ancak fazla mesaiyi değiştirebilecek bir paket id'sine ihtiyacım vardı. Yani, sembolik adlarıyla demetleri alır ve bunları yeniler Yönetici Paketi 4 kezOsgi paketlerinin güncellenmesiyle ilgili sorun

  osgi impl : felix 

      container : apache-servicemix-4.4.1-fuse-03-06 

      Service Dependency spec : Blueprint 

tüm ortak sınıflar kullandı bir yardımcı paket hayranlarıyla yardımcı paket ile birlikte 3 desteler vardır ve gündüz hizmet yazdı arayüzler. Bu 3 paket arasında kod paylaşımı yoktur (hiçbiri herhangi bir paket ihraç etmez). Bunların hepsi deve vm uç noktaları ve hizmetleri ile etkileşime girer. Sadece diğer 3 demeti yeniliyor ve yardımcı paket hiçbir hizmet sunmuyor.

Şimdi, sorun, başlattıkları ve düzgün çalıştıkları bu 3 paket üzerinde herhangi bir güncelleştirme yaptığım zaman, ama her seferinde jconsole'da 800-900 sınıfı bir artış görüyorum. Gc zorlamak da bu nesneleri temizlemiyor gibi görünüyor. Peki, bu eski kablolu nesneler ne olabilir? Hizmet bağımlılıkları otomatik olarak güncellenmeli ve paketler arasında kod bağımlılıkları yok. Güncellemeden önceki ve sonraki sınıfların sayısındaki farkı kontrol ettim.

i bazı sınıfların bu sayı görebiliyordu

iki katına org.apache.activemq.camel.component.VmComponent, org.apache.commons.dbcp.BasicDataSource gibi ..etc ve bazı özel fasulye o ben deve rotalarımda tanımladı. Ben deve çekirdeği, blueprint, kuvars ... vs için konteyner bağımlı değilim.Ve tam olarak fasulye, VM uç noktaları .. deve bağlamında ve blueprint-config xml güncellemesinde tanımlanan bileşenlere. Paketi güncellediğinizde, FrameworkWiring.refreshBundles() yöntemini çağırması önerilir. Ancak, demetleri arasında kod paylaşımı yok ve sanırım şu anda yanlış olduğunu düşündüğüm başka bağımlılıklar konteyneri ele almalıyım. Ve servicemix mevcut felix çerçeve uygulamasının FrameworkWiring.refreshBundles() (ref) destekleyip desteklemediğinden emin değilim. Bu sorunu nasıl giderebilirim?

Teşekkür sanre6

+0

Eski bundle örneğinin etrafında asılı olan iş parçacıklarınız var mı? – artbristol

+0

evet, onların sayısı ikiye katlandı. Örneklerimi kapatmam gerektiğini, demeti güncellemeden önce deve rotalarını kapatmam gerektiğini mi söylüyorsun? – sanre6

+0

Aynı sorunu bulduk. Ekinoks uygulamasına geçmek bu problemi ortadan kaldırıyor, o zaman ben Felix OSGI konteyneriyle ilgili bir sorundan şüpheleniyorum. –

cevap

0

Ben Camel hakkında çok şey bilmiyorum ama sınıfları paket bakın runnables ile platform sunarak eğer, o zaman emin hepsi tazelede tahrip iptal edilir veya başka şekilde olsun yapmak gerekir, Çalıştıkları iş parçacıkları eski sınıf örneklerine (yeni paketin sınıf örneklerinden farklı olsalar bile, aynı olsalar bile) bir başvuru tutacaktır. Bu nedenle, sınıf sayımı artmaktadır.

+0

Uygulamam ağır hizmet paketlerine bağlıdır ve en iyi uygulamanın konteyner bağımlılıklarınızı ele almasına, tüm bu bağımlılıkları tanımlamasına ve bunları temizlemesine izin vermenin çok acı verici bir iş olduğuna inanıyorum. Çekirdek osgi'yi kaldırabileceğinden bile emin değilim. ve bir paketi güncellemeden önce blueprint ile ilgili bağımlılıklar – sanre6

1

Genelde, yalnızca paketlerde bir güncelleme başlatılması yeterli değildir. Bir noktada paketlerinizi de yenilemeniz gerekir. Her şey iyi durumda ise, tüm paket kablolarını güncellemek için yeterli olmalı, paketin eski sürümlerinin toplanarak toplanmasını sağlayın. Bununla birlikte, düzgün davranmayan ve bir önbellekte veya bir şeyde bir iş parçacığı veya bazı kaynakları çalıştıran paketlerden birinde bir şey varsa, sorunu izlemeniz gerekir. Kendinize iyi bir profiler edinin, bu "ekstra" nesnelerin hangi gruba ait olduğunu ve oradan nasıl yüklendiğini görün.