2011年6月6日 星期一

JMS: Resource Injection

Within the Java EE environment, objects bound within the Java EE context can use the @Resource annotation to inject the JMS resources into the code rather than performing a JNDI lookup using the InitialContext.
From Java Message Service

public class Lender {

  TopicConnection conn = null;
  TopicSession session = null;
  Topic ratesTopic = null;
  TopicPublisher publisher = null;

  public Lender() {
    try {
      
      Context ctx = new InitialContext();

      TopicConnectionFactory factory =
        (TopicConnectionFactory)ctx.lookup("TopicCF");
      conn = factory.createTopicConnection();
      conn.start();
      session =
        conn.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
      ratesTopic = (Topic)ctx.lookup("jms/Rates");
      publisher = session.createPublisher(ratesTopic);
      ...
    } catch (JMSException jmse) {
      jmse.printStackTrace();
    } catch (NamingException jne) {
      jne.printStackTrace();
    }
  }
  ...
}

若使用Java EE所提供的Annotation,注入JMS Resource,則不需要在程式中使用InitialContext作JNDI的lookup。

@Stateless
@Remote(Lender.class)
public class LenderBean implements Lender {
  
  @Resource(name="TopicCF") TopicConnectionFactory factory;
  @Resource(name="jms/Rates") Topic ratesTopic;

  TopicConnection conn = null;
  TopicSession session = null;
  TopicPublisher publisher = null;

  @PostContruct
  public void init() {
    try {
      conn = factory.createTopicConnection();
      conn.start();
      session =
        conn.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
      publisher = session.createPublisher(ratesTopic);
      ...
    } catch (JMSException jmse) {
      jmse.printStackTrace();
    }
  } 
  ...
}

Reference: Java Message Service

沒有留言:

張貼留言