JBoss Code Camp - 25 sept 2008
Jag hade redan Java JDK 6 från Sun på maskinen, men installerade:
JBoss Application Server, version: 5.0.0.CR2
Eclipse IDE for EE Developers (Ganymede)
Installationen (vi bestämde att vi skulle göra en Stateless Session-böna som omvandlar mellan celsius och fahrenheit):
- Dessa packades upp i två valfria kataloger. (Jag packade upp eclipse under /usr, så att jag fick /usr/eclipse. JBoss hamnade under /usr/jboss-5.0.0.CR2, gjorde en mjuk länk så att jag fick /usr/jboss)
- Eftersom jag gör allt som min egen användare (jka) så var jag tvungen att köra sudo när jag skulle zip:a upp saker under /usr, därför fick jag ändra tillbaks rättigheterna till jka efter installationen: sudo chown -R jka:jka /usr/eclipse /usr/jboss-5.0.0.CR2
- Starta Eclipse och välj Servers-fliken högerklicka i ytan under denna och välj New->Server, Välj Jboss 5.0 och tala om i vilken katalog du installerade jboss (/usr/jboss i mitt fall)
- Starta JBoss inuti Eclipse genom att högerklicka på JBoss v5.0 och välj Start. Eftersom uppstarten tog mer är 50 sekunder (ja jag har en gammal maskin) så avbröts den automatiskt. Därför fick jag högerklicka på JBoss v5.0 igen och välja "Open" Sedan klicka upp fliken Timeouts" och öka Start-timeout:en till något mer, jag valde 500 sekunder
- Skapa ett nytt "Enterprise Application Project" (vi kallade det för HelloWorld) skapade ett nytt "EJB Project" (kallades HelloWorld2) valde att EJB-projektet ingick i "Enterprise Application Project"-projektet. När man skapade EJB-projektet fick man även ett Client-projekt (HelloWorld2Client), där man lägger klienternas implementationsinterface
- Under ejbModule-katalogen i EJB-projektet skapades Filen se.omicron.TemperatureImpl.javai, den blev så här (temperaturomvandlingsformlerna är ur minnet och kan vara fel):
package se.omicron;
import javax.ejb.Stateless;
/**
* Session Bean implementation class Temperature
*/
@Stateless
public class TemperatureImpl implements TemperatureLocal,TemperatureRemote {
/**
* Default constructor.
*/
public TemperatureImpl() {
// TODO Auto-generated constructor stub
}
public double celcius2farenheit(double c)
{
return 32.0 + 1.8*c;
}
public double farenheit2celcius(double f)
{
return (f-32.0)/1.8;
}
}
- I Motsvarande klient-projekt, skapa se.omicron.TemperatureLocal och se.omicron.TemperatureRemote, med följande innehåll: Local-gränssnittet kan användas då man gör anrop från samma JRE som App-servern kör i
package se.omicron;
import javax.ejb.Local;
@Local
public interface TemperatureLocal {
public double celcius2farenheit(double c);
public double farenheit2celcius(double f);
}
package se.omicron;
import javax.ejb.Remote;
@Remote
public interface TemperatureRemote {
public double celcius2farenheit(double c);
public double farenheit2celcius(double f);
}
- När man sparar EJB-projektet deployas det automagiskt till JBoss. För att testa applikationen gjorde vi ett nytt Java-projekt. Och skapade följande klass:
import javax.naming.InitialContext;
public class TempTest {
/**
* @param args
*/
public static void main(String[] args) {
try {
InitialContext ctx = new InitialContext();
TemperatureRemote r = (TemperatureRemote) ctx.lookup("HelloWorld/TemperatureImpl/remote");
double c=37.0;
System.out.println(c+"C = "+r.celcius2farenheit(c)+"F");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
- För att slippa sätta egenskaper i InitialContext i koden så skapade vi filen jndi.properties och la den i root-katalogen för källkoden. Den ser ut så här:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
- När vi väl insett att jndi-namnet blev "HelloWorld/TemperatureImpl/remote" fungerade det. Dessa jndi-namn konstrueras tydligen olika för olika app-servrar...
- Bifogar även en zip med hela projektet som man bara kan öppna i sin eclipse workspace