30 Mart 2018 Cuma

Java 9 Flow.Processor Arayüzü

Giriş
Hem Subscriber hem Publisher olarak davranır.

Tanımlama
Şöyle yaparız. SubmissionPublisher'dan kalıtarak asenkron publisher olur.
public class MyProcessor<T, R> extends SubmissionPublisher<R>
                               implements Flow.Processor<T, R> {       
  private Function function;
  MyProcessor(Function<? super T, ? extends R> function) {  
    super();  
    this.function = function;  
  } 
  ...
} 
onComplete metodu
İşlenecek veri kalmamıştır. Örnek ver.

onError metodu
Ölümcül bir hata olmuştur. Örnek ver.

onNext metodu
İşlenecek yeni veri gelmiştir.
Örnek ver.

onSubscribe metodu
Subscription nesnesi saklanır ve bu nesnenin request() metodu çağrılır.
Örnek ver.



29 Mart 2018 Perşembe

Tomcat setenv.sh

Giriş
Bu dosyanın ismi Linux'ta ise setenv.sh, Windows'ta setenv.bat. Bu dosya içinde ortam değişkenleri tanımlanır. Ortam değişkenleri için Linux'ta export komutu kullanılır. Windows'ta ise SET komutu kullanılır.

Dosya Yolu
Dosyanın yolu Linux'ta şöyledir.
/usr/share/tomcat8/bin
Bazen de şöyledir.
/usr/local/tomcat8/bin
Eclipse ile open launch configuration -> Environment sekmesine yazılan değerler bu dosyaya kaydedilir.

CATALINA_OPTS
Açıklaması şöyle. Sadece Tomcat'e mahsus ayarları içerir.
#   CATALINA_OPTS   (Optional) Java runtime options used when the "start",
#                   "run" or "debug" command is executed.
#                   Include here and not in JAVA_OPTS all options, that should
#                   only be used by Tomcat itself, not by the stop process,
#                   the version command etc.
#                   Examples are heap size, GC logging, JMX ports etc.

#   JAVA_OPTS       (Optional) Java runtime options used when any command
#                   is executed.
#                   Include here and not in CATALINA_OPTS all options, that
#                   should be used by Tomcat and also by the stop process,
#                   the version command etc.
#                   Most options should go into CATALINA_OPTS.
Örnek
Şöyle yaparız.
#! /bin/sh
export CATALINA_OPTS="$CATALINA_OPTS -Xmx1024m"
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
Örnek
Şöyle yaparız.
SET CATALINA_OPTS=-Xmx4g -XX:PermSize=128m -XX:MaxPermSize=512m 
  -Djava.library.path=D:\Engineering\apache-tomcat-7.0.50\dll
Örnek
Şöyle yaparız.
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/tomcat8/so"
export JAVA_OPTS="-server -Xmx38g -Djava.library.path=/usr/local/tomcat8/so"
export CATALINA_OPTS="-Djava.library.path=/usr/local/tomcat8/so"
JAVA_OPTS
Örnek
Sadece IPv4 adresleri kullansın istersek şöyle yaparız.
JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true
  -Djava.net.preferIPv4Addresses"
JRE_HOME
Eğer sistem için değil de Tomcat'e mahsus bir JRE tanımlamak istersek CATALINA_BASE\bin altına setenv.bat veya setenv.sh dosyası oluşturur ve içine şöyle yazarız.
set "JRE_HOME=C:\Program Files\Java\jdk1.7.0_03\jre"
exit /b 0

StaX XMLStreamReader Arayüzü

Giriş
Büyük XML dosyalarını okumak için kullanılır.

constructor
Şöyle yaparız.
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
XMLStreamReader reader = inputFactory.createXMLStreamReader(xmlInputReader);
hasNext metodu
Şöyle yaparız.
XMLStreamReader reader = ...

StringBuilder sb = new StringBuilder();
while (reader.hasNext()) {
  reader.next();
  if (reader.hasText())
    sb.append(reader.getText());
}
next metodu
Şöyle yaparız.
while (reader.hasNext()) {
  // Check for start elements
  int type = reader.next();
  if (type == XMLStreamConstants.START_ELEMENT) {

    String elementName = reader.getLocalName();
    ...
  }
}

Semaphore Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.util.concurrent.Semaphore;
Açıklaması şöyle. Senkronizasyon için semaphore yine mutex ile beraber kullanılır.
Conceptually, a semaphore maintains a set of permits. Each acquire blocks if necessary until a permit is available, and then takes it. Each release adds a permit, potentially releasing a blocking acquirer. However, no actual permit objects are used; the Semaphore just keeps a count of the number available and acts accordingly.
Açıklaması şöyle
Semaphores are often used to restrict the number of threads than can access some (physical or logical) resource
constructor
İmzası şöyle.
Semaphore(int permits, boolean fair)
Açıklaması şöyle.
Generally, semaphores used to control resource access should be initialized as fair, to ensure that no thread is starved out from accessing a resource. When using semaphores for other kinds of synchronization control, the throughput advantages of non-fair ordering often outweigh fairness considerations.
Örnek
Şöyle yaparız. Böylece önce release() çağrısının yapılmasını şart koşarız.
Semaphore sem = new Semaphore(0);
acquire metodu
Şöyle yaparız.
semaphore.acquire();
acquire metodu - int
Şöyle yaparız.
semaphore.acquire(2);
getQueueLength metodu
Örnek
Şöyle yaparız. Bu yöntem çok doğru mu bilmiyorum ama kabaca semaphore üzerinde bekleyen bir thread gelinceye kadar "busy spin" yapar.
public void waitSemaphore() {
  while (semaphore.getQueueLength() > 0) {
  }
}
release metodu
Şöyle yaparız.
semaphore.release();
release metodu - int
Şöyle yaparız.
semaphore.release(2);
tryAcquire metodu
Şöyle yaparız.
if (semaphore.tryAcquire()) {...}