Monday, January 26, 2009

J2EE/Java Grips 1: Websphere is garbage, OMFG 1

I was debugging a websphere/RAD issue, thinking that maybe I had messed up a configuration way down in the cellar of RAD's infinite supply of configurations. Maybe the flux-capacitor node mx3e cell.xml missed the rptptppt_Vn_ setting. No my friends, RAD seemed to have bombed on a missing servlet tag in the web.xml. NPE, NullPointer on not having the most basic setting in a J2EE app. Don't get me wrong, a developer should have the setting, but something more helpful like 'You are missing your servlet mapping' would have been helpful. here is the configuration and the error.


<servlet-mapping>
<servlet-name>OnlineServlet</servlet-name>
<url-pattern>/OnlineServlet</url-pattern>
</servlet-mapping>

------

[1/26/09 23:30:14:166 EST] 00000047 SystemOut O Caused by: java.lang.NullPointerException
at com.ibm.ws.wswebcontainer.webapp.WebAppConfigurationHelper.constructServletMappings(WebAppConfigurationHelper.java:405)
at com.ibm.ws.wswebcontainer.webapp.WebAppConfigurationHelper.createConfiguration(WebAppConfigurationHelper.java:147)
at com.ibm.ws.webcontainer.metadata.WebMetaDataFactory.createMetaData(WebMetaDataFactory.java:169)
at com.ibm.ws.runtime.component.MetaDataMgrImpl.createMetaDataFromFactories(MetaDataMgrImpl.java:135)
at com.ibm.ws.runtime.component.MetaDataMgrImpl.createMetaData(MetaDataMgrImpl.java:243)
at com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:561)
at com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:814)
at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:948)
at com.ibm.ws.runtime.component.ApplicationMgrImpl$1.run(ApplicationMgrImpl.java:1478)
at com.ibm.ws.security.auth.ContextManagerImpl.runAs(ContextManagerImpl.java:3811)
at com.ibm.ws.security.auth.ContextManagerImpl.runAsSystem(ContextManagerImpl.java:3893)
at com.ibm.ws.security.core.SecurityContext.runAsSystem(SecurityContext.java:245)

Thursday, January 15, 2009

Simple Agents/Concurrent Programming in Clojure


"All concurrency issues boil down to coordinating access to mutable state. The less mutable state, the easier it is to ensure thread safety."

-- Java Concurrency in Practice (from Bill Clementson's blog)

Like Erlang, Clojure is becoming a very powerful concurrent oriented language. It is designed to be a simple language making it easier to coordinate access to resources.

"Agents provide independent, asynchronous change of individual locations. Agents are bound to a single storage location for their lifetime, and only allow mutation of that location (to a new state) to occur as a result of an action"

-- http://clojure.org/agents
Here is a simple example of two agent functions 'agent' and 'send':

;;
;; Simple example of agents (concurrent coding) in Clojure
;; The send function waits/hangs and then returns the result.
;;
;; Note: only the calls to 'Thread.sleep' in the main program
;; block the main thread.
;; @see http://clojure.org/agents
;;
;; Function definition: (agent <state>). Example, (agent "Init")
;;
;; Function definition: (send <agent> <func> & <args>).
;; Example, (send abc (fn [_] "Done"))

;; (Author: Berlin Brown (on 1/5/2009))
;;

;; (A) Define the agent as 'abc'.
(def abc
(agent "Initial Value of Agent = This string"))

;; (B) The function to send a message to the agent.
(defn go []
(send abc
(fn [_]
;; Wait here for 5 seconds)
(. java.lang.Thread sleep 5000)
(println "Print from concurrent send agent")
"1 2 3 4 (Final Value, I am done)")))

;; (C) Main entry point of the program
(defn main []
(println "Running")
;; (1) Send a message to 'abc' agent by calling 'go'
(go)
;; (2) Wait for 1 second
(. java.lang.Thread sleep 1000)
;; (3) What is the value, we shouldn't be done yet?
(println @abc)
;; (4) Wait some more, 6 more seconds
(. java.lang.Thread sleep 6000)
;; (5) Hopefully after 7 seconds, the agent is done,
;; Check the value.
(println @abc)

;; Wait a little bit more and then print done.
(. java.lang.Thread sleep 12000)
(. System exit 1)
(println "\nDone"))

(main)
;; End of Script

Output of Running Program
Running
Initial Value of Agent
Print from send agent
1 2 3 4 (Final Value, I am done)

Resources:

Clojure COP/OOP Article

http://clojure.org/agents

-----
Edited: Here is an example using a Java Thread approach (some code not included):

(defn file-monitor-loop [file]
(let [delay-t (prop-int resources-core-sys "Octane_Sys_filemonitor_delay")
enable-file-mon (prop-bool resources-win-opts "file_monitor_enabled")
pth (. file getAbsolutePath)]
(when enable-file-mon
(.start (new Thread (fn []
(while (not (. shell isDisposed))
(Thread/sleep delay-t)
(when (file-modified? file)
;; Reload the file as it grows and refresh
;; the file.
(open-file pth true)))))))))

-----