Pokazywanie postów oznaczonych etykietą OpenESB. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą OpenESB. Pokaż wszystkie posty

sobota, lutego 06, 2010

Oracle Solaris

Nie podoba mi się, co Oracle zrobił z Sun-em. Jonathanowi Schwartzowi też się nie spodobało. Wycięli wszystkie projekty, na których nie da się zarobić dużej kasy. Nie skasowali OpenESB chyba tylko dlatego, że Oracle Fusion też używa JBI-a. Zamiast sympatycznych niebieskich stron jest teraz czarny z czerwonym. Kulturą korporacyjną Sun bardziej pasował do IBM-a (DeveloperWorks, AlphaWorks).

Forkować czy nie forkować Database-BC? Obecnie używam poprawionej w paru miejscach wersji w ServiceMix-ie. Sun nie dostał poprawionego kodu, bo zastopowali mnie na etapie Sun Contributors Agreement. Gdybym przekazał swoje poprawki, to OpenESB działałoby bez problemu z bazą Oracle na standardowym sterowniku Oracle. Nie jest to cel strategiczny Oracle Corporation. OpenESB działa ze sterownikiem DataDirect dostępnym w komercyjnym JCAPS-ie albo w wersji standalone za około 20 000 Euro z licencją na cztery rdzenie (z rocznym supportem).

Update 10.02: Oracle zwolnił ekspertów od usuability pracujących dla projektu Gnome. Największy wkład w rozwój Gnome-a mieli pracownicy Sun Microsystems (kto nie wierzy niech spojrzy w statystyki commitów).

sobota, stycznia 23, 2010

Database-bc z OpenESB w ServiceMix-ie

Z zainstalowanego OpenESB potrzebujemy następujące pliki, które umieścimy w katalogu smx3.3/lib/optional: commons-logging-1.1.jar, grizzly-1.0.17.jar, httpbc-ext.jar, javaee.jar, javaws-rt-2.1.2, saaj-impl-1.3.jar, sjsxp-1.0.jar, stax-ex-1.0.jar, streambuffer-0.4.jar.

Do hotdeploy wrzucimy databasebc.jar i httpbc.jar. Demo usługi jest tutaj.

W servicemix.xml dodajemy wpis import resource z classpath o nazwie ds.xml, a tam już definicję DataSource-a:

<bean id="oraEAIDataSource" class="oracle.jdbc.xdriver.OracleDataSource" destroy-method="close">  
<property name="driverType" value="thin"/>
<property name="networkProtocol" value="tcp"/>
<property name="serverName" value="localhost"/>
<property name="portNumber" value="1521"/>
<property name="serviceName" value="EAI"/>
<property name="user" value="soatest"/>
<property name="password" value="soatest"/>
<property name="connectionCachingEnabled" value="true"/>
</bean>

Trzeba pamiętać o dodaniu wpisu JNDI w jndi.xml.

Dlaczego DataSource pochodzi z Oracle XDrivera? Bo Sun w OpenESB nie wspiera oryginalnego sterownika oracle-owego i nie zamierza wspierać. Database-bc i komponenty design-time NetBeansa (dawny SOA Pack) napisane są tak celowo, żeby OpenESB nie nadawało się do zastosować profesjonalnych i nie próbowało konkurować z produktem Oracle Fusion. OpenESB ma niby otwarty kod, ale Sun nie chce poprawek przystosowujących darmowe ESB do działania z bazą Oracle.

Dokumentacja DBBC jest tutaj.

czwartek, stycznia 14, 2010

Oracle XDriver

  • See executed sql commands (also internal PreparedStatements of Oracle driver)
  • Cache statements and database metadata for better performance
  • Easy to switch solution: oracle.jdbc.xdriver.OracleDataSource
  • Lowers GlassFish ESB response time in Oracle operations up to 10x
  • Added metadata operations not supported by Oracle driver
  • DriverManager.getConnection("x:jdbc:oracle:@host:1521:SID")

piątek, stycznia 08, 2010

Analiza wydajności OpenESB

BPEL w OpenESB wcale nie jest taki wolny. Wołanie procedury NOOP w bazie powoduje, że są sprawdzane jej parametry poprzez oracle.jdbc.OracleDatabaseMetaData.getProcedureColumns, a to natomiast tworzy nowego PreparedStatement-a:

SELECT package_name AS procedure_cat, owner AS procedure_schem, object_name AS procedure_name, argument_name AS column_name,
DECODE(position, 0, 5, DECODE(in_out, 'IN', 1, 'OUT', 4, 'IN/OUT', 2, 0)) AS column_type,
DECODE (data_type, 'CHAR', 1, 'VARCHAR2', 12, 'NUMBER', 3, 'LONG', -1,
'DATE', 91, 'RAW', -3, 'LONG RAW', -4, 'TIMESTAMP', 93, 'TIMESTAMP WITH TIME ZONE', -101, 'TIMESTAMP WITH LOCAL TIME ZONE', -102, 'INTERVAL YEAR TO MONTH', -103,
'INTERVAL DAY TO SECOND', -104, 'BINARY_FLOAT', 100, 'BINAvRY_DOUBLE', 101,
1111) AS data_type,
DECODE(data_type, 'OBJECT', type_owner || '.' || type_name, data_type) AS type_name,
DECODE (data_precision, NULL, data_length, data_precision) AS precision,
data_length AS length, data_scale AS scale, 10 AS radix, 1 AS nullable,
NULL AS remarks, default_value AS column_def, NULL as sql_data_type,
NULL AS sql_datetime_sub, 
DECODE(data_type, 'CHAR', 32767, 'VARCHAR2', 32767, 'LONG', 32767, 'RAW', 32767, 'LONG RAW', 32767,
NULL) AS char_octet_length, (sequence - 1) AS ordinal_position,
'YES' AS is_nullable, NULL AS specific_name, sequence, overload,
default_value 
FROM all_arguments
WHERE owner LIKE :1 ESCAPE '/' AND object_name LIKE :2 ESCAPE '/' AND data_level = 0 
AND package_name LIKE :3 ESCAPE '/' "+
ORDER BY procedure_schem, procedure_name, overload, sequence

który jest strasznie wolny. Należy to wsadzić w cache (org.glassfish.openesb.databasebc.JDBCDenormalizer.populateProcedure):

private static HashMap<String,List<ProcMetaData>> procMetaDataCache = new HashMap<String,List<ProcMetaData>>();
String key = "pcatalog="+pcatalog+",pschema="+pschema+",procName="+procName;
List<ProcMetaData> pmdList = procMetaDataCache.get(key);
if (pmdList==null) {
try
{ pmdList = new LinkedList<ProcMetaData>();
rs = dbmeta.getProcedureColumns(pcatalog, pschema, procName, "%");
while (rs.next()) {
String columnName = rs.getString("COLUMN_NAME");
if(columnName.charAt(0) == '@')
columnName = columnName.substring(1);
int targetSqlType = rs.getInt("DATA_TYPE");
int colType = rs.getShort("COLUMN_TYPE");
String type_Name = rs.getString("TYPE_NAME");
short numericScale = rs.getShort("SCALE");
ProcMetaData pmd = new ProcMetaData(columnName, targetSqlType, colType, type_Name, numericScale);
pmdList.add(pmd);
}
procMetaDataCache.put(key, pmdList); // no sync since it would be difficult or could hurt performance
rs.close();
}

Teraz mamy 22 ms! Quick and dirty fix is here.

czwartek, grudnia 31, 2009

Benchmarki z wirtualizacją

Platforma integracyjna wystawia WebService opakowujący select i procedurę noop na bazie Oracle. System fizyczny to 64-bitowy Windows 2008 R2 na dwurdzeniowym procesorze AMD 2,3GHz + Oracle 11g, 4GB RAM-u, windowsowy RAID0 na dwóch Seagate-ach. System wirtualny ma jeden wirtualny procesor i 2GB RAM-u. Platforma A to Sun GlassFish ESB 2.1, platforma B to MS BizTalk 2009. Pomiar za pomocą SOAP-UI dla jednego wątku w ciągu 60 sekund, czas w milisekundach.


VMware dla 32-bitowych gości używa binarnej translacji (BT). Średni czas systemu out-of-box to 2344 ms. Po zmianie parametru MaxReceiveInterval z 500 na 50 mamy 1066 ms (tuning Low Latency wg dokumentacji producenta). Przeniesienie redo logu bazy danych obsługującej platformę na inny dysk daje przyśpieszenie 17ms.




32-bitowy Windows (binarna translacja) ma podobną wydajność co 64-bitowy OpenSolaris (sprzętowa wirtualizacja) - około 10% narzutu na wirtualizację. VirtualBox wypada słabo - strata wynosi ponad 20%. JRockit jak zwykle wymiata, podmieniając Javę na wirtualizowanym Windowsie dostajemy -6%.

A teraz sprawdzimy 32-bitowe OpenSUSE 11.2 z kernelem 2.6.31 z obsługą VMI, system jest na XFS-ie z opcją noatime i z JRockit-em 6.0.


Wirtualka jest szybsza od rzeczywistej dwurdzeniowej konfiguracji! 350ms. W trybie BT 415ms.

Swoją drogą ten sam select w zwykłym kodzie Javy trwa odpowiednio 3 / 15/ 80 ms (w zależności czy PreparedStatement i Connection są reużywalne). Gdybym chciał mieć coś szybkiego i za darmo i z orkiestracją to wziąłbym Grailsy i zrobił w nich Service-y. Serwisy wewnętrznie można wołać natywnie, a zewnętrznie wystawić po SOAP-ie i JMS-ie.

środa, grudnia 23, 2009

GlassFish na produkcji

Po zainstalowaniu GlassFish działa na ustawieniach odpowiednich do dewelopmentu. Przed wypuszczeniem go na produkcję, gdzie oczekuje się od niego pewnej wydajności, trzeba pozmieniać parę rzeczy.









sobota, grudnia 05, 2009

OpenESB revisited

We're going to create simple transactional process inserting data into tables of two XA data sources. Let's create design time JDBC connections.


The type of Database Service Engine operation is table. Here we can see generated artifacts.


Now, we have to remember that this configuration has been generated using design time JDBC connection. To use it with runtime we need to change JNDI location of database.


Presented BPEL process on the left side has got PartnerLink connected with generated by us abstract WSDL (its name should match process name). On the right side there are Partner Links from mssql1 and mssql2 bindings. The process is transactional.




To see input and output port of BPEL JBI module we have to rebuild Composite App.


We can add different bindings to our BPEL orchestration (SOAP, JMS, WCF, Quart Scheduler ...).




After JDBC data source setup and app deployment, we can check that our composite app works fine.


Having modified db schema for table tab1 in second data source we can se that new data is not inserted to tab1 in first data source - our BPEL process is transactional.

niedziela, czerwca 14, 2009

OpenESB nightly build

Sun schował je tutaj:
http://download.java.net/jbi/binaries/open-esb-full-install/v2.1/nightly/latest/
http://download.java.net/jbi/binaries/glassfishesb/v2.1/nightly/latest/

[2009-10-11] http://download.java.net/jbi/binaries/installers/single-component/v2.1/nightly/

wtorek, kwietnia 21, 2009

Sun Fuji Milestone 5

Lekkie ESB techniczne (czyli w zasadzie sama warstwa routingu), w którym przepływy można wyklikać w przeglądarce. Do dyspozycji są adaptery: bazodanowy, http, jms, rss, ftp, email. Proste transformacje komunikatu mogą być dokonowywane przez węzły serwisowe JRuby.



Kiedy kontrolka JDBC będzie obsługiwać Oracle'a, będzie można zacząć myśleć o praktycznych zastosowaniach.

wtorek, marca 24, 2009

Uściślijmy pojęcia

Service Oriented Architecture - architektura zorientowana na usługi. Wzorzec architektoniczny/projektowy, który zakłada, że mamy zestaw atomowych (realizujących minimalną niepodzielną funkcjonalność) serwisów, na podstawie których budujemy dalsze serwisy wyższego poziomu (Composite Applications). W pewnym momencie (kiedy mamy już wystarczającą ilość atomowych serwisów) możemy za pomocą paru kliknięć tworzyć nowe serwisy kompozytowe realizujące nową funkcjonalność biznesową. Dzięki dobrze zaprojektowanej i wdrożonej architekturze SOA firma może być agilna (Enterprise 2.0). SOA nie da się kupić (samo kupienie platformy integracyjnej nie jest kupieniem SOA), SOA trzeba zaprojektować. Można mieć platformę integracyjną i źle zaprojektowane środowisko i w rezultacie nie mieć SOA. Pomocą w implementacji SOA może być ESB.

ESB - Kolejny koncept/wzorzec architektoniczny/projektowy, który mówi, że do platformy integracyjnej za pomocą rozmaitych adapterów/klientów może podłączyć się dowolny system i platforma może podłączyć się do dowolnego systemu, natomiast usługi wewnątrz platformy (szyny) używają komunikacji natywnej (historycznie jest to JMS). Usługi wewnątrz platformy integracyjnej są niezależne od transportu. ESB ustandaryzował Sun wprowadzając JBI i wydzielając:
  • Service Engine (usługa typu adapterowego udostępniana przez oprogramowanie ESB)
  • Binding Component (usługa tłumacząca dane między różnymi transportami/formatami z którą komunikuje się Normalized Message Router).
ESB przydaje się w heterogenicznych środowiskach, w których naprawdę mamy wiele różnych systemów i technologii (Oracle, MSSQL, EJB, JMS, WS). ESB to nie SOA (ESB może być tylko sposobem na wdrożenie SOA).

niedziela, marca 22, 2009

OpenESB może działać ze sterownikami JDBC Oracle

Trzeba tylko nad tym trochę posiedzieć. Działa generacja WSDL-i dla operacji select, insert, update, delete, wywołania funkcji {? = call funkcja}.



A nie naprawili tego tylko dlatego, że w JCAPSie mają oemowy sterownik DataDirect.

piątek, czerwca 27, 2008

Glassfish + Oracle... JDBC

czwartek, czerwca 26, 2008

SQL Module in details

It is quite OK to put user and pass in connection string. For SQL Module the connection string should be exactly the same as in Servers tab. Before generating WSDL you should call SQL probably with some given parameter (that is replace ? or :1 with some real values). When you see that query works do the right job.



For my example I have created nasty SQL function returning clob with XML inside.



As you can see the result from WebService doesn't look like real business function.
Let's try to fix it. First, create XSD schema for the output coming from DB.



Looking at the WebService WSDL we can see address for SQL-Engine handling our DB function.



To fix beauty (or the lack of) of our WebService BPEL Module will be needed.



From the left there is Partner Link from more business friendly WSDL (that we created on the side), some magic inside, and Partner Link for SQL-Engine WSDL.

First obvious action - pass input of left Partner Link to SQL-Engine and Invoke it.



That was easy, but what's up with mangled XML string? We need to get some real XML nodes from it. OK, create variable of type covered by schema generated from db output.



Do unmarshall on XML string (output of operation might require manual edition of BPEL's source: from and to parameters - if drag-and-drop doesn't work; probably NetBeans sees foreign namespace 'http://sys.one.pl/db1' of XSD schema and refuses to use it).



Now we have XML tree and can take some data from it and put into 'beatifull' WS result.



Let's drop in BPEL module into CompositeApp and make connections. Here it is:



CompositeApp with 2 WebServices: one beautifull and one ugly.

We can see business accepted output in test of 2nd WS.





To sum up:
  • SQL module for wrapping SQL command

  • EnterpriseApp for deploying JDBC connections

  • WebApp for nothing (EnterpriseApp cannot be empty and needs to have WebApp at least)

  • BPEL module for transforming ugly WS (SQL-Engine based) into beautifull WS

  • CompositeApp for hosting and linking modules

Oracle Connection for Glassfish

It can be easilly created from NetBeans. All you need to do is new EnterpriseApplication (with some content, for example with WebApp as the wizard suggests). Then is Server Resources you can add JDBC Connection Pool and JDBC Resource. Deploy ear and you will have Oracle Connection on your Glassfish.

NetBeans SOA with Oracle

NetBeans is the default IDE for OpenESB platform and uses SOA Pack common with Sun JCAPS. JCAPS comes with DataDirect OEM JDBC driver for Oracle and somehow NetBeans doesn't fully support Oracle JDBC driver - it can't generate WSDL file for SQL Module operations. I have fixed this limitation and you can download SQL Module supporting Oracle JDBC driver from NetBeans Bugzilla.


Here you can see bug report. While generating WSDL for database operation SQL Module tries to get some description of parameters used in prepared statement. However Oracle JDBC driver doesn't have this information until after the statement is executed. As a result in NetBeans messages.log you can see:

java.sql.SQLException: Handle does not exist: getMetaDataorg.netbeans.modules.sql.project.dbmodel.DBMetaData.getPrepStmtResultSetColumns

From NetBeans Bugzilla you can get patch. NetBeans SOA Pack sources are available at hg.netbeans.org (there is mercurial package for Unices and TortoiseHg for Windows). You can do patching yourself or download fixed jar file. But...

if you download new OpenESB build every two weeks the jar file will probably have wrong version number of module. Unpack jar and fix it inside MANIFEST file.

Here is some Oracle function created few posts ago.

Let's try to generate WSDL for it.

OK, it probably worked. Now create new CompositeApplication, drop inside SQL Module, call 'Clean and Build'...

... add SOAP port, deploy CompositeApp...

and run Test Cases...

(remeber to set port for SOAP endpoint)

You should have now WebService for you DB operation.

czwartek, czerwca 19, 2008

Jak zrobić żeby beowy driver oracle-owy (DataDirect-a) działał z czymkolwiek

Są do tego 3 jary: wloracle.jar, wlbase.jar, wlutil.jar. Rozpakowujemy tego drugiego, wchodzimy do wlbase\weblogic\jdbc\base\connectjdbc.properties i tam pozostawiamy
applicationKey=class\:java.lang.Object

weblogic.jdbc.oracle.OracleDriver wloracle_drv = new OracleDriver();
Connection conn = null;
conn = DriverManager.getConnection("jdbc:bea:oracle://127.0.0.1:1521;SID=ORA", "user", "pass");

poniedziałek, maja 26, 2008

Podpięcie OpenESB pod SMF