SOA World published an article on BPEL Management written by me with Arvind Maheshwari.
You can read the article: Managing Complexity with BPEL Management!
Rumblings from a Technologist and Book author
SOA World published an article on BPEL Management written by me with Arvind Maheshwari.
You can read the article: Managing Complexity with BPEL Management!
One of my friends commented: “Java is no longer cool! Not hot either! What is the current state of enterprise Java?”
First it was .Net and then came a bonanza of scripting languages such as Ruby. All these technologies were there to eclipse the popularity of Java and J2EE. The hypes for these technologies were short-lived. The forecast for demise of Java EE was highly exaggerated. Java and J2EE still lives on!
I divide the players in the enterprise Java markets primarily into two buckets. The commercial vendors selling J2EE application server and the vendors building open source and so called free products. However a third force is emerging that is looking to disrupt the J2EE market space.
The commercial market space is now officially two horses’ race after Oracle acquired BEA. The battle is still on for the two traditional rivals! One application server (WebLogic) is stylish and always ahead with emerging technology and the other one proprietary loaded (Websphere) with the old baggage. Java EE 5 finalized in June 2006 and IBM Websphere just got certified with Java EE 5. That’s more than two years since the spec was finalized. That’s not strange though. JBoss that still do not have a production release that is Java EE 5 certified. Although they announced it's arrival more than a month back, I do not see a production version available as yet. They have a release candidate!
Now that we discussed JBoss’s certification issue let us look at the open source products. About two years back JBoss was the crown prince in the open source market. None of the other products Jonas, Glassfish or Geronimo had capabilities to challenge its supremacy. However JBoss lost the momentum in past year and half after being acquired by RedHat. Glassfish has gained a significant mindshare in last year and half thanks to their quality Java EE 5 implementation. I think the delay in shipping a quality Java EE 5 implementation by JBoss was a primary reason. Geronimo has not gotten much traction! However we should not forget that many customers still use Tomcat with just web applications. Although Tomcat does not have all bells and whistles of Java EE – it is still the most dominant open source container.
I put Spring in the third bucket. Spring is a great framework that makes application development simple. Java EE 5 borrowed a lot of great ideas from the Spring framework. Spring Framework certainly helped enterprise Java to go further. SpringSource, the company behind Spring Framework launched their OSGi-based application server named Spring dm Server. Spring dm Server not only competes with other application server vendors in the market. It also competes with Java EE! It allows you to deploy WAR modules and OSGi bundles. It is at its first version and lacks good high availability, manageability features. SpringSource hopes to implement part of Java EE 6 specs. If they are successful – Spring dm Server may be a disruptive force for the Java EE application server market. I will blog about my first impressions on Spring dm Server (write capabilities and limitations) in my upcoming blog.
Many people have raised concerns about slow adoption rate of Java EE 5. Is the slow adoption by two major players (IBM and JBoss) inhibiting the adoption rate for Java EE 5? Possibly! However we have to remember that for most companies, generating revenue is more important than the underlying technology. Many customers have deployed their applications using J2EE 1.4 and they achieved their performance and scalability goals so they cannot just throw those away and jump on to the Java EE 5 bandwagon. Having said that many customers are using Java EE 5 only with new development projects. The sales of my book has picked up lately.
With economy going down south- budgets for new projects are limited! Having said that Java is still the leading platform for building enterprise applications.
The JCP team is gearing up to finalize Java EE 6 by JavaOne 2009. This gives a fuzzy feeling that enterprise Java is still thriving. What do you think?
I got a question from a customer that he wants to use EJBContext from an EJB 3 Interceptor.
Yes, it’s very simple. Just inject the EJBContext into the interceptor using @Resource injection.
See the example code that uses methods of SessionContext as follows:
package actionbazaar.buslogic;
import javax.annotation.Resource;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
public class CheckPermissionInterceptor {
@Resource
private javax.ejb.SessionContext ctx;
@AroundInvoke
public Object checkUserRole(InvocationContext ic) throws Exception {
System.out.println("*** CheckPermission Interceptor invoked for "
+ ic.getTarget() + " ***");
if (!ctx.isCallerInRole("admin")) {
throw new SecurityException("User: '"
+ ctx.getCallerPrincipal().getName()
+ "' does not have permissions for method "
+ ic.getMethod());
}
return ic.proceed();
}
}
If you want the run-able version of the example code, you can download from http://manning.com/panda and look at Chapter 5 example.
I’ve two sessions at Oracle Open World 2008, San Francisco. Here are my session details:
Track: Application Server and Transaction Processing
Room: Rm 2006
Date: 2008-09-22
Start Time: 11:30
S298522 : Top Five Things DBAs Must Know About Managing Middleware
Track: Application Server and Transaction Processing
Room: Rm 2003
Date: 2008-09-25
Start Time: 15:00
See you at San Francisco!
@WebService(name="PlaceBid",
serviceName="PlaceBidService", portName = "PlaceBidPort",
targetNamespace = "http://actionbazaar.com/xml")
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT)
@PersistenceContext(unitName="actionBazaar",name="actionBazaar")
@Stateless
public class PlaceBidBean {
public Long addBid(String userId, Long itemId, Double bidPrice) throws BidException {
….
}
}
Finally I was able to complete porting of all book examples of EJB 3 In Action to run on WebLogic Server.
You can download these from here
These contain a host of examples on EJB 3, JPA, Web Services and Spring Framework. Now we have complete examples for four servers: Glassfish, OC4J, WebLogic and JBoss.
Note that I tested the examples with an Oracle XE database. For simplicity, the examples are configured to use the exampleServer and default PointBase DB that is shipped with it. However some of these examples will properly not on PointBase because it does not support DB Sequence.
All chapters have the common domain model based on our famous ActionBazaar Application
Chapter 5: EJB 3 Interceptors, Timers
Chapter 8: O-R Mapping Annotations
Chapter 9: Entity Manager API
Chapter 10: JPQL and Native SQL Queries
Chapter 11: O-R Mapping with XML
Chapter 12: EM API from Web Tier, Java SE
Chapter 13: Extended Persistence Context
Chapter 15: EJB 3 Web services
Chapter 16: Spring with EJB 3 and JPA
Please try these out and let me know if you find any bugs!
I wrote a Reference Card on EJB 3 Dependency Injection for Developer Zone. This is a quick reference card that describes metadata annotations and XML descriptor elements that you use for injecting resources and services.
You can access this reference card for free from Developer Zone at http://refcardz.dzone.com/refcardz/dependency-injection-in-ejb3
In my previous blog, I made the code examples available for first four chapters of EJB 3 In Action for WebLogic 10. However I did not provide you instructions to run these examples (Chapter 2-4) for WebLogic 10.
Chapter 3 depends upon a JDBC DataSource and Chapter 4 uses JDBC DataSource and a JMS Queue.
%BEA_HOME%/wlserver_10.0/samples/domains/wl_server/setExamplesEnv
cd c:\ejb3inaction\weblogic
ant CreateResources
This will configure resources such as JDBC DataSource, JMS Connection Factory, Queues, etc.
4. To deploy the application, you can use WLS Admin Console. If you prefer you can use ant to deploy the application for a specific chapter.
cd chapter2
ant
ant run
So I thought I would give Oracle AD4J a spin and will try to find out what is going! It is good that Oracle AD4J does not require any code changes in application, because it does not use byte code instrumentation. Nor does it require to restart/redeploy the application – so it was a perfect fit.
And it really helped diagnose the problem by me get into bottom of the issues. It was indeed a DB issue as I had initially suspected.
I will not bore you with installation and configuration steps of AD4J – rather I will outline how AD4J helped me diagnose the issue.
As soon as I logon to AD4J console and clicked to view active threads – it showed all threads with the correct state and I saw one thread is with status “DBWait”.
That gave me an indication that something going fishy in the database request from from JPA provider.
When I clicked on DB Wait link to view details, it became clear that the transaction is running into some row lock contention with another user session.
It also helped me find the other session that held the lock. Apparently we found that it was a batch process that was hanging for some reasons. After the hanging session was killed the application ran like a champ again!
Also I found that the JPQL query for retrieving SRs was running slower because of some missing indexes on the column and it was making a full table scan. Nice, it also AD4J allows to run explain for sql statements.
You can download AD4J from OTN (http://www.oracle.com/technology/software/products/oem/htdocs/jade.html)
Installing AD4J Console is easy. You can follow this guide to do this installation of AD4J Console and agent.
After you deploy the agent you are good to go. Your JVM for application server will be automatically discovered in the console.
The AD4J agent is a WAR file that needs to be deployed to the server. You can follow the instructions in the install guide to install the agent in favorite application server. I was using my favorite container OC4J, however it supports BEA WebLogic, IBM Websphere, JBoss, and Tomcat. You can run AD4J also with standalone Java.
If you want to trace the problem to the DB tier you can install the DB Agent. You can follow the instructions in this guide.
I will play around with AD4J and blog little more about its feature in future. In the meantime you can review it's usage scenario documented in here.
OC4J 10.1.3.x allows users to start/stop MDBs dynamically without having recycle container or application.
For example, you can disable an MDB upon start/deployment by adding enabled="false" in your orion-ejb-jar.xml as follows
<message-driven-deployment name="MessageLogger" enabled="false">
MDB will not start when the application is deployed/started.
You can use Application Server Control to start the MDB later as shown in the following screen shot:
You may want to perform this operation from command line. You can download this zip file that contains code to stop/start MDB using JMX.
ant start -DappName=ejb30mdb -DejbModule=ejb30mdb-ejb -DmdbName MessageLogger
ant stop -DappName=ejb30mdb -DejbModule=ejb30mdb-ejb -DmdbName MessageLogger
Following is the code snippet from the Java Class that perform the stop/start operation:
StartStopMDB mdb = new StartStopMDB();
try {
mdb.connect("service:jmx:"+args[0], args[1] ,args[2] );
System.out.println(mdb);
System.out.printf("Client connected? %s\n",mdb.isConnected());
MBeanServerConnection mbs = jmxCon.getMBeanServerConnection();
String objName = "oc4j:j2eeType=MessageDrivenBean,EJBModule=\""+args[4]
+"\",J2EEApplication="+args[3]+",J2EEServer=standalone,name=\""+args[5]+"\"";
ObjectName myMDBObjectName = new ObjectName(objName);
MessageDrivenBeanMBeanProxy MDBMBean =
(MessageDrivenBeanMBeanProxy)MBeanServerInvocationHandler.newProxyInstance(mbs,
myMDBObjectName, MessageDrivenBeanMBeanProxy.class, false);
if (args[6].equals("start"))
{
System.out.println("Starting up MDB: "+args[5] +" in ejb module:"+args[4]+
" in application name:"+args[3]);
MDBMBean.start();
System.out.println("Successfully started MDB!");
}
else if (args[6].equals("stop")) {
System.out.println("Stopping MDB: "+args[5] +
" in ejb module:"+args[4]+ " in application name:"+args[3]);
MDBMBean.stop();
System.out.println("Successfully started MDB!");
}
mdb.close();
} catch (Exception e) {
e.printStackTrace();
}
}
Hope this helps!