08. maj 2005 - 20:53
Der er
25 kommentarer og 1 løsning
Hvordan gør jeg et java program til en dæmon ?
Jeg har lavet et lille program der overvåger en mail konto. Det her program vil jeg gerne havde til at køre som en dæmon på min linux box. Hvordan gør jeg lettes det, nogle forslag? Mvh
Annonceindlæg fra Infor
starter det hele java -classpath ... ... som et baggrunds job altså ikke noget specielt Java - ren Linux
Hvis du allerede har kørende en Tomcat eller en JBoss så kunne du jo lade noget kode inden i den blive kørt af en timer
eller sætte den til at køre vha. cron hvert 5. min fx
kunne jeg lade den køre i min jboss server??
HA HA ;-) hvordan gør jeg så det?
flere muligheder 1) deploye quartz web app i JBoss 2) bruge den scheduler som har været indbygget i JBoss siden version 2.4 3) bruge den måde at sætte scheduler op på som er ny i J2EE 1.4
re 1 & 2) dem har jeg eksempler på
Men hvis jeg bruger scheduler, køre jeg så ikke bare programmet en gang hver x sek/min/timer alt efter hvad jeg vægler ?? For hvis jeg gør det kan jeg ikke helt bruge det for det gør jeg allerede i mit program.
quarts eksempel: import java.text.ParseException; import javax.servlet.http.HttpServlet; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory; public class QServlet extends HttpServlet { private SchedulerFactory sf; private Scheduler s; public void init() { try { sf = new StdSchedulerFactory(); s = sf.getScheduler(); s.start(); s.scheduleJob(new JobDetail("test", Scheduler.DEFAULT_GROUP,QServletJob.class), new CronTrigger("test", Scheduler.DEFAULT_GROUP, "0/15 * * * * ?")); s.scheduleJob(new JobDetail("test2", Scheduler.DEFAULT_GROUP,QServletJob2.class), new CronTrigger("test2", Scheduler.DEFAULT_GROUP, "0/5 * * * * ?")); } catch (SchedulerException e) { } catch (ParseException e) { } } public void destroy() { try { s.shutdown(); } catch (SchedulerException e) { } } } import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class QServletJob implements Job { public void execute(JobExecutionContext ctx) throws JobExecutionException { System.out.println("Det virker"); } } import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class QServletJob2 implements Job { public void execute(JobExecutionContext ctx) throws JobExecutionException { System.out.println("Det virker stadig"); } }
nej - en scheduler fungerer ved at beder JBoss om at køre noget given kode automatisk med et givent interval og du kan jo f.eks. bede den om det i en startup servlet
JBoss eksempel: import java.util.Date; import org.jboss.varia.scheduler.Schedulable; public class HelloWorld implements Schedulable { public HelloWorld() { super(); } public void perform(Date timeOfCall, long remainingRepetitions) { System.out.println("Hello world"); } } <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE server> <server> <classpath codebase="deploy" archives="mysch.jar"/> <mbean code="org.jboss.varia.scheduler.Scheduler" name=":service=Scheduler"> <attribute name="StartAtStartup">true</attribute> <attribute name="SchedulableClass">HelloWorld</attribute> <attribute name="InitialStartDate">0</attribute> <attribute name="SchedulePeriod">10000</attribute> <attribute name="InitialRepetitions">-1</attribute> </mbean> </server>
Hvad er en quick and dirty way at gøre det på?? For al koden skal skrives om til session og entiy beans. Jeg har kun lavet programmet for at test nogle ting med hibernate og POI.
men Jboss måden at gøre det på ser sku da meget nem ud. Tro jeg vil kaste mig over den.
Både quartz og JBoss kan jo løses med <50 linier så ikke de store problemer.
Prøv den. Jeg har testet den med 2.x og 3.x men dog aldrig med 4.x
Har lige en hurtigt ekstra spørgsmål hvis du da har tid til det. Jeg har lavet en webapplication der benytter nogle session beans som backend. Nu har jeg jo det store spørgsmål om state. Hvor skal jeg lægge det i min httpsession eller i en statefull sessionbean. Jeg er så kommet frem til at alt hvad der har med min http at gøre frem og tilbage mellem sider, forms og alt det der lægger jeg i min httpsession. Også laver jeg en statefull sessionbean som jeg klader "bruger" hvor i jeg lægger alt bruger specifike oplysninger i. For så kan jeg vel også bruger den i andre sammen hæng end i http, feks i en gui interface. Er det en "rigtigt" måde at gøre det på, eller har jeg skudt helt forbi? Husk også lige og lægge et svar så jeg kan give point. Og mange tak
HTTP sessions versus stateful session beans er et af de store klassiske spørgsmål. Og man bliver formentligt aldrig enig om hvad der er bedst. Jeg tror selv at jeg vil lade de afhænge lidt af hvordan de 2 passer ind i den konkrete problem stilling. Fat client er et klassisk argument for stateful session bean men også der kan man jo bruge web service og dermed HTTP session.
Har du et godt link til en godt artikel om det??
Enterprise Patterns / Fowler har lidt
Mange tak endnu en gang for hjælpen.
Kurser inden for grundlæggende programmering