12 Ekim 2014 Pazar

Spring + Quartz ile zamanlanmış görevler

Merhaba,
bu yazımda sizlere spring ve quartz entegrasyonundan bahsedeceğim. Bir projede belli aralıklarla işlem yapmak isterseniz(SMS gönderme , Mail gönderme, vs ..), bu yapıdan faydalanabilirsiniz. Ben bu projede 10 sn aralıklarla mail gönderme işlemini anlatacağım, kodları inceleyerek zamanlanmış görevler hakkında bilgi sahibi olabilirsiniz.

Öncelikli olarak intelliJ aracılığıyla bir Spring web projesi oluşturuyoruz.
Proje bittiğinde aşağıdaki yapıda olacaktır:


pom.xml dosyasına quartz dependency tanımlamalarını yaparak hemen başlayalım.

pom.xml
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>3.1.2.RELEASE</version>
        </dependency>

        <!-- Quartz API -->
        <dependency>
            <groupId>opensymphony</groupId>
            <artifactId>quartz</artifactId>
            <version>1.6.3</version>
        </dependency>

        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.directory.studio</groupId>
            <artifactId>org.apache.commons.logging</artifactId>
            <version>1.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-support</artifactId>
            <version>2.0.6</version>
        </dependency>

Web projesi oluşturduğum için projeye gelen tüm URL leri  index.jsp  sayfasına yönlendirelim. Yönlendirme yapmasak ta quartz çalışacaktır ancak yönlendirme yaparsak projeyi çalıştırdığımız bir karşılama sayfası olur ve sayfa bulunamadı hatası almayız.
HelloController .java
@Controller
@RequestMapping("/")
public class HelloController {
                @RequestMapping(method = RequestMethod.GET)
                public String printWelcome(ModelMap model) {
                               model.addAttribute("message", "Hello world!");
                               return "hello";
                }
}

scheduler için xml dosyası aracılığıyla MailReportServiceImpl .java dosyasındaki mailSend metotunu çağıracağız. Dolayısıyla bu class ve metodu hemen oluşturalım.

 MailReportServiceImpl .java
package com.company.service.impl;

import com.company.service.MailReportService;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * Created by levent.yildiz on 12.10.2014.
 */
public class MailReportServiceImpl implements MailReportService {
    @Override
    public void mailSend() {

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar calendar = Calendar.getInstance();
        String strDate = dateFormat.format(calendar.getTime());

        //TODO : development
        //Mail gönderme işlemi burada yapılacak
        System.out.println("Mail Gonderiliyor.." + strDate);
    }
}



Ve son aşamada quartz ayarlarını bir xml dosyasından yapıyoruz.
MailReportServiceImpl , MethodInvokingJobDetailFactoryBean(Quartz) ve SimpleTriggerBean(Quartz) metotlarını çağıran bean ler oluşturuyoruz.

MethodInvokingJobDetailFactoryBean metodunu çağırırken kendi yazdığımız MailReportServiceImpl  classını ve mailSend metodunu refere ediyoruz.

Birde son olarak SimpleTriggerBean metoduna bu job'un ne sıklıkla çalışması gerektiğini set ediyoruz.

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p" xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">


    <!-- Beans -->
    <bean id="mail"
          class="com.company.service.impl.MailReportServiceImpl"/>


    <bean id="methodJobDetailBean"
          class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
          p:concurrent="false" p:targetObject-ref="mail" p:targetMethod="mailSend"/>


    <!-- For Testing -->
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"
          p:jobDetail-ref="methodJobDetailBean" p:startDelay="20000"
          p:repeatInterval="10000"/>


    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
          p:waitForJobsToCompleteOnShutdown="true">
        <property name="triggers">
            <list>
                <ref bean="simpleTrigger"/>
            </list>
        </property>
    </bean>
  
</beans>


projenin çıktısı aşağıdaki gibi olacaktır:


kaynak dosyalar(github) : indirmek için tıklayın

jslt koşullu seçenekler(choose when otherwise)

Merhaba arkadaşlar,
Aslında daha önceden size jslt tarafında koşullu ifadelerin nasıl tanımlanacağını paylaşmıştım. Ancak Internet üzerinde bir araştırma yaparken stackoverflow da gözüme çarpan bir açıklama oldu. Önceki yazıyı kirletmeden yeni bir başlık altında sizlere de paylaşayım istedim. Kullanım sade ve anlaşılır olduğu için orijinal haline dokunmadan paylaşıyorum:


<c:choose>
  <c:when test="${condition1}">
    ...
  </c:when>
  <c:when test="${condition2}">
    ...
  </c:when>
  <c:otherwise>
    ...
  </c:otherwise>
</c:choose>


<c:if test="${temperature eq 'HOT' || temperature eq 'VERYHOT'}">



postgresql tip dönüştürme (casting) kullanım örneği

Merhaba, bir ders notumu(Aslında iş notu) daha sizinle paylaşmak istiyorum.
yazılım dillerinde olduğu gibi veri tabanı tarafında da tip dönüşümü(casting) işlemleri vardır. Geçenlerde böyle bir ihtiyaç oluşmuştu vt tarafında. Daha sonra tekrar lazım olur diye not etmiştim. sizinle de paylaşayım istedim.

"yıldız" string ifadesini  chracter varying türünde soyadi sütununa cast edelim
cast('yıldız' AS character varying) AS soyadi

null değerini smallint tipinde turu sütununa cast edlim
cast(null AS smallint) AS turu


örnek postgres kullanımı aşağıdadır:
select
cast('yıldız' AS character varying) AS soyadi,
cast(null AS smallint) AS turu
from table

En bilinen/kullanılan linux/unix komutları

Merhaba arkadaşlar,
Unix sistemleri öğrenmeye başladığımda en çok kullanılan komutları not etmiştim. Bu notumu sizede faydası olur diye paylaşmak istiyorum. Ayrıca bende hala Unix tarafında yeni komutlar öğreniyorum. Dolayısıyla benim Unix hazineme yeni komutlar eklendikçe bu sayfayı da güncelleyeceğim.

Şu anlık elimde olanlar aşağıdadır : 


KOMUT
AÇIKLAMA / KULLANIM
İŞLEV
Pwd
Print working directory
Bulnduğumuz directory’nin path  bilgisini verir.
Cd
Change directory
Ls
List Directory Contains
Bulunduğumuz dizindeki tüm dosyala ve dizinleri listeler.
Mkdir
Make Directory
Bulunduğumuz dizinde yeni bir klasör oluşturur.
Touch
Bulunduğumuz dizinde yeni bir dosya oluşturmak için kullanılır.
Rm
Remove
Dosya silmek için kullanılır
Mv
Move
Dosyayı taşımak için kullanılır.
Cp
Copy
Dosyayı kopyalar
Man
Short For Manual Page
Komutların kullanımını gösteren manual sayfasına gider
Grep
 cat /var/log/catalina.log | grep "error"
Regex aracılığıyla girilen değere benzer listelemeler yapar.
Sudo
Substitute User  Do
Rm -r
Rm –r directoryName
Klasörü içindeki dosyalarla birlikte siler.
Dpkg
dpkg --get-selections| grep -v deinstall > output.log
Yüklenen paketleri listeler
 Curl
  curl -I http://twitter.com/
supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP)
 locate
 Locate tomcat
 Dosyayı ismine göre arar. Regex ile arama yapar.
Passwd
passwd adm_levent
Enter new UNIX password:
Retype new UNIX password:
Unix sistemler üzerinde ki kullanıcı hesabınızın şifresini değiştirmenize olanak sağlar.
find
find -name Abc.java
Abc.java adında dosya arar
sha256sum
echo -n 'bunuşifrele' |sha256sum
Stringi sha256 ile şifreler

11 Ekim 2014 Cumartesi

Java İle Dosya İşlemleri (Okuma / Yazma / Ekleme)

Merhaba arkadaşlar,
Bayram, şehir dışı seyahatler , iş yoğunluğu derken uzun zamandır yazamıyordum.  Bu gün sizlere Java ile Dosya işlemleri nasıl yapıldığını paylaşacağım.  Bir aksilik olmazsa eğer[uyku/yorgunluk.. vs :)  ] 1-2  yazı daha yazıp proje/kaynak dosyalarıyla birlikte paylaşıyor olacağım.

Aslında her işlem de olduğu gibi dosya operasyonlarını da Javada birden fazla yöntemlerle yapabilirsiniz ancak ben burada en  bilinen yöntem olan BufferedWriter ve BufferedReader ile dosya  işlemleri yapacağım.

Öncelikle intelliJ aracılığıyla bir consol projesi oluşturalım(Web projesi oluşturarak ta aynı işlemleri yapabilirsiniz). 

Projenin yapısı(Son hali) aşağıdaki gibi olacaktır.



Dosya  işlemleri için Service paketinin altında Operations.java adında bir sınıf oluşturuyoruz.
Bu sınıfın içinde aşağıdaki isimlerde 3 tane metot olacak. 
public static void writeFile(String content) // dosya yazar 
public static void appendFile(String content) // dosyaya içerik ekler(Eski verileri silmeden)
public static void readFile(String path) // dosyadan okur


Operations.java / writeFile

    public static void writeFile(String content) {

        File file = new File("write-file.txt");

        //if file doesn't exists , then create it
        if (!file.exists())
            try {
                file.createNewFile();
            } catch (Exception e) {
                e.printStackTrace();
            }

        try {
            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(content);
            bw.close();
            System.out.println("SUCCESS..");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


Yukarıdaki metot dosyaya yazmak istediğiniz her içeriği işlerken, mevcut  dosya içeriğini temizler/ezer(override).  Eğer dosyadaki var olan içeriğe dokunmadan en alta satır eklemek istiyorsanız yapmanız gereken tek işlem var oda FileWriter'a true değerine sahip  ikinci bir parametre göndermek. Bu sayede FileWriter sınıfındaki override işlemi disable olur. Girdiğiniz içerikler ardı ardına eklenir.

Operations.java / appendFile
            FileWriter fw = new FileWriter(file.getAbsoluteFile(), true);

Operations.java / readFile
    public static void readFile(String path) {

        BufferedReader br = null;

        String sCurrentLine;
        String filePath = path;

        try {
            br = new BufferedReader(new FileReader(filePath));
            while ((sCurrentLine = br.readLine()) != null) {
                System.out.println("READ ::::: " + sCurrentLine);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }


Run.java sınıfındaki main metodu çalıştırarak console ekranından işlemlerin sonucunu görebilirsiniz.
controller/Run.java
    public static void main(String[] args) {

        System.out.println("RUNING..");

        //call writer class
        Operations op = new Operations();

        Long currDate = System.currentTimeMillis();
        Date date = new Date(currDate);
        String timeStr = date.toString();

        //content to file  + system time
        String content1 = "ilk satiri dosyaya yaz " + timeStr + "\n";
        String content2 = "ikinci satiri dosyaya yaz " + timeStr + "\n";
        String content3 = "Ucuncu  satiri dosyaya yaz " + timeStr + "\n";

        //write to file
        op.writeFile(content1);
        op.writeFile(content2);
        op.writeFile(content3);

        //append to file
        op.appendFile(content1);
        op.appendFile(content2);
        op.appendFile(content3);


        //read file
        op.readFile("C:\\read-file.txt");


    }


NOT1: okunacak dosya C:\read-file.txt  dosyasıdır. C dizininde bu dosya bulunmazsa file not found exception hatası alırsınız.

NOT2: Özel karakterlerin string'e dönüştürebilmesi için dosya path inde  ki slash ları iki kere yazın C:\read-file.txt yi C:\\read-file.txt şeklinde

Son olarak projeyi run edince aşağıdaki çıktıları üretecektir.



kaynak dosyalar(github) : indirmek için tıklayın