While struggling with getting MDBs working, and looking at examples, I saw examples where they defined JMS resources within the java program using @…. statements, and could not see how they worked. These are called annotations. The documentation on the web assumes you know about annotations when explaining annotations! They, in fact, are pretty simple, let me explain.
Annotations start with an @ character, and the information can be stored within the .class file as meta-data. Programs can extract and use this meta data.
You can have java code like
@Resource(lookup="java:customerMQ")
private javax.jms... myMQ;
A program, for example, your program, an analysis program or a web server, can issue request like
- load class information
- from the meta data list all fields with @resource defined.
- do things with the list
One example would be to specify a JNDI lookup of java:customerMQ and return it into the field myMQ.
Another example from the IBM documentation
@MessageDriven(
name = "JMSSampleMDB",
activationConfig =
{
@ActivationConfigProperty(
propertyName = "destinationType",
propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(
propertyName = "destination",
propertyValue = "jndi_INPUT_Q")
}
)
The resource adapter has code which does
- load your MDB program
- get the MessageDriven stuff.
- within this, locate the activationConfig records
- within these, locate the ActivationConfigProperty propertyName and propertyValue, and merge the data with the data in the ejb-jar.xml file.
- within this, locate the activationConfig records
With the definitions in your java program, and the definitions in the MDB configuration you can configure a complete set of options for MDB. I think the definitions in the java program override the MDB configuration.
How do I see what data there is?
You can extract this meta-data using a method like (see here)
public void getAnnotations(Class inclass){
for(Field field : inclass.getDeclaredFields()){
Class type = field.getType();
String name = field.getName();
field.getDeclaredAnnotations(); //do something with these
}
Use the javap command to display the data.
To display the annotations you can usethe command, where ….class is the name of your class file.
javap -v .....class
My java program had
import javax.annotation.Resource; ..... @Resource(lookup = "java:app/jms/myappTopic") String colin = "ZZZZZ";
The javap command gave
java.lang.String colin; descriptor: Ljava/lang/String; flags: RuntimeVisibleAnnotations: 0: #14(#15=s#16) ... #14 = Utf8 Ljavax/annotation/Resource; #15 = Utf8 lookup #16 = Utf8 java:app/jms/myappTopic
from which we get
java.lang.String colin ... javax/annotation/Resource (lookup = java:app/jms/myappTopic).
which matches the source code.
Different annotation types are confusing.
As well as providing meta-information on variables and classes, java also uses annotations to modify the java compiler behaviour. For example
- By putting
@Deprecated
infront of a method, the method can be flagged when used, as deprecated, and you should not use it - @SuppressWarnings(“unchecked”) tells the java compiler NOT to produce an error message for the unchecked condition. See here for a list of warning conditions.
One thought on “MDBs activation specs and @things in the java program”