[ zmau @ 26.06.2009. 11:41 ] @
Treba na jbossu da napravim moduo koji će da komunicira sa FTP serverom i da reaguje kad god se na određenu lokaciju snimi nov fajl. FTP server sam našao. Ostaje mi problem kako da nateram jboss da pokrene diplojovani ejb (ili bilo koji moj algoritam, nije bitno da bude ejb) odmah pri startovanju, tako da klijent ne mora eksplicitno da okida metodu ejba, nego da ejb (odnosno neka njegova metoda) bukvalno počne da se izvršava pri startovanju jbossa.
[ gajo2 @ 26.06.2009. 12:23 ] @
Jel ti odgovara da postavis neki scheduler koji ce recimo svakih 10 sekundi proveravati da li se nesto izmenilo u direktorijumu?
[ zmau @ 26.06.2009. 12:48 ] @
Hm, možda se nismo razumeli.
Ja već imam mehanizam koji reaguje čim se desi ftp upload, tako da mi to nije sporno. Ali ne umem da ga pokrenem, da počne da osluškuje.

Mada bi mi i scheduler bio prihvatljiv. Kako misliš da pokreneš taj scheduler ?
[ gajo2 @ 26.06.2009. 14:09 ] @
Aha pa zasto samo ne napravis jedan listener koji ce da pokrene taj modul? Mislim da se listeneri uvek izvrsavaju kada se pokrene web aplikacija...

Za ovaj scheduler, mozes koristiti Quartz, koji je integrisan u Spring pa mozda i u EJB, a mozes ga koristiti i samostalno.
Ja sam jednom napisao jedan programcic koji proverava postu pa ako ima nesto novo onda napravi sms od njega. Uglavnom ovo je web.xml:
Code:
<?xml version="1.0"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
    version="2.4">
  <listener>
      <listener-class>hello.NotesScheduler</listener-class>
  </listener>
  <env-entry>
      <env-entry-name>cronExpression</env-entry-name>
      <env-entry-type>java.lang.String</env-entry-type>
      <env-entry-value>0 0/2 * * * ?</env-entry-value>
  </env-entry>
</web-app>

Listener klasa:
Code:
package hello;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.sql.DataSource;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import org.apache.log4j.*;

public class NotesScheduler implements ServletContextListener {
    
    private static Logger log = Logger.getLogger(NotesScheduler.class);
    
    private Scheduler scheduler;

    public void contextInitialized(ServletContextEvent sce) {
        try {
            log.info("Starting Notes Scheduler...");
            
            Context iContext = new InitialContext();
            
            scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.start();
            
            JobDetail jd = new JobDetail("Notes check", "notes", NotesCheck.class);
            jd.getJobDataMap().put("type", "FULL");
            CronTrigger trigger = new CronTrigger("Notes check", "notes");
            trigger.setCronExpression((String)iContext.lookup(Consts.CRON_EXPRESSION));  // every minute
            scheduler.scheduleJob(jd, trigger);
            
        } catch (Exception ex) {
            log.error("Error starting the Notes scheduler: " + Util.getStackTrace(ex));
        }
    }
    
    public void contextDestroyed(ServletContextEvent sce) {
        try {
            log.info("Shutting down Notes Scheduler...");
            scheduler.shutdown();
        } catch (Exception ex) {
            log.error("Error shutting down the Notes scheduler: " + Util.getStackTrace(ex));
        }
    }

}

Tamo gde pise trigger.setCronExpression() tamo se cita cron expression iz web.xml-a, tj. da se posao izvrsava svaki minut.
Zatim napravis Job klasu, koja ce vec da proverava ftp, tj. ono sto kazes da vec imas.
[ zmau @ 26.06.2009. 14:44 ] @
Hm. Uopšte ne pravim web aplikaciju. Pravim čist server. Tako da se nisam baš petljao sa web.xml deskriptorom. Videću da nađem u jbossu nešto što se tako zove pa da probam u njega da ispišem to što si mi predložio.

Btw, ima li web.xml suštinske veze sa web aplikacijama, ili se samo tako zove :) ?

[Ovu poruku je menjao zmau dana 26.06.2009. u 16:12 GMT+1]
[ hyle @ 26.06.2009. 15:00 ] @
Evo pogledaj ovo: http://www.jboss.org/community/wiki/Scheduler

Moje poslednje iskustvo sa JBoss-om je u verziji 3.2.x i tada nisi morao da dodaješ ovaj dependency na Timer service.
Parametar InitialRepetitions postavi na 1 i onda će se scheduler izvršiti samo jednom, prilikom podizanja servera.

Fajl scheduler-service.xml sam stavljao u deploy/deploy.last i to mi je garantovalo da će se scheduler pokrenuti tek kada se završi deploy ostalih servisa.
[ zmau @ 26.06.2009. 17:27 ] @
Bravo, Hyle, to je to. Pošto sam upravo sad odradio, ispisaću malo sažvakaniju verziju uputstva :
- Napravi klasu koja implementira org.jboss.varia.scheduler.Schedulable. U njenoj perform metodi treba da bude algoritam koji se okida.
- U jbossovom deploy folderu postoji fajl scheduler-service.xml. U njemu otkomentarisati <mbean code="org.jboss.varia.scheduler.Scheduler"..., među parametrima zadati naziv svoje klase, podesiti parametre za konstruktor, i ostale... i to je manje više to. Po potrebi iskoristiti foru sa deploy.last folderom.

Koristan link : https://www.redhat.gl/docs/man...aria.scheduler.Scheduler_.html.


Hvala lepo, momci.
[ mvasicdo @ 20.10.2009. 18:18 ] @
Hm, mozda i ovo moze pomoci:

Code:

@Stateful
@Name("startupAction")
@Scope(ScopeType.APPLICATION)
@Startup(depends = { "org.jboss.core.jndi", "org.jboss.core.jta", "org.jboss.seam.core.ejb" })
public class StartupAction implements StartupActionLocal {
...
...
...
}


Pozdrav...