Sunday, June 21, 2009

Getting started on EJBs

I wanted to schedule some monitoring jobs in my J2EE container and intend to use EJB Timer to do it. I'm researching on good links on how to use Eclipse for EJBs.

Here are some:

EJB Fundamentals:
An Introduction to Enterprise JavaBeans
Building your first EJB

EJB on Glassfish
EJB FAQ
EJB 3 Development for Glassfish using Eclipse 3.2 Tutorial

Building EJBs in Eclipse:
WTP Tutorials - Building a Simple EJB Application
Java EJB 3 tutorial using Eclipse, Ant and JBoss Tutorial

Using EJB Timer:
Using Timers in J2EE Applications
EJB 3 Timer Service

Wednesday, June 10, 2009

Problematic JDK versions on AIX

Note: Glassfish 2.1 does not support JDK6 on AIX. 2.1.1 will support JDK6.

Version that works (JDK5):
32 bit:
java full version "J2RE 1.5.0 IBM AIX build pap32devifx-20090327 (SR9-SSU )"
64 bit:
java full version "J2RE 1.5.0 IBM AIX build pap64devifx-20090327 (SR9-SSU )"


JDK5 64-Bit
./java -fullversion
java full version "J2RE 1.5.0 IBM AIX build pap64devifx-20060124"

- Does not allow most of the -X flags in Glassfish
- If comment out -X, calls NullExcetion in thread
- Very slow

JDK6 64-Bit
./java -fullversion
java full version "JRE 1.6.0 IBM AIX build pap6460sr4-20090219_01 (SR4)"
JDK6 32-Bit
./java -fullversion
java full version "JRE 1.6.0 IBM AIX build pap3260sr4ifx-20090417_02 (SR4)"

- Throws the following error, thereafter will hang when using connection pool (see this):
recursive call into SystemOutandErrhandler
java.lang.RuntimeException: recursivecall
at com.sun.enterprise.server.logging.SystemOutandErrHandler$LoggingByteArrayOutputStream.flush(SystemOutandErrHandler.java:359)
at java.io.PrintStream.write(PrintStream.java:445)
at com.sun.enterprise.server.logging.SystemOutandErrHandler$LoggingPrintStream.write(SystemOutandErrHandler.java:293)
at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:355)
at sun.nio.cs.StreamEncoder$CharsetSE.implWrite(StreamEncoder.java:416)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:159)
at java.io.OutputStreamWriter.emptyBuffer(OutputStreamWriter.java:290)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:273)
at java.util.logging.StreamHandler.flush(StreamHandler.java:271)
at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:73)
at java.util.logging.Logger.log(Logger.java:1097)
at java.util.logging.Logger.log(Logger.java:994)
at com.sun.enterprise.server.logging.SystemOutandErrHandler$LoggingByteArrayOutputStream.flush(SystemOutandErrHandler.java:368)
at java.io.PrintStream.write(PrintStream.java:445)
at com.sun.enterprise.server.logging.SystemOutandErrHandler$LoggingPrintStream.write(SystemOutandErrHandler.java:293)
at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:355)
at sun.nio.cs.StreamEncoder$CharsetSE.implFlushBuffer(StreamEncoder.java:425)
at sun.nio.cs.StreamEncoder$CharsetSE.implFlush(StreamEncoder.java:429)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:175)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:274)
at java.util.logging.StreamHandler.flush(StreamHandler.java:271)
at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:73)
at java.util.logging.Logger.log(Logger.java:1097)
at java.util.logging.Logger.log(Logger.java:1035)
at com.sun.enterprise.server.ApplicationServer.printStartupInfo(ApplicationServer.java:618)
at com.sun.enterprise.server.ApplicationServer.onInitialization(ApplicationServer.java:170)
at com.sun.enterprise.server.ondemand.OnDemandServer.onInitialization(OnDemandServer.java:103)
at com.sun.enterprise.server.PEMain.run(PEMain.java:399)
at com.sun.enterprise.server.PEMain.main(PEMain.java:336)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:599)
at com.sun.enterprise.server.PELaunch.main(PELaunch.java:415)

Getting Java stack trace from Glassfish

If you run into problems with Glassfish (e.g. Glassfish hangs) and need to get a stack trace of the java process, here's how you do it without using jstack:

1. Start glassfish using asadmin

mclaren> asadmin stop-domain
Domain domain1 stopped.
mclaren> asadmin
Use "exit" to exit and "help" for online help.
asadmin> start-domain
Starting Domain domain1, please wait.
Default Log location is /home/affinium7/mas/tmp/glassfish/domains/domain1/logs/server.log.
Redirecting output to /home/affinium7/mas/tmp/glassfish/domains/domain1/logs/server.log
Domain domain1 is ready to receive client requests. Additional services are being started in background.
Domain [domain1] is running [Sun GlassFish Enterprise Server v2.1 (9.1.1) (build b60e-fcs)] with its configuration and logs at: [/home/affinium7/mas/tmp/glassfish/domains].
Admin Console is available at [http://localhost:4848].
Use the same port [4848] for "asadmin" commands.
User web applications are available at these URLs:
[http://localhost:8888 https://localhost:8181 ].
Following web-contexts are available:
[/web1 /__wstx-services ].
Standard JMX Clients (like JConsole) can connect to JMXServiceURL:
[service:jmx:rmi:///jndi/rmi://mclaren:8686/jmxrmi] for domain management purposes.
Domain listens on at least following ports for connections:
[8888 8181 4848 3700 3820 3920 8686 ].
Domain does not support application server clusters and other standalone instances.



2. Remain in asadmin (do not exit)

3. Open another terminal window and get the process id of the running domain
(normally this is the process running com.sun.enterprise.cli.framework.CLIMain)


mclaren> ps -ef| grep glass
affiniu7 479618 565548 120 09:44:38 pts/8 27:47 /usr/java5_64/jre/../bin/java -Dcom.sun.aas.instanceRoot=/home/affinium7/mas/tmp/glassfish/domains/domain1 -Dcom.sun.aas.ClassPathPrefix= -Dcom.sun.aas.ClassPathSuffix= -Dcom.sun.aas.ServerClassPath= -Dcom.sun.aas.classloader.appserverChainJars.ee= -Dcom.sun.aas.classloader.appserverChainJars=admin-cli.jar,admin-cli-ee.jar,j2ee-svc.jar -Dcom.sun.aas.classloader.excludesList=admin-cli.jar,appserv-upgrade.jar,sun-appserv-ant.jar -Dcom.sun.aas.classloader.optionalOverrideableChain.ee= -Dcom.sun.aas.classloader.optionalOverrideableChain=webservices-rt.jar,webservices-tools.jar -Dcom.sun.aas.classloader.serverClassPath.ee=/lib/hadbjdbc4.jar,/home/affinium7/mas/tmp/glassfish/lib/SUNWjdmk/5.1/lib/jdmkrt.jar,/lib/dbstate.jar,/lib/hadbm.jar,/lib/hadbmgt.jar,/lib/mfwk_instrum_tk.jar -Dcom.sun.aas.classloader.serverClassPath=/home/affinium7/mas/tmp/glassfish/lib/install/applications/jmsra/imqjmsra.jar,/home/affinium7/mas/tmp/glassfish/imq/lib/jaxm-api.jar,/home/affinium7/mas/tmp/glassfish/imq/lib/fscontext.jar,/home/affinium7/mas/tmp/glassfish/imq/lib/imqbroker.jar,/home/affinium7/mas/tmp/glassfish/imq/lib/imqjmx.jar,/home/affinium7/mas/tmp/glassfish/lib/ant/lib/ant.jar,/home/affinium7/mas/tmp/glassfish/lib/SUNWjdmk/5.1/lib/jdmkrt.jar -Dcom.sun.aas.classloader.sharedChainJars.ee=appserv-se.jar,appserv-ee.jar,jesmf-plugin.jar,/lib/dbstate.jar,/lib/hadbjdbc4.jar,jgroups-all.jar,/lib/mfwk_instrum_tk.jar -Dcom.sun.aas.classloader.sharedChainJars=javaee.jar,/usr/java5_64/jre/../lib/tools.jar,install/applications/jmsra/imqjmsra.jar,com-sun-commons-launcher.jar,com-sun-commons-logging.jar,/home/affinium7/mas/tmp/glassfish/imq/lib/jaxm-api.jar,/home/affinium7/mas/tmp/glassfish/imq/lib/fscontext.jar,/home/affinium7/mas/tmp/glassfish/imq/lib/imqbroker.jar,/home/affinium7/mas/tmp/glassfish/imq/lib/imqjmx.jar,/home/affinium7/mas/tmp/glassfish/imq/lib/imqxm.jar,webservices-rt.jar,webservices-tools.jar,mail.jar,appserv-jstl.jar,jmxremote_optional.jar,/home/affinium7/mas/tmp/glassfish/lib/SUNWjdmk/5.1/lib/jdmkrt.jar,activation.jar,appserv-rt.jar,appserv-admin.jar,appserv-cmp.jar,/home/affinium7/mas/tmp/glassfish/updatecenter/lib/updatecenter.jar,/home/affinium7/mas/tmp/glassfish/jbi/lib/jbi.jar,/home/affinium7/mas/tmp/glassfish/imq/lib/imqjmx.jar,/home/affinium7/mas/tmp/glassfish/lib/ant/lib/ant.jar,dbschema.jar -Dcom.sun.aas.configName=server-config -Dcom.sun.aas.configRoot=/home/affinium7/mas/tmp/glassfish/config -Dcom.sun.aas.defaultLogFile=/home/affinium7/mas/tmp/glassfish/domains/domain1/logs/server.log -Dcom.sun.aas.domainName=domain1 -Dcom.sun.aas.installRoot=/home/affinium7/mas/tmp/glassfish -Dcom.sun.aas.instanceName=server -Dcom.sun.aas.processLauncher=SE -Dcom.sun.aas.promptForIdentity=true -Dcom.sun.enterprise.config.config_environment_factory_class=com.sun.enterprise.config.serverbeans.AppserverConfigEnvironmentFactory -Dcom.sun.enterprise.overrideablejavaxpackages=javax.help,javax.portlet -Dcom.sun.enterprise.taglibs=appserv-jstl.jar,jsf-impl.jar -Dcom.sun.enterprise.taglisteners=jsf-impl.jar -Dcom.sun.updatecenter.home=/home/affinium7/mas/tmp/glassfish/updatecenter -Ddomain.name=domain1 -Djava.endorsed.dirs=/home/affinium7/mas/tmp/glassfish/lib/endorsed -Djava.ext.dirs=/usr/java5_64/jre/../lib/ext:/usr/java5_64/jre/../jre/lib/ext:/home/affinium7/mas/tmp/glassfish/domains/domain1/lib/ext:/home/affinium7/mas/tmp/glassfish/javadb/lib -Djava.library.path=/home/affinium7/mas/tmp/glassfish/lib:/home/affinium7/mas/tmp/glassfish/lib:/home/affinium7/mas/tmp/glassfish/lib -Djava.security.auth.login.config=/home/affinium7/mas/tmp/glassfish/domains/domain1/config/login.conf -Djava.security.policy=/home/affinium7/mas/tmp/glassfish/domains/domain1/config/server.policy -Djava.util.logging.manager=com.sun.enterprise.server.logging.ServerLogManager -Djavax.management.builder.initial=com.sun.enterprise.admin.server.core.jmx.AppServerMBeanServerBuilder -Djavax.net.ssl.keyStore=/home/affinium7/mas/tmp/glassfish/domains/domain1/config/keystore.jks -Djavax.net.ssl.trustStore=/home/affinium7/mas/tmp/glassfish/domains/domain1/config/cacerts.jks -Djdbc.drivers=org.apache.derby.jdbc.ClientDriver -Djmx.invoke.getters=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Xmx512m -cp /home/affinium7/mas/tmp/glassfish/lib/jhall.jar:/home/affinium7/mas/tmp/glassfish/lib/appserv-launch.jar:/home/affinium7/mas/tmp/glassfish/domains/domain1/lib/log4j com.sun.enterprise.server.PELaunch start
affiniu7 508166 610564 0 10:11:12 pts/6 0:00 grep glass
affiniu7 565548 729806 0 09:44:27 pts/8 0:15 /usr/java5_64/jre/../bin/java -Dcom.sun.aas.instanceName=server -Djava.library.path=/home/affinium7/mas/tmp/glassfish/lib:/home/affinium7/mas/tmp/glassfish/lib:/home/affinium7/mas/tmp/glassfish/lib -Dcom.sun.aas.configRoot=/home/affinium7/mas/tmp/glassfish/config -Djava.endorsed.dirs=/home/affinium7/mas/tmp/glassfish/lib/endorsed -Dcom.sun.aas.processLauncher=SE -cp /home/affinium7/mas/tmp/glassfish/javadb/lib/derby.jar:/home/affinium7/mas/tmp/glassfish/jbi/lib/jbi-admin-cli.jar:/home/affinium7/mas/tmp/glassfish/jbi/lib/jbi-admin-common.jar:/home/affinium7/mas/tmp/glassfish/lib:/home/affinium7/mas/tmp/glassfish/lib/comms-appserv-rt.jar:/home/affinium7/mas/tmp/glassfish/lib/appserv-rt.jar:/home/affinium7/mas/tmp/glassfish/lib/appserv-ext.jar:/home/affinium7/mas/tmp/glassfish/lib/javaee.jar:/home/affinium7/mas/tmp/glassfish/lib/appserv-se.jar:/home/affinium7/mas/tmp/glassfish/lib/comms-appserv-admin-cli.jar:/home/affinium7/mas/tmp/glassfish/lib/admin-cli.jar:/home/affinium7/mas/tmp/glassfish/lib/appserv-admin.jar:/home/affinium7/mas/tmp/glassfish/lib/commons-launcher.jar:/home/affinium7/mas/tmp/glassfish/lib/install/applications/jmsra/imqjmsra.jar -Dcom.sun.appserv.admin.pluggable.features=com.sun.enterprise.ee.admin.pluggable.EEClientPluggableFeatureImpl com.sun.enterprise.cli.framework.CLIMain


4. Do a kill -3

mclaren> kill -3 565548

5. Switch back to asadmin terminal and you will see the location of the stack trace:

asadmin> JVMDUMP006I Processing Dump Event "user", detail "" - Please Wait.
JVMDUMP007I JVM Requesting Java Dump using '/home/affinium7/mas/tmp/glassfish/bin/javacore.20090610.101131.565548.txt'
JVMDUMP010I Java Dump written to /home/affinium7/mas/tmp/glassfish/bin/javacore.20090610.101131.565548.txt
JVMDUMP013I Processed Dump Event "user", detail "".


6. View the file to debug further :-)

Problems installing Glassfish on AIX with JDK1.5

If you are using an older version of JDK1.5 on AIX, you may encounter the following errors when starting up glassfish:

> asadmin start-domain
Starting Domain domain1, please wait.
Default Log location is /home/affinium7/mas/tmp/glassfish/domains/domain1/logs/server.log.
Redirecting output to /home/affinium7/mas/tmp/glassfish/domains/domain1/logs/server.log
JVMJ9VM007E Command-line option unrecognised: -client
Could not create the Java virtual machine.

Usage: java [-options] class [args...]
(to execute a class)
or java [-jar] [-options] jarfile [args...]
(to execute a jar file)

where options include:
-cp -classpath
set search path for application classes and resources
-D=
set a system property
-verbose[:class|gc|jni]
enable verbose output
-version print product version
-version:
require the specified version to run
-showversion print product version and continue
-jre-restrict-search | -no-jre-restrict-search
include/exclude user private JREs in the version search
-agentlib:[=]
load native agent library , e.g. -agentlib:hprof
see also, -agentlib:jdwp=help and -agentlib:hprof=help
-agentpath:[=]
load native agent library by full pathname
-javaagent:[=]
load Java programming language agent, see java.lang.instrument
-? -help print this help message
-X print help on non-standard options
-assert print help on assert options



Check your JDK Version using the command "java -fullversion":

> java -fullversion
java full version "J2RE 1.5.0 IBM AIX build pap64devifx-20060124"
>


The above is an old version, you will need to upgrade it (get the Sys Admin to do it)

Or, you can do the following:
1. In /domains/domain1/config/domain.xml , comment off:
-XX:MaxPermSize=192m
-client
-XX:NewRatio=2

2. In /lib/processLauncher.xml, comment off:




You should be able to do a start-domain now.

Friday, June 5, 2009

Java Decompilers

My harddisk gave up on me 2 days ago. I lost tonnes of data and files including more than a week's work of development. If you still have the class files, decompilers can help to save time in re-writing your code.

I found a very good list of java decompilers, if you should need it. Check it out here.

Thursday, June 4, 2009

Configuring log4j in Glassfish

I've found several links on how to configure log4j in Glassfish but it didn't work for me.

Here's what worked:

1. Copy the following jars to glassfish\lib:
log4j-1.2.15.jar
commons-logging-1.1.1.jar

2. Create a directory called logging under \glassfish\domains\domain1\lib

3. Copy log4j.properties to the logging directory created in Step 2

4. Login to admin console of Glassfish and navigate to:
Application Server > JVM Settings > Path Settings

5. Add the logging subdirectory created in Step 2 to System Classpath

6. Click Save and Restart Glassfish

7. Check that the logs are created

8. If the logs are not created:
- check your log4j.properties (class names must match)
- exit from asadmin after you stop domain (if you are in asadmin)

JAX-WS Links

Here's a compilation of JAX-WS links I've found useful:

Official JAX-WS FAQ
Web Services Made Easy with JAX-WS 2.0
Introducing JAX-WS 2.0 With the Java SE 6 Platform