Oracle APPS JAVA Eş Zamanlı Programı İle Web Service Client
Merhaba,
Oracle EBS için tanımladığımız eş zamanlı programların çoğunluğu PL/SQL program veya Reports olmaktadır. Ancak PL/SQL ile geliştirmenin yetersiz kaldığı veya zahmet gerektirdiği geliştirmeleri Java yardımı ile yapabilme imkanına sahibiz.
Bu tür ihtiyaçlara aşağıdaki örnekler verilebilir;
- SFTP gerektiren geliştirmeler
- JAX-WS kullanarak Web Service Client geliştirmeleri
- SQL sonuçlarından XLSX uzantılı Excel dosyaları üretme geliştirmeleri
- Reports uygulamasından bağımsız PDF üretimleri
- Hesaplama gerektiren iş mantıkları
Bu yazıda Oracle EBS için dış API’ler kullanarak Java eş zamanlı program geliştirmesi ve tanımlama yöntemini anlatacağım.
Başlamadan önce ilk defa yapacaklar için bu işin hem tanımlama hem de geliştirme kısmının PL/SQL eş zamalı programlara göre çok daha fazla efor ve dikkat gerektireceğini belirteyim.
Not: Ben geliştirme için JAX-WS(web service client) gereksiniminden dolayı Netbeans kullandım. JDeveloper’ın ERP PATCH’lerinden çıkan versyonlarında bildiğim kadarıyla JAX-WS Client Servis üretemiyoruz..Netbeans kullanmanın tek handikapı Java Concurrent Program oluşturmak için gereken ERP CLASS’ları sunucudan çekilmelidir. Bu oldukça basit bir işlemdir ve bizi JDeveloper’da kod yazmaktan kurtarır.
1. Geliştirme süresince kullanılacak dış kaynakların hepsini derli toplu tutmak için Windows’ta uygun bir dizin altına “libs” isminde bir adet klasör oluşturuyoruz.
2. EBS uygulama sunucusuna bağlanıp $JAVA_TOP/oracle/apps/fnd altında bulunan “common”, “cp”, “util” klasörlerini FTP yardımıyla 1.adımda oluşturduğumuz “libs” klasörüne aynı dizinde olacak şekilde indiriyoruz.
3. EBS uygulama sunucusuna ssh programı ile bağlanıp java versyonunu aşağıdaki komut ile buluyoruz.
1 2 3 4 5 6 7 |
[appldemo@demo classes]$ java -version java version "1.6.0_10" Java(TM) SE Runtime Environment (build 1.6.0_10-b33) Java HotSpot(TM) Server VM (build 11.0-b15, mixed mode) [appldemo@demo classes]$ |
4. İlgili JAVA versyonunun doğru işletim sistemine ait olan SDK dosyasını Oracle sitesinden indirip, bilgisayara kurulum yapıyoruz.
5. Netbeans 7.4 açılır ve New Project ile yeni proje oluşturma sihirbazı açılır ve Java Application seçilir.
6. Proje adına uygun XX ile başlayan bir isim verilir. Create Main Class checki kaldırılır.
7. Proje oluşturulduktan sonra, projeye sağ tıklayıp New Java Class ile yeni JAVA dosyası oluşturma sihirbazı açılır. Java Class’ının adı ve paketi xx ile başlayacak şekilde belirlenir.
8. Java Class’ı oluşturulduktan sonra, projeye sağ tıklanır ve proje özellikleri açılır. Sol menüden Libaries kısmına geçilir.Compile tabı altında bulunan “Add Jar/Folder” butonuna tıklanır.
9. Açılan pencerede 1.adımda oluşturduğumuz “libs” klasörünü seçiyoruz.
10. Bu adımda 7.adımda oluşturduğumu JAVA dosyasını açılır ve oluşturduğumuz JAVA sınıfının JavaConcurrentProgram Interface’ni IMPLEMENT etmesi sağlanır. Bu noktada eğer 9.adımı doğru yapmışsanız, bu INTEFACE için import komutunun Netbeans tarafından çıkarılması gerekiyor.
11. INTERFACE Implement edildikten sonra bütün abstract methodların overwrite edilmesi gerekmektedir. (Zaten 1 method vardır) Bunun için de Netbeans üzerinden otomatik yapabiliriz.
12. Görüldüğü üzere aşağıdaki fonksiyon overwrite olmuş durumdadır. İçinde yer alan throw satırını siliniz.
1 2 3 4 5 |
@Override public void runProgram(CpContext cc) { } |
Fonksiyonun sahip olduğu parametre CpContext bize ConcurrentProgramContext objesini vermektedir. Bütün eş zamanlı işlemleri bu obje üzerinden yapılır. Ayrıca veritabanı ile iletişim kurulması isteniyorsa aşağıdaki yöntem ile bağlantıya erişebilirsiniz. Ayrıca jdbc bağlantısı tanımlamanıza gerek yoktur.
1 2 3 |
cc.getJDBCConnection() |
Yine Login olunan kullanıcı, sorumluluk gibi bilgilere de bu obje içerisinden ulaşılabilinir.
13. Bu aşamada Netbeans üzerinde Web Service Client oluşturabilmek için plugin’lerin yüklenmesi gerekmektedir. Bunun için aşağıdaki 3 adımı uygulayınız.
14. Pluginler sorunsuz yüklendikten sonra Netbeans üzerinde yeni bir proje oluşturulur ve proje oluşturma sihirbazından Java Class Libary seçilir. Next ile devam edilir.
15. İkinci adımda projeye yine XX ile başlayan bir isim verilir ve proje oluşturulur.
16. Yeni oluşturulan projeye sağ tıklanır, proje özellikleri açılır. Sol menüden Libaries bölümüne geçiş yapılır ve derleme platformu olarak 4. adımda kurduğumuz JAVA SDK’sı seçilir. Bu adım derlenmiş JAR’ı içeri atacağımız için çok ama çok önemlidir.
17. Yeni yaratılan projeye sağ tıklanır ve New -> Web Service Client seçilir.
18. Bu noktada örnek bir web servis seçilmesi gerekmektedir. Ben bu örnekte internet üzerinde bulduğum 4 işlem yapan calculator.wsdl web servisini kullandım. İlgili wsdl dosyasını indirmek için;
http://soatest.parasoft.com/calculator.wsdl
19. New Web Service Client oluşturma penceresinde WSDL dosyanız nerede ise o dizini gösteriniz. Web üzerinden URL WSDL da gösterebilirsiniz. Paketinizi de xx ile başlayan uygun bir şekilde yazınız. Finish denilince Netbeans bizim için WSDL’ı parse edip gerekli JAVA dosyalarını ve methodlarını oluşturacaktır.
20. WSDL oluşturma işlemi tamamlandıktan sonra yeni projeye bir adet Java Class’ı oluşturunuz.
21. Class bilgilerini aşağıdaki gibi değiştiriniz ve Finish ile oluşturulur.
21. Class’ınızın içine Web Service References -> calculator ->Calculator -> ICalculator altında yer alan add, divide, multiply, subtract Web Service operasyonlarını sürükleyip bırakınız. Netbeans sizin için fonksiyonları oluşturacaktır.
22. Sürükleyip bırakarak oluşturulan fonksiyonlar servis fonksiyonlarıdır dolayısıyla private durumdadırlar. Bunları çağırabileceğimiz 4 adet yeni public fonksiyonlar oluşturuyoruz. Son durumda;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package xx.calculator; /** * * @author Anil */ public class XXCalculator { public float callAdd(float x, float y) { return add(x, y); } public float callDivide(float x, float y) { return divide(x, y); } public float callMultiply(float x, float y) { return multiply(x, y); } public float callSubtract(float x, float y) { return subtract(x, y); } private static float add(float x, float y) { xx.calculator.Calculator service = new xx.calculator.Calculator(); xx.calculator.ICalculator port = service.getICalculator(); return port.add(x, y); } private static float divide(float numerator, float denominator) { xx.calculator.Calculator service = new xx.calculator.Calculator(); xx.calculator.ICalculator port = service.getICalculator(); return port.divide(numerator, denominator); } private static float multiply(float x, float y) { xx.calculator.Calculator service = new xx.calculator.Calculator(); xx.calculator.ICalculator port = service.getICalculator(); return port.multiply(x, y); } private static float subtract(float x, float y) { xx.calculator.Calculator service = new xx.calculator.Calculator(); xx.calculator.ICalculator port = service.getICalculator(); return port.subtract(x, y); } } |
23. Yeni oluşturduğunuz Libary projesine sağ tıklayıp “Clean and Build” yapınız. Böylece jar dosyaınız oluşacaktır ve başka projelerde kullanıma hazır hale gelecektir.
24. Bu oluşan yeni jar dosyasını (C:\Users\Anil\Documents\NetBeansProjects\XXAnilWsClient\dist\XXAnilWsClient.jar) 1.adımda yarattığımız “libs” klasörü altına kopyalanır.
25. İlk projeye geri dönüyoruz ve projeye sağ tıklayı proje özelliklerini açılır.
26. Sol menüden Libaries kısmına geçiş yapıyoruz ve tekrar “Add JAR/Folder” butonuna tıklanır.
27. 25. adımda “libs” altına kopyaladığımız jar dosyasını seçiyoruz ve projeye eklenir.
28. İlk projede oluşturduğumuz runProgram fonksiyonunun olduğu Java dosyası aşağıdaki gibi düzenlenir. 68. satıra dikkat ediniz. Bir önceki adımda eklediğimiz jar dosyasından o satırda fayda sağlanır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package xxntc.javaconcrpg; import oracle.apps.fnd.cp.request.CpContext; import oracle.apps.fnd.cp.request.JavaConcurrentProgram; import oracle.apps.fnd.cp.request.LogFile; import oracle.apps.fnd.cp.request.OutFile; import oracle.apps.fnd.cp.request.ReqCompletion; import oracle.apps.fnd.util.NameValueType; import oracle.apps.fnd.util.ParameterList; import xx.calculator.XXCalculator; /** * * @author Anil */ public class XXAnilWsClient implements JavaConcurrentProgram { OutFile output; LogFile logFile; @Override public void runProgram(CpContext cc) { // output ve log set edilir output = cc.getOutFile(); logFile = cc.getLogFile(); boolean hataVar = false; boolean divideByZero = false; float pSayi1 = 0; float pSayi2 = 0; float addSonuc = 0; float divideSonuc = 0; float multiplySonuc = 0; float subtractSonuc = 0; //parametreleri al ParameterList params = cc.getParameterList(); while (params.hasMoreElements()) { NameValueType ntv = params.nextParameter(); if ("P_SAYI1".equals(ntv.getName())) { pSayi1 = Float.parseFloat(ntv.getValue()); output.writeln(ntv.getName() + ":" + ntv.getValue()); } else if ("P_SAYI2".equals(ntv.getName())) { pSayi2 = Float.parseFloat(ntv.getValue()); output.writeln(ntv.getName() + ":" + ntv.getValue()); } else { logFile.writeln("Beklenmeyen Parametre!", LogFile.ERROR); hataVar = true; break; } } if (hataVar) { cc.getReqCompletion().setCompletion(ReqCompletion.ERROR, "Hata"); } else { // eklenen jar dosyası XXCalculator calc = new XXCalculator(); addSonuc = calc.callAdd(pSayi1, pSayi2); if (pSayi2 == 0) { logFile.writeln("2. parametre 0 oldugu icin bolme islemi atlandi.", LogFile.EXCEPTION); divideByZero = true; cc.getReqCompletion().setCompletion(ReqCompletion.WARNING, "Uyari"); } else { divideSonuc = calc.callDivide(pSayi1, pSayi2); } multiplySonuc = calc.callMultiply(pSayi1, pSayi2); subtractSonuc = calc.callSubtract(pSayi1, pSayi2); output.writeln(pSayi1 + " + " + pSayi2 + " = " + addSonuc); output.writeln(pSayi1 + " / " + pSayi2 + " = " + divideSonuc); output.writeln(pSayi1 + " * " + pSayi2 + " = " + multiplySonuc); output.writeln(pSayi1 + " - " + pSayi2 + " = " + subtractSonuc); if (!divideByZero) { cc.getReqCompletion().setCompletion(ReqCompletion.NORMAL, "Tamam"); } } } } |
29. Bu kodlama tarafı bittikten sonra java dosyası EBS Uygulama sunucusunda $JAVA_TOP altında atılır ve oluşturduğumuz external jar dosyası da “xx..” altında uygun bir dizine atılır ve aşağıdaki komut ile derlenir. Komut classpath komutu kullanarak external jar dosyası ile beraber derleme yapar. Dizinlere dikkat ederek derleme yapınız aksi takdirde NoClassDef hatası alırsınız.
1 2 3 |
javac -cp .:xxntc/externallibs/* -d $JAVA_TOP XXAnilWsClient.java |
Bu komut java dosyanızın paket yoluna bakarak .class uzantılı dosyanızı -d komutu ile paketinizin olduğu dizinde oluşturur.
30. Bu aşamada java yürütülür dosyası ERP içerisinde tanımlanır. Çalıştırma dosyası adı java dosyanızın adı olmalı ve de yürütme dosyası dizin yolu da java dosyanızın paket yolu olmalıdır.
31. Yürütülür dosya oluşturulduktan sonra Eş zamanlı program oluşturulur. Ancak dikkat edilmesi gereken en önemli noktalardan birisi eş zamanlı program tanımlarken SEÇENEKLER (OPTIONS) kısmına doğru classpath’lerin verilmesi gerekliliğidir.
Burada 3 dizine dikkat ediniz;
- JAVA_TOP dizini -> /u01/data_appl/apps/apps_st/comn/java/classes
- appsborg.zip dosyasının bulunduğu dizin -> /u01/data_appl/apps/apps_st/comn/java/lib/appsborg.zip
- Kendi external jar dosyalarınız -> /u01/data_appl/apps/apps_st/comn/java/classes/xxntc/externallibs/*
Aşağıdaki komutu SEÇENEKLER kısmına yazıyoruz.
-classpath /u01/data_appl/apps/apps_st/comn/java/classes:/u01/data_appl/apps/apps_st/comn/java/lib/appsborg.zip:/u01/data_appl/apps/apps_st/comn/java/classes/xxntc/externallibs/*
32. Programın parametreleri de tanımlanır.
33. Program çalıştırılmak istenen talep grubuna atılır.
34. İlgili sorumluluktan program parametreler düzgünce verilerek çalıştırılır.
Ve Sonuç:
Umarım faydalı bir yazı olmuştur 🙂
Harbi faydalı yazı ! Direk kopyaladım Anıl Bey
Teşekkür ederim Kerem Bey 🙂