piątek, 2 listopada 2007

Quartz cz. 1

Ostatnio miałem zintegrować Quartz-a z aplikacją webową działającą na Tomcat-cie. Quartz to biblioteka służąca do zarządzania zdarzeniami, które mają się wykonywać w pewnych, określonych momentach czasu. Te 'momenty' można zdefiniować jako np. co 5 sekund lub za pomocą wzorca, czyli np. 'każdy piątek 18:00'.
Można w ten sposób wysyłać użytkownikom co miesiąc jakieś związane z jego aktywnością raporty.
Co trzeba zrobić, żeby użyć Quartz-a w swojej aplikacji? Niewiele.
1. Ściągamy Quartza 1.6 ze strony
2. Dodajemy go sobie do zbioru bibliotek projektu. U mnie było to określone w pliku lib.properties, w katalogu z bibliotekami.
Plik quartz-all-1.6.0.jar skopiowałem do \lib\quartz-1.6.0
a do lib.properties dodałem
quartz.version=1.6.0
quartz.dir=${lib.dir}/quartz-${quartz.version}
quartz.jar=${quartz.dir}/quartz-all-${quartz.version}.jar
3. Jeżeli mamy w projekcie zintegrowanego Springa 2.0, to pozostaje:
3a. utworzyć plik konfiguracyjny applicationContext-quartz.xml i zapisać go w katalogu WEB-INF.

U mnie wygląda następująco:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<bean id="outdatetProjectsMailSender" class="pl.unizeto.unitrack.quartz.OutdatedProjectsMailSender">
<property name="userManager"><ref bean="userManager"/></property>
<property name="userTaskManager"><ref bean="userTaskManager"/></property>
</bean>


<bean id="dummyJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject"><ref bean="outdatetProjectsMailSender"/></property>
<property name="targetMethod"><value>sendEmails</value></property>
</bean>


<bean id="dummyCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="dummyJobDetail"/>
</property>
<property name="cronExpression">
<value>0/10 * * * * ?</value>
</property>
</bean>


<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="autoStartup" value="true"/>
<property name="waitForJobsToCompleteOnShutdown" value="true"/>
<property name="quartzProperties">
<props>
<!-- Plugins -->
<prop key="org.quartz.plugin.shutdownhook.class">
org.quartz.plugins.management.ShutdownHookPlugin
</prop>
<prop key="org.quartz.plugin.shutdownhook.cleanShutdown">true</prop>
</props>
</property>
<property name="triggers">
<list>
<ref bean="dummyCronTrigger"/>
</list>
</property>
</bean>

</beans>


Co to wszystko znaczy? Ciąg dalszy w następnym poście!

wtorek, 30 października 2007

Eclipse 3.3 vs NetBeans 6.0 beta 2

Od ponad roku używam Eclipse do małych, złożonych z kilku (nastu) klas projektów. Do tej pory pracowałem w Visual C++ 6.0 z plugin-em WholeTomato oraz BCB 5 i 6. To, co mi się do tej pory rzuciło w oczy to między innymi błyskawiczna kompilacja w porównaniu z tymi kompilatorami C++, szybka i sensowna podpowiedź kontekstowa w edytorze, fantastyczne podpowiedzi przy błędach typu 'jaki błąd tutaj popełniłeś i jak go można poprawić' - Ctrl + 1.
Muszę przyznać, że dzięki Eclipse polubiłem programowanie w Javie.
Kilka dni temu zauważyłem że pojawiła się beta 2 konkurencyjnego środowiska, NetBeans.
Czy jest lepsze od Eclipse? Ponieważ nigdy wcześniej go nie używałem, na świeżo w miarę mojego wgłębiania się w nie spróbuję odpowiedzieć na to pytanie. Lub chociaż wyrobić sobie jakieś zdanie :)
Jeżeli już mamy JDK, to wystarczy ściągnąć 20 MB instalkę, żeby móc cieszyć się wersję IDE dla Java SE. Dla EE instalka ma 95 MB ze względu na dołączenie Glassfisha, Tomcata i związanych z tym funkcjonalności.
Teraz biorę się za pierwszy próbny projekt :)

A tu mam tutorial, który pewnie również przejdę:
http://youtube.com/watch?v=MC2DiUibMoQ

poniedziałek, 29 października 2007

Shutdown Hook

Jak się okazuje, można w miarę łatwo przechwycić w Javie zdarzenie zamykania maszyny wirtualnej. Wystarczy dodać w taki sposób obiekt dziedziczący z klasy Thread (u mnie nazywa się po prostu ShutdownThread):

Runtime.getRuntime().addShutdownHook(new ShutdownThread());

To co ma być zrobione zamieszczamy w metodzie public void run().
Tak więc nasz obiekt jest wątkiem, który jest zainicjalizowany przez konstruktor, ale nie wywołano start();