30 Nisan 2019 Salı

Tomcat

Giriş
Tomcat tam bir J2EE Application Server değil. J2EE standardındaki herşeyi gerçekleştirmiyor. Açıklaması şöyle. JSP ölü bir teknoloji olduğuna göre ben sadece Servlet Container olarak düşünüyorum.
The Apache Tomcat® software is an open source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies.
Zip Olarak Kurulum
Tomcat Zip Olarak Kurulum yazısına taşıdım.

Service Olarak Kurulum
Tomcat Servis Olarak Kurulum yazısına taşıdım.

Docker Olarak Kurulum
war dosyaları "/usr/local/tomcat/webapps/" dizinine kopyalanır

Örnek
Şöyle yaparız
FROM tomcat:9.0.64-jre11    (the chosen DockerHub image)
ADD target/provman.war /usr/local/tomcat/webapps/ 
                            (The relative location of your WAR file)
EXPOSE 8080     (The port that the Docker container will listen to) 
Çalıştırmak için şöyle yaparız
docker build -t provman .      (don’t forget the dot!)
docker run -p 80:8080 provman  
Örnek
Şöyle yaparız
From tomcat
COPY ./target/hello-world.war /usr/local/tomcat/webapps

Locale
-Duser.language=en -Duser.country=US ile Tomcat Türkçe bir makinede Amerikan locale ile çalıştırılır. Bu bazen Java'nın toUpperCase() metodu ile çıkarttığı problemi aşmamıza yardımcı olur.

URL Yolu
Tomcat http isteklerini yüklü olan war'ların URL'lerinin en uzunundan başlayarak bulmaya çalışır.
İki tane war yüklü olsun.
İlki ROOT.war, context = /
İkincisi ise api#v1.war, context = /api/v1/
olsun

Şu istek farklı bir yere GET http://<hostname>/api/someMethod
Şu istek farklı bir yere GET http://<hostname>/api/v1/someMethod
gider.

Context.xml
TOMCAT_HOME\conf\context.xml dosyasıdır.

JNDI - DataSource
Açıklaması şöyle
NOTE - The default data source support in Tomcat is based on the DBCP connection pool from the Commons project. However, it is possible to use any other connection pool that implements javax.sql.DataSource, by writing your own custom resource factory, as described below.
JNDI ayarı şöyle yapılır.
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/eatST">
<Resource 
    name="jdbc/test"
    auth="Container" 
    type="javax.sql.DataSource"
    maxActive="100" 
    maxIdle="30" 
    maxWait="10000" 
    username="root"
    password="123" 
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/test?
         useUnicode=true&amp;characterEncoding=UTF8"
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
 />
 </Context>
catalina.properties dosyasındaki değerleri kullanarak şöyle yaparız.
<Resource name="${tomcat.dbpool.ups.quartz.resourcename}" auth="Container"
  type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
  url="${tomcat.dbpool.ups.quartz.connectionurl}"
  username="${tomcat.dbpool.ups.quartz.username}"
  password="${tomcat.dbpool.ups.quartz.password}"
  maxTotal="${tomcat.dbpool.ups.quartz.maxTotal}"
  maxIdle="${tomcat.dbpool.ups.quartz.maxIdle}"
  minIdle="${tomcat.dbpool.ups.quartz.minIdle}"
  maxWaitMillis="${tomcat.dbpool.ups.quartz.maxWaitMillis}"
  validationQueryTimeout="${tomcat.dbpool.ups.quartz.validationQueryTimeout}"
  testWhileIdle="true"
  removeAbandonedOnMaintenance="true"
  timeBetweenEvictionRunsMillis="..."
  minEvictableIdleTimeMillis="..."
 />
maxIdle bağlantılar boşa çıksa bile kaç tane açık tutulacağını belirtir. 2 olarak belirtmek için şöyle yaparız. maxActive en fazla kaç bağlantı açılacağını belirtir.
<Resource
   name=XXXXX
   type=xxxxx
   username=xxxxx
   password=xxxxxx
   driverClassName=xxxxx
   maxIdle=2
   url=xxxxx
   maxActive=10
/>

Realm Nedir?
Kullanıcıları yetkilendiren sisteme verilen isim.

JDBCRealm
Kullanıcıyı, veritabanındaki bir tabloya bakarak yetkilendirir.
<Realm localDataSource="true" debug="99"
    className="org.apache.catalina.realm.JDBCRealm" connectionName="user"
    connectionPassword="password" connectionURL="jdbc:mysql://localhost:3306/ ccc"
    digest="md5" driverName="com.mysql.jdbc.Driver" roleNameCol="role_name"
    userCredCol="password" userNameCol="email_id"
    userRoleTable="users_list" userTable="user_list_view" />
Combined Realm
Combined Realm istemciyi bir veya daha fazla datasource ile authenticate edebilir.

Session
Persistent session yani tomcat tekrar başlatılınca session'ları hatırlasın istemezsek, session'ların kaydedildiği dizini boş tanımlarız. Şöyle yaparız.
<!-- Uncomment this to disable session persistence across Tomcat restarts -->

<Manager pathname="" />
Eğer session bilgisini Redis üzerinde saklamak istersek şöyle yaparız.
<Manager className="org.redisson.tomcat.RedissonSessionManager"

   configPath="${catalina.base}/redisson.conf" readMode="MEMORY" updateMode="DEFAULT"/>

Server.xml
Tomcat Server.xml yazısına taşıdım.

Remote Debug
Eclipse ile uzaktaki bir Tomcat üzerindeki uygulamayı debug etmek için eclipse debug remote web application başlıklı yazıya bakılabilir.

startup.bat dosyası ayarları
Sunucu Tomcat.exe kullanılarak başlatılmaz. startup.bat ile başlatılır.
startup.bat dosyası catalina.bat dosyasını çağırıyor.

CATALINA_OPTS
startup.bat dosyası içinde CATALINA_OPTS değişkeni tanımlanarak çeşitli JVM ayarları yapmak mümkün. Örnek :
export CATALINA_OPTS=-Xms16m -Xmx256m;
catalina.bat dosyası ayarları
JAVA_OPTS
Örnek:
set JAVA_OPTS="-Djava.library.path=/usr/tomcat/shared/lib"
Bir diğer örnekte ise gelen HTTP isteklerini loglamak mümkün.
export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true"

CATALINA_HOME\lib
Eğer ClassNotFoundException exception alınırsa gerekli olan jar dosyalarını bu dizine kopyalamak mümkün. Ancak bu dizin tomcat üzerine çalışan tüm uygulamalar tarafından ortak kullanıldığından, jar dosyaları arasında sürüm farkından dolayı sorun da çıkarabilir.

Tomcat'in ilk kurulumunda bazı jar dosyaları bu dizinden geliyor. Örneğin servlet 3.0 api'si servlet-api.jar dosyasında mevcut.




Hiç yorum yok:

Yorum Gönder