W ramach wolnego czasu udało mi się przebrnąć przez stosunkowo ciekawą publikację z wydawnictwa Packt Publishing Apache Axis2 Web Services, 2nd Edition.
Właściwie, to książkę przeczytałem około miesiąca temu, ale zaaferowany nowymi publikacjami o OSGi, nie mogłem zebrać się do spisania recencji. W końcu jednak postanowiłem zakończyć przeciągające się zadanie i wszystko inne odrzuciłem na bok, aby tylko dobrnąć do tego momentu, kiedy to szczęśliwy zakończenia zadania i pełen wiedzy o rozwiązaniu Apache Axis2 i jego środowisku, mogę pochwalić się moją nowiutką recenzją książki.
Zainteresowanych lekturą recenzji zapraszam do Book review: Apache Axis2 Web Services, 2nd Edition. W duchu łączenia wielu zadań na raz (w tym przypadku lektury książki o Axis2 i nauki angielskiego) udało mi się wkomponować kilka ciekawych zwrotów angielskojęzycznych dla urozmaicenia niekoniecznie zajmującej czynności.
Dodatkowo, jeśli ktokolwiek jest zainteresowany lekturą tej książki, wystarczy mnie o tym poinformować, a książka powędruje do zainteresowanego. Z przyjemnością zamienię słowo z czytelnikami, celem wymiany doświadczeń, czy to związanymi bezpośrednio z samym procesem czytania książki, czy jej zawartości. Chętnie pomogę w napisaniu recenzji, za którą można otrzymać kolejną książkę. I tak do całkowitego wypełnienia całego wolnego czasu :-)
Pokazywanie postów oznaczonych etykietą web services. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą web services. Pokaż wszystkie posty
19 czerwca 2011
01 maja 2011
Testowanie JAX-WS Web Services z Apache CXF i JUnit
W trakcie lektury Apache CXF Web Service Development wpadłem na pomysł, aby sprawdzić możliwość testowania usług sieciowych (ang. web services) bez konieczności uruchamiania samodzielnego, zewnętrznego w stosunku do testu, serwera lub kontenera webowego.
Zadanie okazało się banalnie proste z Apache CXF (i wbudowanym Jetty), a całe przedsięwzięcie opublikowałem w postaci artykułu pro publico bono (licząc jednak na odzew w postaci komentarzy i usprawnień, co pozwoliłoby mi dalej zgłębiać temat przydatnośći CXF). Zainteresowanych krótką lekturą zapraszam do Testowanie JAX-WS Web Services z Apache CXF i JUnit. Uwagi i pytania mile widziane.
Kontynuuję lekturę książki "Apache CXF Web Service Development" i po 5-tym rozdziale uważam ją nie tylko za doskonałą o Apache CXF (de facto są dwie i z niecierpliwością czekam na kolejną - Developing Web Services with Apache CXF and Axis2 (3rd Edition)), ale również wspaniale przedstawiającą temat, który porusza. Po kilku ostatnio przeczytanych książkach, ta dopasowała się do moich potrzeb wyśmienicie. Ale o tym już w samej recenzji. Niebawem...
Przypominam, że również niebawem będziemy mogli doskonalić swój warsztat programistyczno-architektoniczny w nadchodzącej konferencji grupy Warszawa JUG - Confitura 2011. Niektórym będzie również dane doskonalić warsztat prelegenta - tylko do 8.05 trwa zbieranie tematów prezentacji. Po moim ostatnim apelu pojawili się nowi prelegenci w osobach Moniki, Bartosza i Marcina, co przy wcześniej już zgłoszonych 7 prelegentach daje całkiem pokaźne spektrum wiedzy do wchłonięcia. Zachęcam do zgłaszania tematów prezentacji, a temat związany z Apache CXF miałby moje pełne poparcie. Chętnie pomogę w jej przygotowaniu, a nawet wręcz jej poprowadzeniu (!) Najważniejsze, aby spróbować, bo na Confiturze można liczyć na bardzo życzliwą publikę (śmiem twierdzić, że próba zagięcia prelegenta nie miała w ogóle miejsca). Po prezentacji odznaka eksperta jest już tylko kwestią czasu, a ślad podjęcia wysiłku zostaje na całe lata (mówi się, że Google nic nie zapomina). Zgłoś swój temat już dzisiaj!
Zadanie okazało się banalnie proste z Apache CXF (i wbudowanym Jetty), a całe przedsięwzięcie opublikowałem w postaci artykułu pro publico bono (licząc jednak na odzew w postaci komentarzy i usprawnień, co pozwoliłoby mi dalej zgłębiać temat przydatnośći CXF). Zainteresowanych krótką lekturą zapraszam do Testowanie JAX-WS Web Services z Apache CXF i JUnit. Uwagi i pytania mile widziane.
Kontynuuję lekturę książki "Apache CXF Web Service Development" i po 5-tym rozdziale uważam ją nie tylko za doskonałą o Apache CXF (de facto są dwie i z niecierpliwością czekam na kolejną - Developing Web Services with Apache CXF and Axis2 (3rd Edition)), ale również wspaniale przedstawiającą temat, który porusza. Po kilku ostatnio przeczytanych książkach, ta dopasowała się do moich potrzeb wyśmienicie. Ale o tym już w samej recenzji. Niebawem...
Przypominam, że również niebawem będziemy mogli doskonalić swój warsztat programistyczno-architektoniczny w nadchodzącej konferencji grupy Warszawa JUG - Confitura 2011. Niektórym będzie również dane doskonalić warsztat prelegenta - tylko do 8.05 trwa zbieranie tematów prezentacji. Po moim ostatnim apelu pojawili się nowi prelegenci w osobach Moniki, Bartosza i Marcina, co przy wcześniej już zgłoszonych 7 prelegentach daje całkiem pokaźne spektrum wiedzy do wchłonięcia. Zachęcam do zgłaszania tematów prezentacji, a temat związany z Apache CXF miałby moje pełne poparcie. Chętnie pomogę w jej przygotowaniu, a nawet wręcz jej poprowadzeniu (!) Najważniejsze, aby spróbować, bo na Confiturze można liczyć na bardzo życzliwą publikę (śmiem twierdzić, że próba zagięcia prelegenta nie miała w ogóle miejsca). Po prezentacji odznaka eksperta jest już tylko kwestią czasu, a ślad podjęcia wysiłku zostaje na całe lata (mówi się, że Google nic nie zapomina). Zgłoś swój temat już dzisiaj!
17 sierpnia 2010
Book review: RESTful Java Web Services
Właśnie opublikowałem najnowszą recenzję książki RESTful Java Web Services Jose Sandoval z Packt - Book review: RESTful Java Web Services.
Miałem duże nadzieje związane z lekturą tej książki, która miała sprawić, że bez wahania będę mógł się mienić mianem znawcy tematu Web Services, ale z przykrością muszę stwierdzić, że coraz bardziej skłaniam się ku opinii, że Packt wypuszcza książki, których wartość marytoryczna jest, powiedzmy, średnia ze wskazaniem na słaba. Nie liczyłem liczby książek z Packt, które przeczytałem, ale ta pozycja zdecydowanie potwierdza tę prawidłowość. Dużo powtórzeń, kod źródłowy niezwykle trywialny, a w dodatku autor pozwala sobie na jego opis i to w różnych częściach książki powtórzony kilkukrotnie. Zdecydowanie za mało przy tytule, który mógłby wskazywać, że mamy do czynienia z encyklopedią na temat javowych usług sieciowych pisanych zgodnie z zasadami REST. Jako wprowadzenie może być, ale szkoda czasu na jej czytanie od deski do deski - wystarczy przeskoczyć do odpowiednich rozdziałów, które w danej chwili są interesujące. Jakby na pocieszenie, dzięki książce miałem po raz pierwszy możliwość posmakowania prostoty db4o. Niewiele, ale wystarczyło, aby przekonać się o jego walorach i sensowności użycia w projektach. Na pewno nie zapomnę o db4o przy nadarzającej się okazji jego wprowadzenia do projektu.
Zainteresowani całościowym spojrzeniem na wartość merytoryczną książki zapraszam do lektury mojej recenzji Book review: RESTful Java Web Services.
Kolejną książką, za którą się zabrałem, jest Practical Clojure. Muszę przyznać, że pierwszy rozdział zrobił na mnie ogromne wrażenie prostotą omawiania koncepcji, które stoją u podstaw Clojure. Bardzo zapadło mi w pamięci wyjaśnienie, dlaczego tak istotne jest, aby utrzymać niezmienność struktur danych, nawet tam, gdzie wydawałoby się, że jest nieprzystającą do problemu. Przykład z cyfrą 3, której zwiększenie o 1, to utworzenie nowej kopii z wartością 4 przemówił mi do rozsądku :) W końcu tak samo jest z bardziej złożonymi strukturami, które wbrew wspomnianej oczywistości z 3, traktujemy specjalniej i dodanie elementu niewielu wskazuje na *konieczność* utworzenia struktury-kopii z nowym nabytkiem. Wydaje się zbyt kosztowną operacją?! Proszę o argumenty popierające to myślenie? Chętnie wysłucham (a książka posłuży mi jako moje źródło odpowiedzi).
Czy u Ciebie również daje się odczuć potrzebę poznania języka funkcyjnego bardziej dokładnie i praktyczniej? U mnie zaczyna być widać objawy chorobowe przechodzące w uzależnienie. Czego i Tobie życzę! :)
Miałem duże nadzieje związane z lekturą tej książki, która miała sprawić, że bez wahania będę mógł się mienić mianem znawcy tematu Web Services, ale z przykrością muszę stwierdzić, że coraz bardziej skłaniam się ku opinii, że Packt wypuszcza książki, których wartość marytoryczna jest, powiedzmy, średnia ze wskazaniem na słaba. Nie liczyłem liczby książek z Packt, które przeczytałem, ale ta pozycja zdecydowanie potwierdza tę prawidłowość. Dużo powtórzeń, kod źródłowy niezwykle trywialny, a w dodatku autor pozwala sobie na jego opis i to w różnych częściach książki powtórzony kilkukrotnie. Zdecydowanie za mało przy tytule, który mógłby wskazywać, że mamy do czynienia z encyklopedią na temat javowych usług sieciowych pisanych zgodnie z zasadami REST. Jako wprowadzenie może być, ale szkoda czasu na jej czytanie od deski do deski - wystarczy przeskoczyć do odpowiednich rozdziałów, które w danej chwili są interesujące. Jakby na pocieszenie, dzięki książce miałem po raz pierwszy możliwość posmakowania prostoty db4o. Niewiele, ale wystarczyło, aby przekonać się o jego walorach i sensowności użycia w projektach. Na pewno nie zapomnę o db4o przy nadarzającej się okazji jego wprowadzenia do projektu.
Zainteresowani całościowym spojrzeniem na wartość merytoryczną książki zapraszam do lektury mojej recenzji Book review: RESTful Java Web Services.
Kolejną książką, za którą się zabrałem, jest Practical Clojure. Muszę przyznać, że pierwszy rozdział zrobił na mnie ogromne wrażenie prostotą omawiania koncepcji, które stoją u podstaw Clojure. Bardzo zapadło mi w pamięci wyjaśnienie, dlaczego tak istotne jest, aby utrzymać niezmienność struktur danych, nawet tam, gdzie wydawałoby się, że jest nieprzystającą do problemu. Przykład z cyfrą 3, której zwiększenie o 1, to utworzenie nowej kopii z wartością 4 przemówił mi do rozsądku :) W końcu tak samo jest z bardziej złożonymi strukturami, które wbrew wspomnianej oczywistości z 3, traktujemy specjalniej i dodanie elementu niewielu wskazuje na *konieczność* utworzenia struktury-kopii z nowym nabytkiem. Wydaje się zbyt kosztowną operacją?! Proszę o argumenty popierające to myślenie? Chętnie wysłucham (a książka posłuży mi jako moje źródło odpowiedzi).
Czy u Ciebie również daje się odczuć potrzebę poznania języka funkcyjnego bardziej dokładnie i praktyczniej? U mnie zaczyna być widać objawy chorobowe przechodzące w uzależnienie. Czego i Tobie życzę! :)
12 stycznia 2010
Każdemu będzie w końcu dane - wreszcie Java EE 5 w projektach!
Nowy rok i nowe projekty, a tak się złożyło, że część z nich nawet rozwojowa - dosłownie i w przenośni. Znalazłem się więc w projekcie, w którym tworzone jest oprogramowanie do synchronizacji danych między bazami danych (tym samym kłaniam się nisko uczestnikom - klimat "Piratów z Karaibów", których oglądałem przez ostatnie 3 dni się udziela :]).
Architektura obejmuje WASv7 z DB2 (centrala) oraz WASCE z DB2 Express (satelitarne, lokalne instalacje). Nareszcie projekt w IBMie, gdzie serwer aplikacyjny wspiera najnowszą specyfikację Java EE 5 (może niekoniecznie najnowszą, bo na dniach wyszła nowiuteńka wersja Java EE 6, ale jej wsparcie nie jest jeszcze na tyle rozpowszechniona, aby nawet próbować się z nią w ramach prac domowych). Przyznaję, że trochę dziwnie mi się pisze oprogramowanie w Java EE 5 z udziałem IBM WebSphere. Jakoś przyzwyczaiłem się do starszych specyfikacji, których unikałem, jak tylko mogłem i większość pracy sprowadzałem do odpowiednich funkcjonalności w RADzie. Udało się i teraz zostało mi to wynagrodzone - wreszcie można oddychać pełną piersią, a jeśli dodać do tego, że teraz wszystkie zabawki IBMa z rodziny WebSphere działają na WASv7 - serwerze aplikacyjnym zgodnym z Java EE 5 i działającym na Java SE 6 - to możecie sobie wyobrazić, jak bardzom z tego rad. Do niedawna jeszcze o Java EE mogłem sobie pomarzyć w cieple domowego kominka, a w pracy...brrr...lepiej nie wspominać, wciąż J2EE. Teraz się odmieniło, bo kiedy się bardzo chce, to się kiedyś ziści. Wiedza, którą zdobywałem w ostatnim roku teraz się przydaje...produkcyjnie. Wreszcie!
Wracając do mojego bieżącego projektu, miałem dzisiaj przygodę z synchronizacją realizowaną przez...stronę JSP. Wszystko było wykonywane z jej poziomu i jej autor zdawał się mieć tego całego programowania w Javie najwyraźniej dosyć (nieprawdaż Paweł?). Szkoda było chłopaka, bo zacny z niego gość, ale brakowało mu wiedzy, ciut więcej i takiej ukierunkowanej na mocne strony Java EE. A skoro już mają Java EE, to nie byłoby dobrze nie skorzystać z dobrodziejstw. Zadanie na rozgrzewkę w sam raz dla mnie - można błysnąć i to przy niewielkim nakładzie pracy. To lubię! ;-)
Przed moimi oczyma jawi się strona JSP, a w niej jeden wielki try/catch z dostępem do bazki, sprawdzeniem tego i owego, aby ostatecznie zbudować odpowiedź XMLową. Dla mnie naturalnym było zaciągnąć @WebService i @Resource do pracy, aby z niecnego JSP zrobić całkiem przyzwoitą klaskę, powtórzę, zwykłą klaskę z kilkoma "wskazaniami" dla serwera, aby traktował ją specjalnie.
Wystarczyło więc, uruchomić NetBeans IDE 6.8.1, zaciągnąć aktualne źródła aplikacji webowej z repozytorium CVS (brrr, że też wciąż tego ustrojstwa się używa) i dodać tę oto klaskę (niektóre elementy usunięte dla poprawienia czytelności):
Jeśli są zainteresowani, aby dowiedzieć się więcej o szczegółach działania tej klasy, wystarczy się odezwać w komentarzu, np. tak: "Wyjaśnień potrzebowałbym więcej...". Chętni? Artykuł czy skrinkast*?
Ach i przy okazji tych doświadczeń z adnotacjami Java EE 5, sprawdziłem jeszcze jedno połączenie, tym razem NetBeans IDE z Eclipse. Sam projekt tworzony był w Eclipse IDE i tak został zapisany w repozytorium. Ja wystartowałem z NetBeans, więc konieczny był import, który sądziłem początkowo, że trochę pozamienia w projekcie. Okazało się, że nie tylko nie pozamieniał, ale moja zmiana była widoczna w Eclipse bez jakichkolwiek specjalnych kroków poza cvs update. Nie było mi dane ukryć mojego zdumienia, że tak łatwo poszło. Miałem przez moment stracha, że może się nie udać, ale, jak to mówią, diabeł ma wielkie oczy.
[*] Z tym "skrinkast" to przegiąłem, co?
Architektura obejmuje WASv7 z DB2 (centrala) oraz WASCE z DB2 Express (satelitarne, lokalne instalacje). Nareszcie projekt w IBMie, gdzie serwer aplikacyjny wspiera najnowszą specyfikację Java EE 5 (może niekoniecznie najnowszą, bo na dniach wyszła nowiuteńka wersja Java EE 6, ale jej wsparcie nie jest jeszcze na tyle rozpowszechniona, aby nawet próbować się z nią w ramach prac domowych). Przyznaję, że trochę dziwnie mi się pisze oprogramowanie w Java EE 5 z udziałem IBM WebSphere. Jakoś przyzwyczaiłem się do starszych specyfikacji, których unikałem, jak tylko mogłem i większość pracy sprowadzałem do odpowiednich funkcjonalności w RADzie. Udało się i teraz zostało mi to wynagrodzone - wreszcie można oddychać pełną piersią, a jeśli dodać do tego, że teraz wszystkie zabawki IBMa z rodziny WebSphere działają na WASv7 - serwerze aplikacyjnym zgodnym z Java EE 5 i działającym na Java SE 6 - to możecie sobie wyobrazić, jak bardzom z tego rad. Do niedawna jeszcze o Java EE mogłem sobie pomarzyć w cieple domowego kominka, a w pracy...brrr...lepiej nie wspominać, wciąż J2EE. Teraz się odmieniło, bo kiedy się bardzo chce, to się kiedyś ziści. Wiedza, którą zdobywałem w ostatnim roku teraz się przydaje...produkcyjnie. Wreszcie!
Wracając do mojego bieżącego projektu, miałem dzisiaj przygodę z synchronizacją realizowaną przez...stronę JSP. Wszystko było wykonywane z jej poziomu i jej autor zdawał się mieć tego całego programowania w Javie najwyraźniej dosyć (nieprawdaż Paweł?). Szkoda było chłopaka, bo zacny z niego gość, ale brakowało mu wiedzy, ciut więcej i takiej ukierunkowanej na mocne strony Java EE. A skoro już mają Java EE, to nie byłoby dobrze nie skorzystać z dobrodziejstw. Zadanie na rozgrzewkę w sam raz dla mnie - można błysnąć i to przy niewielkim nakładzie pracy. To lubię! ;-)
Przed moimi oczyma jawi się strona JSP, a w niej jeden wielki try/catch z dostępem do bazki, sprawdzeniem tego i owego, aby ostatecznie zbudować odpowiedź XMLową. Dla mnie naturalnym było zaciągnąć @WebService i @Resource do pracy, aby z niecnego JSP zrobić całkiem przyzwoitą klaskę, powtórzę, zwykłą klaskę z kilkoma "wskazaniami" dla serwera, aby traktował ją specjalnie.
Wystarczyło więc, uruchomić NetBeans IDE 6.8.1, zaciągnąć aktualne źródła aplikacji webowej z repozytorium CVS (brrr, że też wciąż tego ustrojstwa się używa) i dodać tę oto klaskę (niektóre elementy usunięte dla poprawienia czytelności):
package pl.tufirma;Jak widać wiele jeszcze do zrobienia, ale sam szkielet klasy już jest odpowiednio dopasowany. Propozycje dalszych zmian mile widziane. Mamy wystawioną usługę jako usługę sieciową za pomocą @WebService, a dostęp do bazy danych kontrolowany jest przez serwer aplikacyjny i dostępny klasie przez @Resource. Czyż nie ładniej, chciałoby się zapytać? Teraz pozostaje obsłużyć właściwe tworzenie pliku XML (pewnie JAXB, ale nie będę ukrywał, że aż mnie rwie do Groovy), klient po stronie bazy lokalnej, który czyta odpowiedź od usługi, zapis do lokalnej bazy danych i powinno być całkiem cacy. Terapia szokowa w postaci Groovy i Grails czeka w kolejce (jeszcze im nic nie mówiłem, nawet nie wspominałem, więc prośba o dochowanie tajemnicy, zgoda?).
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.sql.DataSource;
@WebService
public class Synchronizator {
private final String AUTH_SQL = "SELECT ID FROM AUTHORIZE WHERE AUTH = ?";
@Resource(name = "jdbc/mak")
DataSource makDS;
public String synchronizacjaPoczatkowa(@WebParam(name = "key") String klucz) {
return synchronizeFirst(klucz);
}
protected String synchronizeFirst(String key) {
try {
String id_authorize = pobierzIdAuthorize(key);
MessageFormat SQLQUERY = new MessageFormat("WITH ...");
StringBuffer queryParam = new StringBuffer(id_authorize);
String query = SQLQUERY.format(new Object[]{queryParam.toString()});
System.out.println("SQLQUERY: " + query);
Connection conn = makDS.getConnection();
PreparedStatement stmt = conn.prepareStatement(query);
ResultSet rs = stmt.executeQuery();
String XMLResult = "";
if (rs.next()) {
XMLResult = rs.getString(1);
}
return XMLResult;
} catch (SQLException ex) {
Logger.getLogger(Synchronizator.class.getName()).log(Level.SEVERE, null, ex);
throw new IllegalStateException("Problemy z bazka", ex);
}
}
protected String pobierzIdAuthorize(String key) {
try {
Connection conn = makDS.getConnection();
PreparedStatement authStmt = conn.prepareStatement(AUTH_SQL);
authStmt.setString(1, key);
ResultSet authRs = authStmt.executeQuery();
if (!authRs.next()) {
throw new IllegalArgumentException("NIe odnaleziono klucza dla " + key);
}
return authRs.getString(1);
} catch (SQLException ex) {
Logger.getLogger(Synchronizator.class.getName()).log(Level.SEVERE, null, ex);
throw new IllegalArgumentException("NIe odnaleziono klucza dla " + key, ex);
}
}
}
Jeśli są zainteresowani, aby dowiedzieć się więcej o szczegółach działania tej klasy, wystarczy się odezwać w komentarzu, np. tak: "Wyjaśnień potrzebowałbym więcej...". Chętni? Artykuł czy skrinkast*?
Ach i przy okazji tych doświadczeń z adnotacjami Java EE 5, sprawdziłem jeszcze jedno połączenie, tym razem NetBeans IDE z Eclipse. Sam projekt tworzony był w Eclipse IDE i tak został zapisany w repozytorium. Ja wystartowałem z NetBeans, więc konieczny był import, który sądziłem początkowo, że trochę pozamienia w projekcie. Okazało się, że nie tylko nie pozamieniał, ale moja zmiana była widoczna w Eclipse bez jakichkolwiek specjalnych kroków poza cvs update. Nie było mi dane ukryć mojego zdumienia, że tak łatwo poszło. Miałem przez moment stracha, że może się nie udać, ale, jak to mówią, diabeł ma wielkie oczy.
[*] Z tym "skrinkast" to przegiąłem, co?
Subskrybuj:
Posty (Atom)

