Wednesday, January 31, 2007

Developing the JEE application, how tears appeared in my eyes... [an update]

Hi,

Last night I blogged about my misfortunes with NB's JEE support and promised to keep on updating while I thought I was making progress. And there's something more to tell.

And some progress was made since my previous blog. I found out that I can actually run the application and test the WS from the IDE (right-click on the WS and test it), but I can't debug the application. That results in errors.
When I start debugging the application, I get the following output in NB's output window for ANT:

pre-init:
init-private:
init-userdir:
init-user:
init-project:
do-init:
post-init:
init-check:
init:
deps-jar:
deps-j2ee-archive:
pre-pre-compile:
pre-compile:
do-compile:
post-compile:
compile:
pre-dist:
do-dist-without-manifest:
do-dist-with-manifest:
post-dist:
dist:
run-debug:
Distributing
C:\Iwan\SticktailGames\projects\FriendOrFoe\backend\IFFServer\dist\IFFServer
.ear to [localhost:4848_server]
Start registering the project's server resources
Finished registering server resources
deployment started : 0%
deployment finished : 100%
Deploying application in domain completed successfully
Trying to create reference for application in target server completed
successfully
Trying to start application in target server completed successfully
WARNING:
JDO76614: Deployment encountered SQL Exceptions:
JDO76609: Got SQLException executing statement "CREATE TABLE
SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT DECIMAL, PRIMARY KEY
(SEQ_NAME))": org.apache.derby.client.am.SqlException: Table/View 'SEQUENCE'
already exists in Schema 'IWAN'.
JDO76614: Deployment encountered SQL Exceptions:
JDO76609: Got SQLException executing statement "CREATE TABLE
IFFPLAYER_IFFALLIANCE (alliances_ID BIGINT NOT NULL, members_ID BIGINT NOT
NULL, PRIMARY KEY (alliances_ID, members_ID))":
org.apache.derby.client.am.SqlException: Table/View 'IFFPLAYER_IFFALLIANCE'
already exists in Schema 'IWAN'.
JDO76609: Got SQLException executing statement "CREATE TABLE
IFFALLIANCE (ID BIGINT NOT NULL, ALLIANCE_NAME VARCHAR(255), PRIMARY KEY
(ID))": org.apache.derby.client.am.SqlException: Table/View 'IFFALLIANCE'
already exists in Schema 'IWAN'.
JDO76609: Got SQLException executing statement "CREATE TABLE
IFFGAMEFIELD (ID BIGINT NOT NULL, INITED SMALLINT DEFAULT 0, FIELDTYPE
INTEGER, ARMY INTEGER, SOUTHEAST_ID BIGINT, NORTH_ID BIGINT, PLAYER_ID
BIGINT, NORTHEAST_ID BIGINT, PRIMARY KEY (ID))":
org.apache.derby.client.am.SqlException: Table/View 'IFFGAMEFIELD' already
exists in Schema 'IWAN'.
JDO76609: Got SQLException executing statement "CREATE TABLE
IFFPLAYER (ID BIGINT NOT NULL, TAG VARCHAR(255), PLAYER_NAME VARCHAR(255),
LANG VARCHAR(255), PRIMARY KEY (ID))":
org.apache.derby.client.am.SqlException: Table/View 'IFFPLAYER' already
exists in Schema 'IWAN'.
JDO76609: Got SQLException executing statement "ALTER TABLE
IFFPLAYER_IFFALLIANCE ADD CONSTRAINT FFPLYRFFLLNCllncsD FOREIGN KEY
(alliances_ID) REFERENCES IFFALLIANCE (ID)":
org.apache.derby.client.am.SqlException: Constraint 'FFPLYRFFLLNCLLNCSD'
already exists in Schema 'IWAN'.
JDO76609: Got SQLException executing statement "ALTER TABLE
IFFPLAYER_IFFALLIANCE ADD CONSTRAINT FFPLYRFFLLNCmmbrsD FOREIGN KEY
(members_ID) REFERENCES IFFPLAYER (ID)":
org.apache.derby.client.am.SqlException: Constraint 'FFPLYRFFLLNCMMBRSD'
already exists in Schema 'IWAN'.
JDO76609: Got SQLException executing statement "ALTER TABLE
IFFGAMEFIELD ADD CONSTRAINT FFGMEFIELDSTHASTID FOREIGN KEY (SOUTHEAST_ID)
REFERENCES IFFGAMEFIELD (ID)": org.apache.derby.client.am.SqlException:
Constraint 'FFGMEFIELDSTHASTID' already exists in Schema 'IWAN'.
JDO76609: Got SQLException executing statement "ALTER TABLE
IFFGAMEFIELD ADD CONSTRAINT FFGAMEFIELDNORTHID FOREIGN KEY (NORTH_ID)
REFERENCES IFFGAMEFIELD (ID)": org.apache.derby.client.am.SqlException:
Constraint 'FFGAMEFIELDNORTHID' already exists in Schema 'IWAN'.
JDO76609: Got SQLException executing statement "ALTER TABLE
IFFGAMEFIELD ADD CONSTRAINT FFGAMEFIELDPLYERID FOREIGN KEY (PLAYER_ID)
REFERENCES IFFPLAYER (ID)": org.apache.derby.client.am.SqlException:
Constraint 'FFGAMEFIELDPLYERID' already exists in Schema 'IWAN'.
JDO76609: Got SQLException executing statement "ALTER TABLE
IFFGAMEFIELD ADD CONSTRAINT FFGMFIELDNRTHASTID FOREIGN KEY (NORTHEAST_ID)
REFERENCES IFFGAMEFIELD (ID)": org.apache.derby.client.am.SqlException:
Constraint 'FFGMFIELDNRTHASTID' already exists in Schema 'IWAN'.
JDO76609: Got SQLException executing statement "CREATE TABLE
SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT DECIMAL, PRIMARY KEY
(SEQ_NAME))": org.apache.derby.client.am.SqlException: Table/View 'SEQUENCE'
already exists in Schema 'IWAN'.
JDO76609: Got SQLException executing statement "INSERT INTO
SEQUENCE(SEQ_NAME, SEQ_COUNT) values ('SEQ_GEN', 0)":
org.apache.derby.client.am.SqlException: The statement was aborted because
it would have caused a duplicate key value in a unique or primary key
constraint or unique index identified by 'SQL061208085840450' defined on
'SEQUENCE'.
Enable of IFFServer in target server completed successfully
Enable of application in all targets completed successfully
All operations completed successfully
Duplicated project name in import. Project IFFServer-impl defined first in
C:\Iwan\SticktailGames\projects\FriendOrFoe\backend\IFFServer\nbproject\ant-
deploy.xml and again in
C:\Iwan\SticktailGames\projects\FriendOrFoe\backend\IFFServer\nbproject\buil
d-impl.xml
connect-debugger:
Non-existing path
"C:\Iwan\SticktailGames\projects\FriendOrFoe\backend\IFFServer\${javac.class
path}" provided.
Attached JPDA debugger to localhost:9009
pre-run-deploy:
Redeploying
C:\Iwan\SticktailGames\projects\FriendOrFoe\backend\IFFServer\dist\IFFServer
.ear
Start registering the project's server resources
Finished registering server resources
While redeploying, trying to stop the application in target server
completed successfully
While redeploying, trying to remove reference for application in target
server completed successfully
deployment started : 0%
Deploying application in domain failed; Could not rename
C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFSe
rver to
C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFSe
rver_old
At least one operation failed
C:\Iwan\SticktailGames\projects\FriendOrFoe\backend\IFFServer\nbproject\buil
d-impl.xml:174: Deployment error:
The module has not been deployed.
See the server log for details.
BUILD FAILED (total time: 34 seconds)


Appearantly, mentioned in a reply on a post from me on the NBUSERS mailing list, I have to add DROP statements in my DDL, which should fix things. Something I'll try tonight, it would be great to be able to debug the application using a debugger instead of System.out.println(...) statements all over the place.

Iwan

Tuesday, January 30, 2007

Developing the JEE application, how tears appeared in my eyes...

Update: I fixed the first exception mentioned in this blog. I had two methods in the WS with the same name but different params. And yesterday I probably didn't compile the -war project, which I did today. Really annoying NB doesn't take care of this.

As promised in yesterday's blog, I would keep you all posted on my proceedings... Unfortunately there's a lot of misery going on.

So I moved towards a JEE application and that was easy as can be. I created a new Enterprise project and two additional modules were created, one for the ejb's and one for the web part. Excellent. And as intended the newly created project was also the main project.

I then created some entities and had NB create as much as possible, which went like a breeze. Same goes for some stateless session-facades that would actually take care of my transaction problems. NB generated everything nicely and did so for remote and local interfaces as well. How it worked? Like a charm.

Next was a webservice, again NB generated all code and I was on a roll. Added some functionality and hit F11... nothing happened but an error message. As it turned out, the two additional projects weren't compiled as a result of a build of the JEE project.
There's no way to set anywhere in the project's properties to build dependent projects as well, so my guess is that NB should've done this all by itself. Yet it didn't.
So I build both projects myself, and did some experimentation... and as it turned out, when compiling the war project it had the same problem. Since the WS is using the SessionFacade it requires the -ejb project to be build and use its resulting JAR. Since that project is not build as a result of building the -war project, the build of the -war project fails. Hmmm, so I need to build dependencies by hand? First tears started to emerge. This is not what I am use to with NB.
After building everything by hand in the right order I run my project and what do you know... it all worked. Yippie... time to shutdown my laptop and go to sleep.

Tonight I wanted to continue where I left my proceedings last night. And this is where the real misery started and I'm getting the feeling that JEE support in NB is not as good as Roman's demo's show.
So what is happening? Well, nothing to be honest. Nothing has changed. Really nothing, honestly. But now when I run my project, it can't find the WS' WSDL file. Here's the output I get.

Problem encountered during annotation processing;
see stacktrace below for more information.
modeler error: Request wrapper bean names must be unique and must not clash with other generated classes. Class: com.sticktailgames.iff.backend.ws.WSPlayerServiceImpl method register(java.lang.String,java.lang.String,java.lang.String)
at com.sun.tools.ws.processor.modeler.annotation.WebServiceAP.onError(WebServiceAP.java:204)
at com.sun.tools.ws.processor.modeler.annotation.WebServiceAP.onError(WebServiceAP.java:193)
at com.sun.tools.ws.processor.modeler.annotation.WebServiceAP.onError(WebServiceAP.java:189)
at com.sun.tools.ws.processor.modeler.annotation.WebServiceWrapperGenerator.generateWrappers(WebServiceWrapperGenerator.java:220)
at com.sun.tools.ws.processor.modeler.annotation.WebServiceWrapperGenerator.processMethod(WebServiceWrapperGenerator.java:146)
at com.sun.tools.ws.processor.modeler.annotation.WebServiceVisitor.visitMethodDeclaration(WebServiceVisitor.java:470)
at com.sun.tools.apt.mirror.declaration.MethodDeclarationImpl.accept(MethodDeclarationImpl.java:41)
at com.sun.tools.ws.processor.modeler.annotation.WebServiceVisitor.processMethods(WebServiceVisitor.java:408)
at com.sun.tools.ws.processor.modeler.annotation.WebServiceVisitor.postProcessWebService(WebServiceVisitor.java:363)
at com.sun.tools.ws.processor.modeler.annotation.WebServiceWrapperGenerator.postProcessWebService(WebServiceWrapperGenerator.java:121)
at com.sun.tools.ws.processor.modeler.annotation.WebServiceVisitor.visitClassDeclaration(WebServiceVisitor.java:169)
at com.sun.tools.apt.mirror.declaration.ClassDeclarationImpl.accept(ClassDeclarationImpl.java:95)
at com.sun.tools.ws.processor.modeler.annotation.WebServiceAP.buildModel(WebServiceAP.java:347)
at com.sun.tools.ws.processor.modeler.annotation.WebServiceAP.process(WebServiceAP.java:232)
at com.sun.mirror.apt.AnnotationProcessors$CompositeAnnotationProcessor.process(AnnotationProcessors.java:60)
at com.sun.tools.apt.comp.Apt.main(Apt.java:454)
at com.sun.tools.apt.main.JavaCompiler.compile(JavaCompiler.java:258)
at com.sun.tools.apt.main.Main.compile(Main.java:1102)
at com.sun.tools.apt.main.Main.compile(Main.java:964)
at com.sun.tools.apt.Main.processing(Main.java:95)
at com.sun.tools.apt.Main.process(Main.java:85)
at com.sun.tools.apt.Main.process(Main.java:67)
at com.sun.tools.ws.wscompile.CompileTool.buildModel(CompileTool.java:605)
at com.sun.tools.ws.wscompile.CompileTool.run(CompileTool.java:538)
at com.sun.tools.ws.util.ToolBase.run(ToolBase.java:56)
at com.sun.tools.ws.util.WSToolsObjectFactoryImpl.wsgen(WSToolsObjectFactoryImpl.java:44)
at com.sun.enterprise.webservice.WsUtil.runWsGen(WsUtil.java:1820)
at com.sun.enterprise.webservice.WsUtil.genWSInfo(WsUtil.java:2089)
at com.sun.enterprise.deployment.backend.AppDeployerBase.loadDescriptors(AppDeployerBase.java:328)
at com.sun.enterprise.deployment.backend.AppDeployer.explodeArchive(AppDeployer.java:332)
at com.sun.enterprise.deployment.backend.AppDeployer.deploy(AppDeployer.java:182)
at com.sun.enterprise.deployment.backend.AppDeployer.doRequestFinish(AppDeployer.java:129)
at com.sun.enterprise.deployment.phasing.J2EECPhase.runPhase(J2EECPhase.java:169)
at com.sun.enterprise.deployment.phasing.DeploymentPhase.executePhase(DeploymentPhase.java:95)
at com.sun.enterprise.deployment.phasing.PEDeploymentService.executePhases(PEDeploymentService.java:871)
at com.sun.enterprise.deployment.phasing.PEDeploymentService.deploy(PEDeploymentService.java:266)
at com.sun.enterprise.deployment.phasing.PEDeploymentService.deploy(PEDeploymentService.java:739)
at com.sun.enterprise.management.deploy.DeployThread.deploy(DeployThread.java:174)
at com.sun.enterprise.management.deploy.DeployThread.run(DeployThread.java:210)
error: compilation failed, errors should have been reported
wsgen successful
Error parsing WSDLC:\Programs\Sun\AppServer\9.UR1\domains\domain1\generated\xml\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\wsdl\WSPlayerServiceImplService.wsdl (The system cannot find the file specified)


So I'm a bit mystified when it comes to this since everything worked fine yesterday. Messing around with this kind of stuff like this takes too much time. I should just work, or it should hint better at how to solve my problems.
Worse yet, when I re-run the project, I get an error that it can't deploy the application, because Sun AS is not allowing the deletion of the the ear-file.

ADM1006:Uploading the file to:[C:\Documents and Settings\Iwan\Local Settings\Temp\s1astempdomain1server1400139303\IFFServer.ear]
UTIL6040: Error attempting to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib\IFFServer-ejb.jar
UTIL6041: Performing gc to try to force file closures
UTIL6043: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib\IFFServer-ejb.jar failed after 4 retries
UTIL6048: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib\IFFServer-ejb.jar failed; now marked for delete-on-exit
UTIL6040: Error attempting to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib\IFFSharedLib.jar
UTIL6041: Performing gc to try to force file closures
UTIL6043: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib\IFFSharedLib.jar failed after 4 retries
UTIL6048: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib\IFFSharedLib.jar failed; now marked for delete-on-exit
UTIL6040: Error attempting to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib
UTIL6041: Performing gc to try to force file closures
UTIL6043: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib failed after 4 retries
UTIL6048: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib failed; now marked for delete-on-exit
UTIL6040: Error attempting to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF
UTIL6041: Performing gc to try to force file closures
UTIL6043: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF failed after 4 retries
UTIL6048: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF failed; now marked for delete-on-exit
UTIL6040: Error attempting to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war
UTIL6041: Performing gc to try to force file closures
UTIL6043: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war failed after 4 retries
UTIL6048: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war failed; now marked for delete-on-exit
UTIL6040: Error attempting to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer
UTIL6041: Performing gc to try to force file closures
UTIL6043: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer failed after 4 retries
UTIL6048: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer failed; now marked for delete-on-exit
UTIL6040: Error attempting to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib\IFFServer-ejb.jar
UTIL6041: Performing gc to try to force file closures
UTIL6043: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib\IFFServer-ejb.jar failed after 4 retries
UTIL6048: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib\IFFServer-ejb.jar failed; now marked for delete-on-exit
UTIL6040: Error attempting to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib\IFFSharedLib.jar
UTIL6041: Performing gc to try to force file closures
UTIL6043: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib\IFFSharedLib.jar failed after 4 retries
UTIL6048: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib\IFFSharedLib.jar failed; now marked for delete-on-exit
UTIL6040: Error attempting to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib
UTIL6041: Performing gc to try to force file closures
UTIL6043: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib failed after 4 retries
UTIL6048: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF\lib failed; now marked for delete-on-exit
UTIL6040: Error attempting to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF
UTIL6041: Performing gc to try to force file closures
UTIL6043: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF failed after 4 retries
UTIL6048: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war\WEB-INF failed; now marked for delete-on-exit
UTIL6040: Error attempting to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war
UTIL6041: Performing gc to try to force file closures
UTIL6043: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war failed after 4 retries
UTIL6048: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer\IFFServer-war_war failed; now marked for delete-on-exit
UTIL6040: Error attempting to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer
UTIL6041: Performing gc to try to force file closures
UTIL6043: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer failed after 4 retries
UTIL6048: Attempt to delete C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer failed; now marked for delete-on-exit
Exception occured in J2EEC Phase
com.sun.enterprise.deployment.backend.IASDeploymentException: Cannot delete existing directory C:\Programs\Sun\AppServer\9.UR1\domains\domain1\applications\j2ee-apps\IFFServer, possibly due to one or more open files or streams; these may interfere with later deployment attempts so you may need to manually delete this directory and/or restart the server to release the open files
at com.sun.enterprise.deployment.backend.AppDeployer.cleanAndCheck(AppDeployer.java:313)
at com.sun.enterprise.deployment.backend.AppDeployer.liquidateAppDirAndStubsDirIfTheyHappenToExist(AppDeployer.java:285)
at com.sun.enterprise.deployment.backend.AppDeployer.predeploy(AppDeployer.java:167)
at com.sun.enterprise.deployment.backend.AppDeployer.doRequestFinish(AppDeployer.java:128)
at com.sun.enterprise.deployment.phasing.J2EECPhase.runPhase(J2EECPhase.java:169)
at com.sun.enterprise.deployment.phasing.DeploymentPhase.executePhase(DeploymentPhase.java:95)
at com.sun.enterprise.deployment.phasing.PEDeploymentService.executePhases(PEDeploymentService.java:871)
at com.sun.enterprise.deployment.phasing.PEDeploymentService.deploy(PEDeploymentService.java:266)
at com.sun.enterprise.deployment.phasing.PEDeploymentService.deploy(PEDeploymentService.java:739)
at com.sun.enterprise.management.deploy.DeployThread.deploy(DeployThread.java:174)
at com.sun.enterprise.management.deploy.DeployThread.run(DeployThread.java:210)

Why is this happening? Why can't the interoperability between Sun AS 9 and NB55 both bundled, not be better, smoother? It only works after stopping Sun AS 9. That is just too time consuming, time I want to spend on developing not on waiting for an app server to start.

And while I'm at it, why can clear the app servers output window, but when I run my project the whole log is displayed, not the log from that point on? What's the use of that?

Well... I'm going ahead and try to figure out what's going on and try to fix things. I'll be posting my proceedings through this.

Iwan

Monday, January 29, 2007

And now I'm moving towards full fledged JEE development

Yesterday I moved my project into the realm of JEE with EJB and all. Coming from a web only application I stumbled in too many problems I didn't want to think about too much. Most of them had to do with transaction management, lousy design (on my part), and getting used to developing serverside code in NB55 (I only used MobPack for the last 12 months or so) didn't help either.
I downloaded Spring this weekend and thought it would solve all of my problems, just like a friend of mine promised, but the lack of a tutorial that would fit my needs and the lack of NB supporting it the way I'm used to NB supporting something made it a road I should have traveled.

So let me tell you something about what I am developing that is so different from all that I've seen. And probably it isn't.
I'm working on a server that is accessible by J2ME clients, they are nothing more than thin clients it turns out. It's all for a game we're developing and the world the game takes place in is ever expanding. So I have a server that serves the requests from the clients through NB's generated servlet interface. I blogged about that a while ago, a feature that is really helpful, but there are some improvements thinkable. So I went the servlet way.
The ever expanding universe I thought of doing using a thread started in a servlet. Something I shouldn't do, but still can get away with in Sun AS9 and the thread is running nicely doing its job the way I intended… almost. That is where the problems started. Every time I tried to do something with the database, I got an exception upon the commit of the transaction. I tried everything I could think of this weekend. Instantiating new EntityManagers, UserTransactions, additional PersistenceUnits etc, but I couldn't get rid of the exception. Everything I was doing with the database from the servlet code itself worked like a charm. Ergo I thought about the thread opening an URL and have the servlet behind that URL do the work the thread was supposed to do, but I dismissed that idea straight away. I knew I was sinking in the swamp enterprise development can be, but I didn't want to sink that deep. I knew also that I had a Scheduler in stock that would periodically poll the database to see if there were any jobs scheduled and than execute those jobs. Another thread in the system, that I saw doomed to fail, just like my UniverseExpander. I know I shouldn't use threads in a server application anyway.
So Spring to the rescue, but as it turns out, a quick google on "Spring, tutorial, JPA" got me with either tutorials that assumed extensive knowledge of Spring (which I don't posses), or with tutorials that incorporated Spring MVC. Problem here is that I don't have a problem with the database handling from the web end of the application, it is with the 'JSE' part (the threads) of the application. And the JSE type of database handling didn't work for me.

After a weekend of strugling with the code, the problems etc I decided to spend Sunday night on a proper design. Forget about technologies and just make a proper design, the way I do when working on a client's project. I realized that EJB would help me with the transaction management and EJB3 allows me to work with POJOs all the way, which means that I can keep it fairly lightweight, something I need. Although the in-memory model will be huge… relatively, everything happening in the system will be based on single transactions, something that EJBs can handle nicely. For now that is.

I was a bit intimidated with the JEE stuff NB throws at you. You get 3 projects, not a lot of explanation of what is going on in what project and on top of that, it generates about everything I want to do. So I right- and left-click my way around NB and generate SessionBeans, Entities, WebServices and all without really having to do something. So this is what everybody is raving about when talking about NB and JEE… just as cool as J2ME support.

While designing I found that I need some kind of event system in the server as well, pointing me into the direction of JMS.

While googling I stumbled upon Quartz and decided to use it for my job scheduling instead of developing it by myself. It provides exactly what I want and more.

I will post my proceedings in this blog and hope it will be of help to people. This blog entry is more about what I was facing than about how I was solving… so maybe Spring and JPA and just web tier are coming back… for now it is all about full fledged JEE.

Iwan