<?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; tomcat</title>
	<atom:link href="http://j2ee.pl/tag/tomcat/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>Tomcat &#8211; Clustering i Loadbalancing</title>
		<link>http://j2ee.pl/2008/08/18/tomcat-clustering-i-loadbalancing/</link>
		<comments>http://j2ee.pl/2008/08/18/tomcat-clustering-i-loadbalancing/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 09:14:33 +0000</pubDate>
		<dc:creator>Błażej Bucko</dc:creator>
				<category><![CDATA[Inne]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://j2ee.pl/?p=176</guid>
		<description><![CDATA[
Współczesne aplikacje internetowe są coraz bardziej skomplikowane i wymagaja coraz mocniejszych serwerów. Jednocześnie liczba użytkowników zwiększa się praktycznie z każdą minutą, co powoduje ze serwery muszą być jeszcze wydajniejsze. Można tej sytuacji zaradzić dokupując procesory, pamięci, zwiększając przepustowość kart sieciowych, jednakże w pewnym momencie trafimy na mur, którego już się w ten sposób obejść nie [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://tomcat.apache.org/images/tomcat.gif" alt="Tomcat" align="left" /><br />
Współczesne aplikacje internetowe są coraz bardziej skomplikowane i wymagaja coraz mocniejszych serwerów. Jednocześnie liczba użytkowników zwiększa się praktycznie z każdą minutą, co powoduje ze serwery muszą być jeszcze wydajniejsze. Można tej sytuacji zaradzić dokupując procesory, pamięci, zwiększając przepustowość kart sieciowych, jednakże w pewnym momencie trafimy na mur, którego już się w ten sposób obejść nie da. Możemy go jednakże przeskoczyć łącząc kilka komputerów w klaster, a następnie rozdzielając zapytania tak, aby wszystkie serwery były równo obciążone. Ta metoda jest również konieczna w przypadku, gdy awaria serwera jest niedopuszczalna i musimy zapewnić ciągły dostęp do aplikacji.</p>
<p><span id="more-176"></span></p>
<h2>Tomcat</h2>
<p>W trakcie normalnego działania klastra sesje są replikowane między wszystkimi komputerami przy użyciu jednej z następujących metod:</p>
<ol>
<li>Replikacja poprzez współdzielony sieciowy system plików (PersistanceManager + FileStore)</li>
<li>Replikacja do bazy danych (PersistanceManager + JDBCStore)</li>
<li>Replikacja w pamięci (SimpleTcpCluster)</li>
</ol>
<p>Jeżeli jeden z Tomcatów ulegnie awarii jest usuwany z klastra a powiązane z nim zapytania są automatycznie przekierowywane przez loadbalancera. Sesje powiązane z uszkodzonym serwerem mogą zostac w zależności od konfiguracji wygaszone lub nie.</p>
<p>Przynależność do klastra jest określana przy pomocy pakietów UDP wysyłanych przez wszystkie Tomcaty, ze skonfigurowanym tym samym adresem multicastowym oraz portem. Replikacja sesji odbywa się przy użyciu pakietów TCP.</p>
<p>Zawór replikacji (ReplicationValve) służy do określenia kiedy zapytanie zostało zakończone i klaster może rozpocząć replikację.</p>
<p>Element w pliku server.xml konfiguruje domyślnie klaster z następującymi parametrami:</p>
<ul>
<li>Membership z adresem multicastowym 228.0.0.4 i portem udp 8012</li>
<li>Potwierdzenie wysyłane co sekundę, usunięcie z listy po 30 sekundach bez odpowiedzi od danego Tomcata</li>
<li>Odbiorca wiadomości SocketReplicationListener na domyślnym adresie IP oraz pierwszym wolnym portem z zakresu 8015 &#8211; 8019</li>
<li>Replikacja oparta o ReplicationTransmitter w trybie fastasyncqueue</li>
<li>Dodane ClusterSessionListener oraz ReplicationValve.</li>
</ul>
<p>Wystarczy to do podstawowego skonfigurowania klastra, np. na maszynie developerskiej, jednakże w środowisku produkcyjnym zaleca się modyfikację ilości wątków obsługujących replikację i tryb replikacji.</p>
<h3>Tipsy:</h3>
<ul>
<li>Dokumentacja dotycząca klastrowania znajduje się tutaj: <a href="http://tomcat.apache.org/tomcat-5.5-doc/cluster-howto.html">Tomcat 5.5</a>, <a href="http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html">Tomcat 6.0</a></li>
<li>Obiekty które są zapisywane w sesji muszą implementować java.io.Serializable (np. dto w kreatorach springowych)</li>
<li>Na serwerach należy włączyć obsługę multicastu (np. pod Linuxem: ifconfig eth0 multicast)</li>
<li>W web.xml powinien znajdować się element &lt;distributable /&gt;, który powoduje, że dana aplikacja jest zdolna do działania w środowisku rozproszonym, czyli np. w klastrze.</li>
<li>Najważniejszym elementem jeżeli chodzi o wydajność replikacji jest parametr replicationMode, konfigurowalny w elemencie &lt;Sender …/&gt;</li>
</ul>
<h2>Apache i mod_jk</h2>
<p>Mod_jk to moduł do apache’a obsługujący komunikację z Tomcatem.  Worker to instancja Tomcata na której uruchomione są servlety i do której przekierowywane są zapytania. Mod_jk jest konfigurowany, tak jak inne moduły, w pliku apache.conf lub httpd.conf. W niektórych dystrybucjach (np. debian) pliki konfiguracyjne modułów znajdują się w podkatalogu mods-enabled i są includowane w głownym pliku konfiguracyjnym.</p>
<h3>Konfiguracja mod_jk</h3>
<p>Moduł ładowany jest przy pomocy dyrektywy:</p>
<pre class="prettyprint">LoadModule jk_module ${sciezkaDoKataloguZModulami}/mod_jk.so</pre>
<p>Następnie musimy dodać plik z workerami:</p>
<pre class="prettyprint">JkWorkersFile /etc/apache/workers.properties</pre>
<p>Oczywiście plik workers.properties znajdować się może w dowolnym miejscu widocznym przez Apache’a.</p>
<p>Dodatkowo, należy też skonfigurować punkt montowania, czyli scieżkę od której przetwarzaniem zapytań zajmować będzie się Tomcat.</p>
<pre class="prettyprint">JkMount /* tomcat1</pre>
<p>Ta dyrektywa sprawia, że wszystkie zapytania które odbierze Apache będą przekserowane do Wolkera o nazwie tomcat1. JkMount może się powtarzać i umieścić ją można zarówno w globalnej konfiguracji, VirtualHost jak i w Location (tylko nazwa workera, ścieżka będzie z Location) .<br />
Zamiast montowania każdego punktu z osobna można użyć pliku uriworkermap.properties przy pomocy dyrektywy JkMountFile wskazującej na plik z mapowaniem.</p>
<h3>Konfiguracja workera</h3>
<p>Workery znajdują się przeważnie w pliku workers.properties. W pliku powinna znaleźć się dyrektywa worker.list oraz definicja co najmniej jednego workera. Worker.list to lista oddzielonych przecinkami workerów, które będą udostępnione mod_jk. Workera definiuję się w następujący sposób:</p>
<pre class="prettyprint">worker.nazwaWorkera.type=
worker.nazwaWorkera.host=
worker.nazwaWorkera.port=</pre>
<p>Typ to najczęściej ajp13, który zastąpił starszy ajp12 i udostępnił między innymi kompresje danych i obsługę SSL’a.</p>
<h3>Konfiguracja loadbalancera</h3>
<p>Loadbalancer to specyficzny typ workera który nie komunikuje się z Tomcatem, tylko zajmuję się zarządzaniem pozostałymi „prawdziwymi” workerami, czyli min. rozdziela zadania na poszczególne instancje Tomcata używając algorytmu Round Robin z wagami. Sprawdza też które Tomcaty z listy nie odpowiadają i nie wysyła do nich zapytań.</p>
<p>Konfiguracja definiuję się w nastepujący sposób:</p>
<pre class="prettyprint">worker.nazwaWorkeraLB.balance_workers=</pre>
<p>Dodatkowo można skonfigurować sticky session, czyli czy loadbalancer powinien przekierowywać zapytania z istniejącym sessionId do obsługującego je wcześniej Tomcata. Domyślnie ta funkcjonalność jest włączona.</p>
<p>Workerom można przyporządkować rózne wagi (worker.nazwaWorkera.lbfactor) a w loadbalancerze zmienić metodę wyboru workera do którego przekazane zostaną zapytania (worker.nazwaWorkeraLB.method). Do wyboru są następujące metody:<br />
•<strong>R</strong>[equest] – kryterium jest obłożenie zapytaniami. Domyślne ustawienie.<br />
•<strong>S</strong>[ession] – kryterium jest obłożenie sesjami. Zalecane w przypadku ograniczonych zasobów do obsługi sesji.<br />
•<strong>B</strong>[usyness] – kryterium jest aktualne obciążenie serwera. Zalecane w przypadku długich sesji, np. w aplikacjach udostępniających pliki.<br />
•<strong>T</strong>[raffic] – kryterium jest ilość ruchu na łączu między Apachem a Tomcatem. Zalecane w przypadku ograniczonej łączności między klasterm a Apachem.</p>
<h3>Linki:</h3>
<ul>
<li><a href="http://tomcat.apache.org/connectors-doc/reference/apache.html">Pozostałe dyrektywy</a></li>
<li><a href="http://tomcat.apache.org/connectors-doc/reference/uriworkermap.html">Konfiguracja pliku mapowań</a></li>
<li><a href="http://tomcat.apache.org/connectors-doc/generic_howto/workers.html">Dokumentacja workerów</a></li>
</ul>
<h2>Przykłady</h2>
<h3>Apache -&gt; mod_jk  -&gt; 1 tomcat</h3>
<p>Najprostszy przykład. Zapytania są przekierowywane do jednego tomcata.</p>
<h4>Konfiguracja Apache 1:</h4>
<p><em> workers.properties:</em></p>
<pre class="prettyprint">worker.list=tomcat1

worker.tomcat1.type=ajp13
worker.tomcat1.host=10.1.1.2
worker.tomcat1.port=8009</pre>
<h4>Konfiguracja Tomcat1:</h4>
<p><em>server.xml, sekcja Service:</em></p>
<pre class="prettyprint">&lt;Connector port="8009"  protocol="AJP/1.3" /&gt;</pre>
<h3>Apache -&gt; mod_jk  -&gt; 2 tomcaty w klastrze</h3>
<p>Najbardziej użyteczna według mnie konfiguracja, bez użycia balansowania DNS&#8217;owego lub sprzętowego. Balansowaniem zajmuje się mod_jk.</p>
<h4>Konfiguracja Apache 1:</h4>
<p><em>workers.properties:</em></p>
<pre class="prettyprint">worker.list=cluster

worker.tomcat1.type=ajp13
worker.tomcat1.host=10.1.1.2
worker.tomcat1.port=8009

worker.tomcat2.type=ajp13
worker.tomcat2.host=10.1.1.3
worker.tomcat2.port=8009

worker.cluster.type=lb
worker.cluster.balance_workers=tomcat1, tomcat2</pre>
<h4>Konfiguracja Tomcat’ów:</h4>
<p><em>server.xml, sekcja Service:</em></p>
<pre class="prettyprint">&lt;Connector port="8009"  protocol="AJP/1.3" /&gt;</pre>
<p><em>server.xml,  sekcja Host:</em></p>
<pre class="prettyprint">&lt;Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"/&gt;</pre>
<p>Dodatkowo, do  należy dopisać jvmRoute=”${nazwaHosta}”, gdzie ${nazwaHosta} to odpowiednio tomcat1 i tomcat2</p>
<h3>Apache -&gt; mod_jk  -&gt; 1 tomcat jako loadbalancer -&gt; 2 tomcaty w klastrze</h3>
<p>Metoda ta używa aplikacji “balancer” uruchomionej na Tomcat’ie, który nie jest w klastrze. Zaletą tego rozwiązania jest możliwość dowolnego skonfigurowania balancingu. Wadą jest konieczność napisania klasy zajmującej się wyborem najlepszego Tomcata. Rozwiązanie to używa pliku workers.properties z przykładu pierwszego, konfiguracji klastra z przykładu drugiego oraz dodatkowego Tomcata, na którym działa aplikacja balancer. workers.properties przekierowuje zapytania na Tomcata pełniącego rolę LoadBalancera.</p>
]]></content:encoded>
			<wfw:commentRss>http://j2ee.pl/2008/08/18/tomcat-clustering-i-loadbalancing/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
