Saturday 22 December 2012

Replace with Regex

Ostatnio przechodziłem z HibernateSessionFactory konfigurowanego w kodzie na dobre hibernate.cfg.xml.
Wiąże się to z zamianą mapowań, których może być w dość dużo w projekcie:
configuration.addAnnotatedClass(pl.myproject.MyClass.class);
Każda klasa reprezentująca encje musi zostać zamieniona na coś takiego:
Najprostsze rozwiązanie jakie przychodzi to użycie zamiany z użyciem wyrażenia reguralnego. W naszych pięknych cudnych lśniących IDE należy włączyć tryb zamiany z użyciem wyrażenia reguralnego. W polu "find" definiujemy:
configuration.addAnnotatedClass\((.*).class\);
W polu "replace" definiujemy:
Klikamy "Replace All" i zrobione. Nie ma tutaj nic trudnego. Wybranie pierwszego podzbioru za pomocą dwóch nawiasów i wstawienie tego za pomocą $1.
Proste,a nawet banalne.
Za pewne każdy edytor tekstu potrafi takie rzeczy, jednak odnoszę wrażenie, że zbyt często próbujemy robić takie rzeczy ręcznie.

Monday 16 January 2012

Tomcat cluster with mod_jk sticky session session replication

Przewodnik o tym jak zrobić klaster złożony z dwóch instacji tomcata połączonego load balancerem apache mod_jk i jak uruchomić replikację sesji oraz sticky-session. System operacyjny to lubuntu 11.10.

Z góry przepraszam, za dość surowe komendy. Nie jest to tutorial krok-po-korku ani książka, żeby rozlegle wszystko opisywać. Jest to tylko ściągawka na przyszłość, lub ekstrakt z tego co trzeba zrobić.

Adres IP należy zmienić z 10.0.0.90 na localhost czy gdzie tam wasz serwerek się znajduje.

1. Do zainstalowania:
apt-get install apache2 libapache2-mod-jk2-mod-jk

2. Utworzyć katalog:

/tcluster/instance1

3. Pobrać Tomcata i rozpakować zawartość do tego katalogu.

4. Konfiguracja Apache mod_jk
- utwórz plik /etc/apache2/workers.properties:

worker.list=loadbalancer,mystat

worker.worker1.type=ajp13
worker.worker1.host=10.0.0.90
worker.worker1.port=8881
worker.worker1.lbfactor=50
worker.worker1.cachesize=10
worker.worker1.cache_timeout=600
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300

worker.worker2.type=ajp13
worker.worker2.host=10.0.0.90
worker.worker2.port=8882
worker.worker2.lbfactor=50
worker.worker2.cachesize=10
worker.worker2.cache_timeout=600
worker.worker2.socket_keepalive=1
worker.worker2.socket_timeout=300

worker.loadbalancer.type=lb
worker.loadbalancer.sticky_session=true
worker.loadbalancer.balance_workers=worker1,worker2

worker.mystat.type=status
Ważna jest nazwa workera ( worker1 oraz worker2 ) adres IP oraz port.

- do pliku /etc/apache2/ports.conf dodaj:
Listen 8585

- zmień zawartość pliku:
/etc/apache2/mods-enabled/jk.conf na:
JKWorkersFile /etc/apache2/workers.properties

JkLogFile /var/log/apache2/mod_jk.log

JkLogLevel debug

JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

JkRequestLogFormat "%w %V %T"


- dodaj nasłuch na porcie 8585 dla mod_jk:
/etc/apache2/sites-enabled/000-default
<VirtualHost *:8585>
        JkMount /* loadbalancer
        JkMount /jkstatus mystat
</VirtualHost>



5. Konfiguracja instancji nr 1:
- Zmień plik /tcluster/instance1/conf/server.xml tak aby przypominał:
...
<Connector port="8871" protocol="HTTP/1.1" /> 
...
<Connector port="8881" protocol="AJP/1.3" redirectPort="8443" />
.... <Engine name="Catalina" defaultHost="localhost" jvmRoute="worker1"> .... <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
Connectora się odkomentowywuje, jvmRoute trzeba dopisać, pole cluster się odkomentowywuje.

- Ściągnij z internetu http://code.google.com/p/psi-probe/ plik war i umieść go w katalogu webapps. Jest to aplikacja która może się później przydać.

-Dodaj użytkowników do tomcata:

/tcluster/instance1/conf/tomcat-users.xml
<tomcat-users>
...
  <role rolename="manager"/>
  <user username="admin" password="jakieshaslo" roles="manager"/>
</tomcat-users>



- Przejdź do katalogu: /tcluster/instance1/webapps
Zmodyfikuj examples/WEB-INF/web.xml dodając distributable:
<web-app ....>
  <distributable/>
</web-app>

6. Konfiguracja instancji nr 2:
- Skopiuj zawartość pliku /tcluster/instance1 do /tcluster/instance2
- Zmień plik /tcluster/instance2/conf/server.xml tak aby zmienić:

<Server port="8006" shutdown="SHUTDOWN">
...
<Connector port="8872" protocol="HTTP/1.1" /> 
...
<Connector port="8882" protocol="AJP/1.3" redirectPort="8443" />
....
<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker2">

6. Testowanie
Uruchamiamy wszystko:


/etc/init.d/apache start
/tcluster/instance1/bin/startup.sh
/tcluster/instance2/bin/startup.sh


Testy przeprowadzić najlepiej za pomocą aplikacji z przykładów:
W moim przypadku jest to:

http://10.0.0.90:8871/examples/servlets/servlet/SessionExample

Mamy trzy porty HTTP:
- 8871 - instancja nr 1
- 8872 - instancja nr 2
- 8585 - load balancer

Po dodaniu jakiegoś aktrybutu sesji i zmianie portu z 8871 na 8872 powinniśmy mieć ten sam SessionID (Sticky-session) oraz te same atrybuty(Replikacja sesji).

7. Dodatkowa analiza:
- Panel z informacja o mod_jk:

http://10.0.0.90:8585/jkstatus

-Probe (narzędzie do monitorowania) dostępne na danej instancji:


http://10.0.0.90:8871/probe
http://10.0.0.90:8872/probe

Tuesday 3 January 2012

Komenda WC

Rekurencyjne liczenie linii kodu w danym katalogu:

wc -l `find . -type f`