adsense

21.08.2014

Weblogic NoSuchMethodError Hatası ve prefer-web-inf-classes Parametresi

Bu makalede, uygulama kodu ile weblogic kütüphanelerinin çakışması problemine bir çözüm önerisi olarak “prefer-web-inf-classes” parmetresinden bahsedilecek.

Proje geliştirilirken uygulama kodu içerisindeki kütüphaneler ile weblogic kütüphanelerinin çakışması gibi durumlar meydana gelebiliyor. Bu durum uygulamanın çalışmasına mani olabilir.

Yaşanan bir örnek üzerinden konuya açıklık getirmeye çalışalım.

WLS 10.3.6 olan test ortamına uygulamaya ait war sorunsuz bir şekilde deploy edildi. Yapılan testler sonrasında uygulamanın WLS 12.1.2 olan prod ortamına alınması kararlaştırıldı. Fakat deployment sırasında uygulama hata alıp, aşağıdaki logun oluştuğu gözlendi.

<Aug 18, 2014 3:03:02 PM EEST> <Error> <Deployer> <BEA-149231> <Unable to set the activation state to true for the application "SOAOpsTool".
weblogic.application.ModuleException: java.lang.NoSuchMethodError: org/slf4j/spi/LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V


İnceleme sonucu, proje içerisinde(WEB-INF/lib) kullanılan slf4j kütüphanesinin, WLS 12.1.2 ortamında farklı bir versiyon ile mevcut olduğu görüldü. WLS 10.3.6 versiyonlu test ortamında slf4j kütüphaneleri bulunmadığı için hatanın daha önce yakalanamadığı farkedildi.

Proje içerisinde kullanılan kütüphaneler:
/WEB-INF/lib/jcl-over-slf4j-1.5.8.jar
/WEB-INF/lib/slf4j-log4j12-1.5.8.jar
/WEB-INF/lib/slf4j-api-1.5.8.jar

WLS 12.1.2 kütüphaneleri:
/org.slf4j.api_1.6.1.1.jar
/org.slf4j.jdk14_1.6.1.1.jar
/org.slf4j.ext_1.6.1.1.jar

Çözüm olarak; 
Projede kullanılan kütüphanelerin WLS tarafından önceliklendirilmesi sağlanmalıdır. Örnekteki slf4j kütüphanesinin ilk önce proje kütüphanelerinde aranmasını sağlamak için projedeki weblogic.xml dosyasına aşağıdaki parametre eklenip, uygulama deploy edilerek sorun giderilebilir.

Weblogic.xml ‘de Eklenen Kısım:

<container-descriptor>
       <prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>


Çıkarılan Dersler:

1-) Bu örnekte de görüldüğü gibi projelerdeki test ve prod ortamlarının her zaman aynı versiyon olması önemlidir. :)

2-) WLS versiyonları farklılaştıkça içerisindeki kütüphanelerin de değişebildiği unutulmamalı. Bu durum java.lang.NoSuchMethodError hatalarının sebebi olabilir.

19.08.2014

Weblogic Admin Account Şifre Değiştirme (Reset the password for Weblogic Admin Console)

Bu yazıda weblogic admin account’umuzun şifresini unutursak nasıl resetleyebileceğimizden bahsedeceğiz.




Öncelikle $DOMAIN_HOME/bin klasörüne girip setDomainEnv.cmd/setDomainEnv.sh çalıştırıyoruz.





Daha sonra DefaultAuthenticatorInit.Idift dosyamızı yedekliyoruz.



$DOMAIN_HOME/security klasörüne yeni bir DefaultAuthenticatorInit.Idift oluşturuyoruz.




Daha sonra $DOMAIN_HOME/security klasöründe aşağıdaki komutu çalıştırıyoruz.



java weblogic.security.utils.AdminAccount username new password .




$DOMAIN_HOME/servers/AdminServer klasörüne girip data dosyasını yedekliyoruz.


$DOMAIN_HOME/servers/AdminServer/security klasörüne giriyoruz. Boot.properties dosyamızı yedekliyoruz ve yeni bir tane oluşturuyoruz.


Aşağıdaki gibi username ve yeni password yazıp kaydediyoruz.


Daha sonra admin server’ı restart ediyoruz. Böylece şifremizi yenilemiş oluyoruz.


WEBLOGIC DOMAINLERIN NMENROLL() KOMUTUYLA ILISKILENDIRILMESI (LINUX)

WEBLOGIC DOMAİNLERİN NMENROLL() KOMUTUYLA BİRBİRİNE BAĞLANMASI
(LINUX)

       Birden fazla domainin olduğu sistemlerde farklı domainler arasındaki iletişim nodemanager üzerinden sağlanır. Bu iletişim domainlerin tek bir nodemanager a bağlanmasıyla sağlanır. WLS komutlarından olan NmEnroll komutu kullanılarak tüm domainler Admin server ın olduğu domainle ilişkilendirebilir. Bu sayede sadece admin server dan gönderilen komutlarla manage serverlara müdahale edilip, konfigürasyonlar yapılıp, metrikler toplanabilir.

Nmenroll komutu kullanılarak domainlerin ilişkilendirilmesi işlemi aşağıdaki gibi gerçekleştirilebilir.
(Bu işlem farklı makinelerde kurulu domainlerin ilişkilendirilebilmesi gibi aynı makinelerdeki domainlerin ilişkilendirlmesi için de kullanılabilir.)

***Aşağıdaki işlemler Admin Server a bağlanılacak olan domainin olduğu makinede gerçekleştirilir.

- nodemanager ın ilişkilendirileceği (tüm domainlerin ortak iletişim kuracağı) domainde bulunan Admin server ın UP durumda olması sağlanır.


- ~/{DOMAIN_HOME}/bin/setDomainEnv.sh çalıştırılır.

**Kullanılan profilde java_home klasörü belirtilmişse bu adıma gerek yoktur.


- ~/{Oracle_Home}/wlserver_10.3/common/bin altında wlst.sh çalıştırılır

[user@machine ~]$ {ORACLE_HOME}/wlserver_10.3/common/bin/wlst.sh

Initializing WebLogic Scripting Tool (WLST) ...

Welcome to WebLogic Server Administration Scripting Shell

Type help() for help on available commands

wls:/offline> 


- Aşağıdaki komut kullanılarak

connect("username","password","t3://host:admin_port")

wls:/offline> connect("username","password","t3://host:admin_port")

Connecting to t3:// host:admin_port with userid username...

Successfully connected to Admin Server ‘Admin_Server’ that belongs to domain ‘MY_DOMAIN’.



- Daha sonra aşağıdaki nmenroll komutu çalıştırılır.

nmEnroll('~/{DOMAIN_HOME}/', ~/{Oracle_Home}/wlserver_10.3/common/nodemanager')

***Bu kısımda DOMAIN_HOME Admin server a bağlanacak olan domainin home klasörünün pathidir. Nodemanager dizini ise Admin Serverın bulunduğu domainin nodemanager klasörüdür.

wls:/offline> nmEnroll(‘~/{DOMAIN_HOME}/','~/{Oracle_Home}//wlserver_10.0/common/nodemanager')

Enrolling this machine with the domain directory at ~/{DOMAIN_HOME}/....
Successfully enrolled this machine with the domain directory at ~/{Oracle_Home}/nodemanager

- Aşağıdaki komut kullanılarak nodemanager a bağlanıp bağlanmadığı kontrol edilebilir.

wls:/offline>nmconnect("username","password","host”,”5556","base_domain","~/{DOMAIN_HOME}/","plain")

Connecting to Node Manager ...
Successfully Connected to Node Manager.

***Weblogic kurulumu sırasında default nodemanger portu 5556 dır, kurulum sırasında ya da sonrasında port numarası değiştirilebilir.

14.08.2014

Weblogic Server Side by Side Deployment



Weblogic server side-by-side (çalışan bir kod varken, aynı kodun farklı bir versiyonunu deploy etme)  adı verilen son derece faydalı bir deployment seçeneği sağlamaktadır. Bir uygulamanın yeni bir versiyonunu devreye almak ve aynı zamanda eksi versiyondaki uygulamanın çalışır durumda kalmasını istiyorsanız side-by-side deployment tam da sizin aradığınız bir çözüm olacaktır.

Eski versiyonu kullanan sessionlar expired olduğunda weblogic bunu anlayarak eski versiyonlu uygulamayı deaktif duruma getirecektir. Aynı anda, yeni versiyona sahip olan uygulama aktif olacak ve tüm yeni sesionlar da bu uygulamaya bağlanacaktır.

             Side-by-side deployment için weblogic consoleunu kullanacağız. Bu işlem aynı zamanda WLST (Weblogic Scriptting Tool) kullanılarak da yapılabilir.

1)      Ear, war veya  jar olarak iletilen uygulama dosyalarında META-INF/MANIFEST.MF dosyası içerisinde uygulamanın versiyonu daha önce developer tarafından yazılmış olabilir. Eğer yazılmamış olsa bile bu dosyada Weblogic-Application-Version:  Versiyon_adı  şeklinde yeni bir satır ekledikten sonra dosyayı kaydedip tekrar arşivleyebilirsiniz. Böylelikle versiyonlanmamış bir kod versiyonlu bir hale getirilmiş olur.

Aşağıdaki dosyada  4.1.4.4 versiyonuna sahip bir uygulama görebilirsiniz.




2)      Bilinen yöntemlerle bu uygulamanın deploymentı yapılır. Deploymenttan sonra uygulama aşağıdaki gibi görünür:
 
 
3)    4.1.6.4 versiyonlu uygulama aktif hale gelmiştir.  Bu uygulamanın çalışır halde kalmasını ve aynı zamanda da yeni versiyona sahip (örnek olarak 4.1.4.5 versiyonunu deploy edilecektir) aynı isimli bir uygulama deploy edilmek  isteniyorsa Lock & Edit butonuna  tıklayarak eski versiyonlu uygulama seçilip Update butonuna basılır.
4)    Çıkan ekranda Source Path kısmında yer alan bölümde Change Path diyerek daha önceden  yeni versiyonlu uygulamanın konulduğu dizin secilip o dizindeki uygulama aşağıdaki şekilde deploy edilir.

 

       
 
    

 
5)     Deployment tamamlandıktan sonra uygulamanın görünümü aşağıdaki şekilde olur. Eski versiyona sahip uygulama Active iken yeni versiyona sahip uygulama deploy initializing durumunda olur.
    
 
 
6)     Activate Changes dedikten sonra weblogic server eski versiyonlu uygulamaya ait sessionları keserek yeni versiyonlu uygulamaya bağlamaya başlar. Son durumda  yeni versiyonlu yük Active duruma geçmiş olur.  Eski versiyonlu  yükün Active dısında herhangi bir statüde kalmasının bir önemi yoktur.
   
 
NOT: Weblogic server maksimum 2 farklı versiyonu deploy etmenize izin verir. Örneğin 4.1.6.6 versiyonunu deploy etmek isterseniz hata alırsınız. Bu hatayı almamak için Active olmayan iki version önceye ait (4.1.4.4) uygulamayı secip silmeniz gerekmektedir.
 
Başarı bir yolculuktur, bir varış noktası değil.

                                                                                                                   Ben Sweetland
 

 

WebLogic Notifications - Alarm Konfigurasyonu

Weblogic JVM lerin monitör edilebilmesi için, bazı alarm mekanızmaları düzenlemek mümkündür. Düzenlenen alarmlar ile e-mail yoluyla haberdar olunması sağlanabilir.
Loglar içerisinde takip edilmesi gereken durumlar ile alakalı olarak bir “watch and notification” ayarlanarak, ilgili kontakların e-mail yoluyla bilgilendirilmesi sağlanabilir.

Email bilgilendirmesi temel 3 aşama ile gerçekleştirilebilir.


1 - Mail Session
2 - Diagnoistic Module
3 – Watch and Notification

Aşağıda; Bir JVM için failed durumuna geçmesi halinde alarm oluşturması örneği verilmiştir. Loglar da geçecek Message id: BEA-000362 okunduğu durumlarda e-mail alarmı oluşturulacaktır.


1 - Mail Session
 Domain > Services > Mail Sessions menülerinden New mail ayarları yapılır.


Name; Mail sessiona verilecek addır
JNDI Name; Diagnoistics Modüllerin erişimleri için kullandığı addır.
JavaMail Properties; e-mail konfigürasyonları için aşağıdaki bilgileri tamamlıyoruz.
    mail.from=deneme@company.com [ alarmların geleceği mail adresi ]
    mail.transport.protocol=smtp [sadece mail gönderimi yapılacağı için smtp ]
    mail.smtp.host= hostname [mail server hostname / ip]


Ardından Next denilerek sonraki adıma geçilir. Takip edilecek instancelar işaretlenererek, target işlemi tamamlanır.


2 – Diagnoistics Module


Konfigurasyonu yapılacak alarm mekanizmasını taşır. Burada dikkate alınacak husus, jvm lere target işlemi yapıldığı sırada, her modül için bir jvm işaretlenir. Yani bir jvm, iki veya daha fazla modül tarafından target olarak işaretlenemez.

Diagnostics > Diagnostics Modules menülerinden New denilerek Modul adı verilir.



3 – Watch and Notification


Oluşturulan Modülün üstüne tıklandıktan sonra Configuration > Watches and Notification tablarında yer alan sayfanın altında yer alan iki farklı Watches and Notifications tabları görülür.


Log Watches Severitiy kısmı loglarda takip edeceğimiz BEA-000362 Message ID sinin kritiklik seviyesidir ve loglardan görülebilir.


<Critical> <WebLogicServer> <BEA-000362> <Server failed. Reason: StartupMode is set to STANDBY. Server cannot start in STANDBY state without admin channel. Server will shutdown now.>

Notification Tabında iken New butonuna tıklandığında; sırasıyla Type SMTP(E-mail) seçilir ve Notification enable edilir.




Son adımda;
Mail Session Name; tanımladığımız mail session seçiyoruz,
E-mail recipients; iletilecek kontakları yazıyoruz,
E-mail Subject; Alarmın mailinin başlığı yazılır,
E-mail Body; Alarm mailinin gövdesi ayarlanır, statik olarak içeriğe müdahale edilemediğinden default seçeneği tercih edilir.
Konfigurasyon tamamlandıktan sonra finish denilerek, notification kısmı tamamlanmış olur.



Ardından, Watches tabında New butonuna basılır. Loglardan izleme yapılmasını istediğimiz için Watch Type; Server Log seçilir. Ardından enable edilir.

Add Expression den yeni kurallar eklenir. Eklenecek kuralları, or veya and ile çoklayabiliriz.

Burada Message id si ile alarm oluşturacağımızdan MSGID seçilir ve Run durumundan Failed e geçen JVM lerin loglarında görülen BEA-000362 log id si girilir. Örnek olarak alarm üretmek için loglarda sık görülen message id ile Watches and Notifications tabındaki severity değerleri değiştirebilirsiniz.





Sonraki adımda, mevcut durumun düzelmesi halinde reset alarmı atması sağlanır. Burada failed durumunda müdahale gerektiği için, reset alarmına ihtiyaç yoktur.




Ardından, Targets sekmesinden izlenecek JVM ler işaretlenir.




Statement Running den Failed durumuna düşmesi halinde aşağıdaki gibi bir e-mail iletilecektir.