BLOG ARTICLE JBoss JMS | 3 ARTICLE FOUND

  1. 2011/02/16 JBoss JMS Monitor(JMX) with JFreeChart
  2. 2009/01/13 JBoss Queue Monitoring via MBean
  3. 2008/09/29 JBoss JMS Simple Standalone Client Sample

JBoss에서 JFreeChart를 만들어 JMX를 통한 Queue의 메시시 처리 상태 모니터입니다. 이클립스 프로젝트로 구성되어 있으며, JMS에 대한 전송 예제까지 같이 첨부합니다.

1 - JBoss Monitor.zip
2. JBoss JMS Standalone Send/Recv Example

크리에이티브 커먼즈 라이센스
Creative Commons License
2011/02/16 09:35 2011/02/16 09:35

JBoss 의 JMS서버의 queue를 모니터링하는 JMX Code입니다. jsp파일로 되어 있으며 복사해서 사용하면 됩니다.

아래의 파일이 실행되어 모니터링되려면 $SERVER_HOME/deploy/jboss-messaging.sar/messaging-service.xml 파일의 다음의 attribute를 true로 바꿔야 합니다.
<attribute name="EnableMessageCounters">true</attribute>

그리고 메시지를 샘플링하는 주기를 적절하게 주면 됩니다.
<attribute name="MessageCounterSamplePeriod">5000</attribute>


<%@ page language="java" contentType="text/html; charset=UTF-8"   pageEncoding="UTF-8" import="javax.naming.*, java.util.*,javax.management.*,org.jboss.jms.server.destination.*,org.jboss.jmx.adaptor.rmi.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!--meta http-equiv="refresh" content="5"-->
<link href="style.css" rel=stylesheet type="text/css">
<title>Insert title here</title>
</head>
 
<body leftmargin=15 topmargin=10>
<center><p>
<br>
 
<table width="600" cellpadding="7" cellspacing="0" border="1" bordercolordark="WHITE" bordercolorlight="BLACK">
<tr bgcolor=#E8EEEC>
<%
    String type = "Queue";
 
    Hashtable<String,String> env = new Hashtable<String,String>();
    String factory = "org.jboss.security.jndi.JndiLoginInitialContextFactory";
    env.put(Context.INITIAL_CONTEXT_FACTORY, factory);
    String url = "jnp://127.0.0.1:1099";
    env.put(Context.PROVIDER_URL, url);
    env.put(Context.SECURITY_CREDENTIALS, "admin");
    env.put(Context.SECURITY_PRINCIPAL, "admin");
    Context ctx = new InitialContext(env);
    RMIAdaptor server = (RMIAdaptor) ctx.lookup("jmx/invoker/RMIAdaptor");
%>
 
<td align center>Queue Name</td>
<td align center>Total Count</td>
<td align center>Current Count</td>
<td align center>Consumer Count</td>
<td align center>Delivering Count</td>
</tr>
<tr>
<td align center>queue/A</td>
<%
    String queueName = "A";
 
    // Get the MBeanInfo for the JNDIView MBean
    String targetName = "jboss.messaging.destination:service=" + type + ",name=" + queueName;
    ObjectName objName = ObjectName.getInstance(targetName);
 
    QueueMBean queueMBean = (QueueMBean) MBeanServerInvocationHandler.newProxyInstance(server, objName, QueueMBean.class, false);
 
    int totalMessageCount = 0;
    int currentMessageCount = 0;
 
    totalMessageCount = queueMBean.getMessageCounter().getCount();
    currentMessageCount = queueMBean.getMessageCount();
%>
<td align center><%= totalMessageCount %></td>
<td align center><%= currentMessageCount %></td>
<td align center><%= queueMBean.getConsumerCount() %></td>
<td align center><%= queueMBean.getDeliveringCount() %></td>
</tr>
<tr>
<td align center>queue/B</td>
<%
    queueName = "B";
 
    // Get the MBeanInfo for the JNDIView MBean
    targetName = "jboss.messaging.destination:service=" + type + ",name=" + queueName;
    objName = ObjectName.getInstance(targetName);
 
    queueMBean = (QueueMBean) MBeanServerInvocationHandler.newProxyInstance(server, objName, QueueMBean.class, false);
 
    totalMessageCount = 0;
    currentMessageCount = 0;
 
    totalMessageCount = queueMBean.getMessageCounter().getCount();
    currentMessageCount = queueMBean.getMessageCount();
%>
<td align center><%= totalMessageCount %></td>
<td align center><%= currentMessageCount %></td>
<td align center><%= queueMBean.getConsumerCount() %></td>
<td align center><%= queueMBean.getDeliveringCount() %></td>
</tr>
</table>

크리에이티브 커먼즈 라이센스
Creative Commons License
2009/01/13 11:09 2009/01/13 11:09

추후에 어딘가에 올라가겠지요.

Simple Sender Sample : SimpleSender.java - based on JMS 1.1

package com.jboss.jms.client;

import java.util.Hashtable;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

public class SimpleSender {
    
    private String destinationName = "/queue/A";

    public void send() throws Exception {
        
        Context ic = null;
        ConnectionFactory cf = null;
        Connection connection = null;

        try {
            //ic = new InitialContext();
            ic = getInitialContext();

            cf = (ConnectionFactory) ic.lookup("/ConnectionFactory");
            Queue queue = (Queue) ic.lookup(destinationName);
            System.out.println("Queue " + destinationName + " exists");

            connection = cf.createConnection();
            Session session = connection.createSession(false,
                    Session.AUTO_ACKNOWLEDGE);
            MessageProducer sender = session.createProducer(queue);

            TextMessage message = session.createTextMessage("Hello!");
            sender.send(message);
            System.out.println("The message was successfully sent to the "    + queue.getQueueName() + " queue");

            connection.start();

        } finally {
            if (ic != null) {
                try {
                    ic.close();
                } catch (Exception e) {
                    throw e;
                }
            }

            // ALWAYS close your connection in a finally block to avoid leaks.
            // Closing connection also takes care of closing its related objects
            // e.g. sessions.
            closeConnection(connection);
        }
    }
    
    private Context getInitialContext() {
        try {
            Hashtable<Object, String> env = new Hashtable<Object, String>();
    
            env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
            env.put(Context.PROVIDER_URL, "localhost:1199");
    
            Context ctx = new InitialContext(env);
            return ctx;
        }catch(Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private void closeConnection(Connection con) {
        try {
            if (con != null) {
                con.close();
            }
        } catch (JMSException jmse) {
            System.out.println("Could not close connection " + con + " exception was " + jmse);
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        new SimpleSender().send();
    }

}


Simple Receiver Sample : SimpleReceiver.java - based on JMS 1.1
package com.jboss.jms.client;

import java.util.Hashtable;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

public class SimpleReceiver {
   
    private String destinationName = "/queue/A";

    public void send() throws Exception {
       
        Context ic = null;
        ConnectionFactory cf = null;
        Connection connection = null;

        try {
            //ic = new InitialContext();
            ic = getInitialContext();

            cf = (ConnectionFactory) ic.lookup("/ConnectionFactory");
            Queue queue = (Queue) ic.lookup(destinationName);
            System.out.println("Queue " + destinationName + " exists");

            connection = cf.createConnection();
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
           
            MessageConsumer consumer = session.createConsumer(queue);

            connection.start();

            while( true ){
                TextMessage message = (TextMessage) consumer.receive(2000);
                if( message == null ) break;
                System.out.println("Message From [" + destinationName + "] is [" + message.getText() + "]");
            }
            System.out.println("There is no more message in Queue");
        } finally {
            if (ic != null) {
                try {
                    ic.close();
                } catch (Exception e) {
                    throw e;
                }
            }

            // ALWAYS close your connection in a finally block to avoid leaks.
            // Closing connection also takes care of closing its related objects
            // e.g. sessions.
            closeConnection(connection);
        }
    }
   
    private Context getInitialContext() {
        try {
            Hashtable<Object, String> env = new Hashtable<Object, String>();
   
            env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
            env.put(Context.PROVIDER_URL, "localhost:1199");
   
            Context ctx = new InitialContext(env);
            return ctx;
        }catch(Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private void closeConnection(Connection con) {
        try {
            if (con != null) {
                con.close();
            }
        } catch (JMSException jmse) {
            System.out.println("Could not close connection " + con + " exception was " + jmse);
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        new SimpleReceiver().send();
    }

}



크리에이티브 커먼즈 라이센스
Creative Commons License
2008/09/29 22:37 2008/09/29 22:37