Tuesday, January 22, 2013

Setting System properties using Spring

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context-3.0.xsd
                           http://www.springframework.org/schema/util
                           http://www.springframework.org/schema/util/spring-util-3.0.xsd">

    <!-- enable processing of annotations such as @Autowired and @Configuration -->
    <context:annotation-config/> 


    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetObject">
            <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
                <property name="targetClass" value="java.lang.System" />
                <property name="targetMethod" value="getProperties" />
            </bean>
        </property>
        <property name="targetMethod" value="putAll" />
        <property name="arguments">
            <util:properties>
                <prop key="test.key">test.value</prop>
            </util:properties>
        </property>
    </bean>

</beans>

Saturday, December 17, 2011

Get ActiveMQ Queue Size using MBean (Spring JMX)

Getting a queue size of an ActiveMQ queue using MBean (Spring JMX).
Spring Config file
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

 <bean class="org.springframework.jmx.support.MBeanServerConnectionFactoryBean" id="mbeanServerConnection">
  <property name="serviceUrl" value="service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi">
 </property></bean>

 <bean class="com.sample.QueueSizeCounter" id="queueCounter">
  <property name="mBeanServerConnection" ref="mbeanServerConnection">
 </property></bean>

</beans>

* A class using the MBeanServerConnection to fetch the attribute from the MBean
package com.sample;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;

import org.apache.log4j.Logger;

public class QueueSizeCounter {

 private MBeanServerConnection mBeanServerConnection;

 private Logger logger = Logger.getLogger(QueueSizeCounter.class);

 public Long getQueueSize(String queueName) {
  Long queueSize = null;
  try {

   ObjectName objectNameRequest = new ObjectName(
     "org.apache.activemq:BrokerName=localhost,Type=Queue,Destination=" + queueName);

   queueSize = (Long) mBeanServerConnection.getAttribute(objectNameRequest, "QueueSize");

   return queueSize;
  }
  catch (Exception e) {
   logger.error(e.getMessage());
  }
  return queueSize;
 }

 public void setmBeanServerConnection(MBeanServerConnection mBeanServerConnection) {
  this.mBeanServerConnection = mBeanServerConnection;
 }

}


* Running the Queue Counter
package com.sample;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

 public static void main(String[] args) {

  ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
  
  QueueSizeCounter queueCounter = (QueueSizeCounter) ctx.getBean("queueCounter");

  String queueName = "Queue1";
  long queueSize = queueCounter.getQueueSize(queueName);

  System.out.println("Size of " + queueName + " : " + queueSize);
 }
}

Sunday, December 4, 2011

Spring : Browsing Oracle AQ (XMLType) using Spring JMS

package com.sachinhandiekar.oracle.aq;

import java.util.Enumeration;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueBrowser;
import javax.jms.Session;

import oracle.jms.AQjmsAdtMessage;
import oracle.jms.AQjmsQueueBrowser;
import oracle.jms.AQjmsSession;
import oracle.sql.ORADataFactory;
import oracle.xdb.XMLType;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.SessionCallback;

public class OracleAQQueueBrowser {

 private JmsTemplate jmsTemplate;

  public void browseMessages() {

  Integer count = (Integer) jmsTemplate.execute(new SessionCallback() {
   public Object doInJms(Session session) throws JMSException {
    int count = 0;
    Queue queue = (Queue) jmsTemplate.getDefaultDestination();

    QueueBrowser browser = ((AQjmsSession) session).createBrowser(queue, null, XMLType.getORADataFactory(),
      true);

    Enumeration messages = browser.getEnumeration();

    while (messages.hasMoreElements()) {
     count++;
     Message message = (Message) messages.nextElement();
     displayMessage(message);
    }

     return new Integer(count);
   }

   private void displayMessage(Message message) {
    try {
     XMLType xmlMsg = (XMLType) ((AQjmsAdtMessage) message).getAdtPayload();
     System.out.println("Message ==> " + xmlMsg.getStringVal());
     System.out.println();
    }
    catch (Exception e) {
     e.printStackTrace();
    }
   }
  }, true);

  System.out.println("Number of Messages : " + count);
 }

 public void setJmsTemplate(JmsTemplate jmsTemplate) {
  this.jmsTemplate = jmsTemplate;
 }
}


* Spring Bean Configuration
<beans ...>
 <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  <property name="connectionFactory" ref="oracleAqConnFactory" />
  <property name="defaultDestination" ref="destination" />
 </bean>
</beans>

Saturday, December 3, 2011

Spring Aspects

Spring aspects can work with five kinds of advice :

  • Before - The advice functionality takes place before the advised method is invoked.
  • After - The advice functionality takes place after the advised method completes, regardless of the outcome.
  • After-returning - The advice functionality takes place after the advised method successfully completes.
  • After-throwing - The advice functionality takes place after the advised method throws an exception.
  • Around - The advice wraps the advised method, providing some functionality before and after the advised method is invoked.

Code Examples should go here...