<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>j2ee.pl - związani z javą &#187; JBoss</title>
	<atom:link href="http://j2ee.pl/tag/jboss/feed/" rel="self" type="application/rss+xml" />
	<link>http://j2ee.pl</link>
	<description>związani z Javą</description>
	<lastBuildDate>Mon, 24 Aug 2009 11:45:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JavaRebel</title>
		<link>http://j2ee.pl/2008/09/16/javarebel/</link>
		<comments>http://j2ee.pl/2008/09/16/javarebel/#comments</comments>
		<pubDate>Tue, 16 Sep 2008 11:49:20 +0000</pubDate>
		<dc:creator>Michał Gołacki</dc:creator>
				<category><![CDATA[Inne biblioteki]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://j2ee.pl/?p=327</guid>
		<description><![CDATA[Zdarzyło wam się kiedyś pracować z aplikacją, której deploy trwał tak długo, że można było zapomnieć co tak właściwie chcieliście uruchomić? Być może uda nam się znaleźć rozwiązanie tego problemu. JavaRebel jest pluginem do maszyny wirtualnej. Pozwala na przeładowywanie klas bez konieczności restartowania serwera.
Konfiguracja
Konfiguracja nie jest szczególnie skomplikowana, do uruchomienia potrzebny będzie sam JavaRebel oraz [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><img style="margin: 5px; float: left;" title="JavaRebellogo" src="http://j2ee.pl/wp-content/uploads/2008/09/logo.gif" alt="JavaRebel" />Zdarzyło wam się kiedyś pracować z aplikacją, której deploy trwał tak długo, że można było zapomnieć co tak właściwie chcieliście uruchomić? Być może uda nam się znaleźć rozwiązanie tego problemu. <strong>JavaRebel</strong> jest pluginem do maszyny wirtualnej. Pozwala na przeładowywanie klas bez konieczności restartowania serwera.</p>
<h2><span id="more-327"></span>Konfiguracja</h2>
<p>Konfiguracja nie jest szczególnie skomplikowana, do uruchomienia potrzebny będzie sam JavaRebel oraz serwer aplikacji. Osobiście przetestowałem serwery aplikacjyjne JBoss 4.2.3.GA oraz Tomcat 5.5.26 deployując na nich aplikację Spring&#8217;ową.</p>
<p>W obu przypadkach dodajemy linię:<br />
<code><strong>set JAVA_OPTS=-noverify -javaagent:javarebel.jar -Drebel.dirs= -%JAVA_OPTS%</strong></code><br />
uzupełniając &#8220;<strong>-Drebel.dirs=</strong>&#8221; o katalogi do których nasze IDE kompiluje klasy, oddzielając je przecinkami. W przypadku JBoss&#8217;a plikiem  do którego dodajemy linię jest <strong>run.bat</strong>, natomiast dla Tomcat&#8217;s będzie to <strong>catalina.cmd</strong>.</p>
<p>Plik javarebel.jar umieszczamy w tym samym miejscu, w którym znajdował się edytowany przez nas wcześniej, czyli katalogu bin serwera.</p>
<h2>Działanie</h2>
<p>Teraz możemy już uruchomić serwer. Naszą aplikację deployujemy na serwerze normalnie, wrzucając w odpowiednie miejsce plik war. Aplikacja zostanie uruchomiona, a JavaRebel rozpocznie monitorowanie folderu podanego wcześniej, sprawdzając czy któraś z naszych klas nie została zmieniona. Monitorowanie zmian odbywa się na podstawie znaczników czasu w klasach. Przeładowanie klasy zachowuje wszystkie istniejące instancje.</p>
<p>JavaRebel pozwala nam na wykonanie szeregu operacji na naszych klasach. Możemy zarówno dodawać jak i usuwać metody, konstruktory, pola, klasy czy adnotacje. Oczywiście pozwala nam zmieniać ciała samych metod. Niestety, ograniczeniem jest brak możliwości zamiany klasy bazowej oraz dodawanie/usuwanie interfejsów. Wydaje mi się jednak, że nie są to tak częste operacje, aby mogły stanowić problem.</p>
<h2>Spring</h2>
<p>W ostatnim czasie pojawił się plugin do JavaRebel wspierający jego działanie ze Springiem. Wspiera on rejestrowanie nowych bean&#8217;ów, kontrolerów, zarządzanie zależnościami. Wszystkie powyższe operacje mogą być wykonywane zarówno przy użyciu konfiguracji w XML&#8217;u jak i adnotacji. Co prawda narzędzie jest udostępnione jako open source, jednak wciąż należy je traktować jako wersję beta.</p>
<h2>Licencja</h2>
<p>Jest chyba największą wadą tego narzędzia, nie jest ono tanie. Licencja ciągła przy zakupie poniżej dziesięciu kosztuje 249$, a licencja roczna to koszt 99$. Cena licencji spada wraz z ich ilością.</p>
<p>Autorzy podają, że narzędzie to jest aktualnie używane przez wszystkich developerów serwisu LinkedIn. Ponadto posiadacze brązowego pasa na <a href="http://http://j2ee.pl/?p=327&#038;preview=true/NewsView.wwa?newsId=7644325">www.javablackbelt.com</a> mogą otrzymać licencję za darmo.</p>
<h2>Wrażenia</h2>
<p>Osobiście ten sposób wprowadzania zmian w aplikacji bardzo przypadł mi do gustu. Nie zauważyłem opóźnień związanych z przeładowywaniem klas. Zależności były zawsze na miejscu dzięki możliwości zachowania istniejących instancji bean&#8217;ów. Uważam, że jest to narzędzie warte rozważenia, szczególnie w przypadku aplikacji, których deployment zajmuje pokaźną ilość czasu. Jednak z tego co zdążyłem wyczytać na forum projektu, pojawiają się problemy z obsługą EJB i generalnie nie istnieje wsparcie dla jakichkolwiek frameworków (poza Springiem). Jednak istnieje możliwość darmowego przetestowania, czy narzędzie spełnia nasze oczekiwania.</p>
<p>Moim zdaniem jest to bardzo przydatne oprogramowanie przy przygotowaniu aplikacji springowych, jednak jego cena jest nieco wygórowana, biorąc pod uwagę kłopoty z EJB i brak wsparcia dla innych frameworków.</p>
]]></content:encoded>
			<wfw:commentRss>http://j2ee.pl/2008/09/16/javarebel/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>JBoss jBPM!?</title>
		<link>http://j2ee.pl/2008/08/29/jboss-jbpm/</link>
		<comments>http://j2ee.pl/2008/08/29/jboss-jbpm/#comments</comments>
		<pubDate>Fri, 29 Aug 2008 07:41:02 +0000</pubDate>
		<dc:creator>Kamil Krasnodębski</dc:creator>
				<category><![CDATA[Inne]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[WebServices]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[jBPM]]></category>
		<category><![CDATA[workflow]]></category>

		<guid isPermaLink="false">http://j2ee.pl/?p=274</guid>
		<description><![CDATA[Słowem wprowadzenia jBPM (Business Process Management) jest platformą przeznaczoną do modelowania procesów biznesowych .
Specyfiką procesów biznesowych jest oczekiwanie. Większość systemów komputerowych jest budowana aby coś było wykonane natychmiast, jednak jest to niemożliwe gdy z procesem jest związana aktywność kilku ludzi. Proces modelowany za pomocą jBPM opiera się o stany w których system oczekuje na wykonanie [...]]]></description>
			<content:encoded><![CDATA[<div class="mceTemp"><img class="alignleft" title="jBPM_logo" src="http://www.jboss.org/file-access/default/members/jbossjbpm/images/jbpm_logo.png" alt="jBPM" width="287" height="137" />Słowem wprowadzenia jBPM (Business Process Management) jest platformą przeznaczoną do modelowania procesów biznesowych .</div>
<div class="mceTemp">Specyfiką procesów biznesowych jest oczekiwanie. Większość systemów komputerowych jest budowana aby coś było wykonane natychmiast, jednak jest to niemożliwe gdy z procesem jest związana aktywność kilku ludzi. Proces modelowany za pomocą jBPM opiera się o stany w których system oczekuje na wykonanie pracy przez człowieka. </p>
<p><span id="more-274"></span></div>
<h2 class="mceTemp">Wprowadzenie.</h2>
<p class="mceTemp">Na jBPM składają się:</p>
<div class="mceTemp">
<ul>
<li><strong>jPDL</strong>-grafowy język programowania oparty o xml,</li>
<li><strong>GPD </strong>- graficzny edytor (wtyczka do Eclipse),  który pozwala na szybkie i w miarę intuicyjne utworzenie modelu procesu w języku jPDL,</li>
<li><strong>PVM </strong>- Proces Virtual Machine za pomocą którego jPDL ożywa.</li>
</ul>
</div>
<p class="mceTemp">Siłą jBPM jest właśnie jPDL który łączy pracę analityka i programisty w jednym pliku. Analityk najpierw modeluje proces (np.  sprzedaż produktu) wyszczególniając na grafie kierunkowym wszystkie istotne kroki danego procesu. Etap ten jest podobny do modelowania diagramu przepływu lub przypadków użycia znanych z UML czyli przyjazny dla analityka. Następnie programista po otrzymaniu takiego pliku zaczyna podpinać do poszczególnych węzłów grafu różne akcje i zadania (np. wywołanie zdalnego systemu, zapis do bazy danych). Użyłem słowa podpinać gdyż programista przy pomocy GPD wskazuje po prostu klasy które mają być użyte do obsługi.  Kolejną miłą właściwością jBMP jest persystencja  oparta o Hibernate co pozwala na umieszczenie tabel jBPM&#8217;a zarówno obok tabel naszej aplikacji jak i w całkowicie oddzielnej bazie danych. W bazie danych zapisywane są definicje procesów, instancje procesów oraz dane zgromadzone w zadaniach (task).</p>
<h2 class="mceTemp">Jak to się robi.</h2>
<p class="mceTemp">Początek jest banalnie prosty wpisujemy  http://www.jboss.org/jbossjbpm/  pojawia nam się strona z wielkim przyciskiem DOWNLOAD  i idąc tym tropem ściągamy sobie jPDL Suite. Tak zdobytą paczkę rozpakować należy w dowolnym miejscu i przejść do katalogu &#8220;designer&#8221; z tego miejsca odpalamy anta który zainstaluje nam eclipse.  Można też po prostu ściągnąć sobie eclipse i rozpakować go do katalogu ./designer/eclipse.</p>
<p class="mceTemp">Po uruchomieniu eclipse tworzymy nowy projekt JBoss jBPM/Process Project. Dajemy mu nazwę i klikamy &#8216;Finish&#8217;. Naszym oczom ukazuje się przykładowy projekt wraz z  jednym handlerem i JUnit testem.  Najważniejszą częścią tego przykładu jest plik<em> procesdefinition.xml</em> który zawiera  graf kierunkowy determinujący przebieg procesu, jest napisany w języku jPDL.</p>
<p class="mceTemp">Bloki procesu (grafu) dzielą się na kilka grup. Dokładny opis wszystkich bloków był by bardzo obszerny więc przedstawię tylko podstawowe.</p>
<p class="mceTemp"><strong>States </strong>służą do określenia kolejnych kroków procesu istotnych z punktu biznesowego i  wykonywanych automatycznie(bez ingerencji użytkownika) np. odpytanie o dane jakiegoś zewnętrznego systemu.</p>
<div class="mceTemp">
<p><strong>Nodes </strong>są podobne do States jednak są wyposażone w pole odpowiadające za wykonanie konkretnej akcji.</div>
<p class="mceTemp"><strong>Tasks Node</strong> jest specyficznym stanem gdyż jest przeznaczony do umieszczania w nim zadań do wykonania dla człowieka. Proces przechodzi dalej w chwili zakończenia zadania przez człowieka np. następnego dnia. W czasie obsługi danego zadania w dowolnym momencie można zapisać jego aktualny stan.</p>
<p class="mceTemp"><strong>Fork i Join</strong> służące do rozdzielenia procesu na kilka równolegle wykonywanych ścieżek. Istotną rzeczą jest że fork i join zawsze pracują w parach i wszystkie ścieżki wychodzące z jednego forka muszą skończyć się w jednym joinie. Proces oczekuje na bloku Join do zakończenia wszystkich ścieżek.</p>
<p class="mceTemp"><strong>Transition </strong>jest to połączenie pomiędzy blokami procesu określające kierunek przejścia. Z bloku może wyjść dowolna liczba połączeń. Jeśli podczas wyjścia z bloku nie jest podana nazwa połączenia proces przechodzi po pierwszym (kolejność w xml).</p>
<p class="mceTemp">Każdy blok ma możliwość podpięcia klasy obsługującej wyjątki, oraz dowolną liczbę klas obsługujących akcje, wykonywanych gdy nastąpi zdarzenie do których są przyporządkowane(np. node enter, node leave). Akcje mogą być również przyporządkowane do Transitions.</p>
<div class="mceTemp">
<p>Proces (graf) zaczyna się od bloku Start State i kończy na bloku End State.</p>
<p><a href="http://j2ee.pl/wp-content/uploads/2008/08/simple.png"><img class="alignnone size-medium wp-image-275" title="simple" src="http://j2ee.pl/wp-content/uploads/2008/08/simple-214x300.png" alt="" width="214" height="300" /></a></div>
<div class="mceTemp">
<p>Na powyższym rysunku widać prosty przykładowy proces.  Widok źródła wygląda następująco:</p></div>
<div class="mceTemp">
<pre class="prettyprint">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;process-definition xmlns="urn:jbpm.org:jpdl-3.2" name="simple"&gt;
	&lt;start-state name="start"&gt;
		&lt;transition name="to_state" to="first"&gt;
			&lt;action name="action"
				class="com.sample.action.MessageActionHandler"&gt;
				&lt;message&gt;Going to the first state!&lt;/message&gt;
			&lt;/action&gt;
		&lt;/transition&gt;
	&lt;/start-state&gt;
	&lt;state name="first"&gt;
		&lt;transition name="to_end" to="end"&gt;
			&lt;action name="action"
				class="com.sample.action.MessageActionHandler"&gt;
				&lt;message&gt;About to finish!&lt;/message&gt;
			&lt;/action&gt;
		&lt;/transition&gt;
	&lt;/state&gt;
	&lt;end-state name="end"&gt;&lt;/end-state&gt;
&lt;/process-definition&gt;</pre>
</div>
<div class="mceTemp">W widoku xml widzimy że do transition są przyporządkowane akcje wraz z parametrem do nich przekazywanym. Kod klasy obsługującej wygląda następująco:</div>
<div class="mceTemp">
<pre class="prettyprint">public class MessageActionHandler implements ActionHandler {

	String message; 

	public void execute(ExecutionContext context) throws Exception {
		context.getContextInstance().setVariable("message", message);
	}
}</pre>
</div>
<p class="mceTemp">Jak widać w powyższym kodzie pole message  nie posiada metod get i set jego wartość jest bezpośrednio wstrzykiwana z definicji procesu. Interfejs ActionHandlera posiada tylko jedną metodę do której jako parametr przychodzi ExecutionContext zawierający definicję procesu i jego instancje(wszystkie).</p>
<p class="mceTemp">W momencie wykonania kompletnej implementacji wszystkich zdarzeń oraz podpięciu interfejsu użytkownika, mieli byśmy piękną trzy etapową obsługę czegoś. Gdyby była to aplikacja wykonana tradycyjnie każda zmiana wymagała by w mniejszym lub większym stopniu dostosowania istniejących elementów. Lecz gdy mamy do czynienia z grafem możemy po postu w dowolnym miejscu dodać kolejny element. Jak widać na rysunku poniżej.</p>
<p class="mceTemp"><a href="http://j2ee.pl/wp-content/uploads/2008/08/complex.png"><img class="alignnone size-medium wp-image-279" title="complex" src="http://j2ee.pl/wp-content/uploads/2008/08/complex.png" alt="" width="562" height="213" /></a></p>
<p class="mceTemp"><!--[if gte mso 9]><xml> </xml>< ![endif]--><!--[if gte mso 9]><xml> Normal   0         21         false   false   false      PL   X-NONE   X-NONE </xml>< ![endif]--><!--[if gte mso 9]><xml> </xml>< ![endif]--><!--  --><!--[if gte mso 10]> <mce :style>< !   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:Standardowy; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"Times New Roman"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} --> <!--[endif]--></mce></p>
<p>Wbrew pozorom takie rozszerzanie aplikacji zdarza się dość często szczególnie jak mamy do czynienia z procesami decyzyjnymi oraz organizacją pracy w rozwijających się przedsiębiorstwach.</p>
<h2>Podsumowanie.</h2>
<p>JBPM to platforma do modelowania procesów biznesowych oparta o grafowy język jPDL. Nadaje się świetnie do tworzenia systemów które mają na celu przydzielać zadania do wykonania dla poszczególnych osób w złożonym środowisku procedur i przepisów.</p>
]]></content:encoded>
			<wfw:commentRss>http://j2ee.pl/2008/08/29/jboss-jbpm/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
