mercoledì 11 luglio 2012

Tomcat e JBoss insieme

Può capitare di dover utilizzare web servers diversi per la gestione di una web application.

Questo esempio prende in considerazione JBoss 6.1.0 (l'ultima versione di JBoss supportata da Netbeans) come EJB Server, e Tomcat 6.0.x come Web Server ( Tomcat è molto più leggero ma non è in grado di gestire gli EJB ).

Il problema principale è far comunicare i due Server, problema che può essere risolto così:

1) Innanzitutto le interfacce dei beans in JBoss devono essere dichiarate come remote

2) E' necessario importare determinate librerie in Tomcat, in modo che capisca come comunicare con JBoss. Tra queste c'è sicuramente il progetto dell'EJB Server; cosa molto facile con netbeans : Tasto destro sull'applicazione del web server > proprietà > libraries > add project.
Le altre fanno riferimento ad alcuni Jar di JBoss:

/client/jboss-client.jar
/client/jboss-common-core.jar
/client/jbossall-client.jar
/client/jnp-client.jar
/lib/jboss-loggin

3) Bisogna richiamare i bean remoti. Per semplicità potete creare una classe Utitlity che abbia un metodo simile:

    public Object callRemoteBean(String name) throws NamingException {
        Properties props = new Properties();
        props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
        props.setProperty("java.naming.provider.url", "jnp://localhost:1099");
        props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
        InitialContext ctx = new InitialContext(props);
        return ctx.lookup(name);

e a questo punto per richiamare il gestore di bean associato:

NomeBeanFacadeRemote nomeBeanFacade = (NomeBeanFacadeRemote) utility.callRemoteBean("NomeBeanFacade/remote");

e poi


nomeBeanFacade.find(idBean);

venerdì 6 luglio 2012

[Java] Conteggio di date e giorni lavorativi

Innanzitutto lasciamo perdere le classi Calendar e GregorianCalendar, e usiamo solamente JodaTime.

La mia situazione di partenza è una data salvata in un database (class Date), a cui devo aggiungere alcuni giorni lavorativi.
Converto Date a DateTime (package JodaTime), ecco la funzione che fa a caso nostro, prendendo in considerazione solamente i giorni dal lunedì al venerdì:

    public DateTime addLavorativeDays (DateTime startDate, int lavorativeDays){
       
       
        while (lavorativeDays>0){
           
            System.out.println(startDate.getDayOfWeek());
           
            if (startDate.getDayOfWeek()<6){
               
                startDate = startDate.plusDays(1);
                lavorativeDays--;
            }
            else {
               
                startDate = startDate.plusDays(1);
            }
           
           
        }
        return startDate;
    }

Un controllo utile è sicuramente quello che date 2 date (inizio-fine) ci riporta il numero di giorni lavorativi:


    public int returnWeeklyDays(DateTime first, DateTime second){
       
       int days=0;
       
        while ((Days.daysBetween(first, second)).getDays()!=0){
           
            if (first.getDayOfWeek()<6){
               
                days++;
            }
            first = first.plusDays(1);
       
        }
       
        return days;
    }