`
lu2002lulu
  • 浏览: 95605 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

glassfish体验二

阅读更多
JMS的各种资源都已经创建好了,下面将介绍如何发送一条消息到JMS的队列里。
有两种方式来写客户端代码,使用annotation或者不使用。
1、使用annotation
1)创建web工程。
      在eclipse里创建web工程很简单。”File“-”New“-”Web Project“,然后输入工程名:TestJMS2,然后”Finish“。
2)新建Servlet
   新建包名:com.test.jms,在此包下新建Servlet:TestJMSServlet。
package com.test.jms;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Properties;

import javax.annotation.Resource;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueBrowser;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestJMSServlet extends HttpServlet
{

/**
*
*/
private static final long serialVersionUID = 1L;

@Resource(mappedName = "jms/myCF")
private ConnectionFactory queueCF;

@Resource(mappedName = "jms/myQueue")
private Queue queue;

/**
* Constructor of the object.
*/
public TestJMSServlet()
{
super();
}

/**
* Destruction of the servlet. <br>
*/
public void destroy()
{
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}

/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request
*          the request send by the client to the server
* @param response
*          the response send by the server to the client
* @throws ServletException
*           if an error occurred
* @throws IOException
*           if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{

doPost(request, response);
}

/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request
*          the request send by the client to the server
* @param response
*          the response send by the server to the client
* @throws ServletException
*           if an error occurred
* @throws IOException
*           if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
try
{
Connection connection = queueCF.createConnection();
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer((Destination) queue);
TextMessage message = session.createTextMessage();
message.setText("This is message ");
producer.send(message);

QueueBrowser browser = session.createBrowser(queue);
Enumeration msgs = browser.getEnumeration();

response.setContentType("text/html");
PrintWriter out = response.getWriter();
out
.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println("  <BODY>");
out.print("    This is ");
out.print(this.getClass());
out.println("<br>");
out.println("TCF: " + queueCF);
out.println("<br />Topic: " + queue);

out.println(", using the POST method");
out.println("<br>");
out.println("<br>");
out.println("<br>");
out.println("your messages sent are:<br>");
if (!msgs.hasMoreElements())
{
System.out.println("No messages in queue");
out.println("No messages in queue<br>");
} else
{
while (msgs.hasMoreElements())
{
Message tempMsg = (Message) msgs.nextElement();
out.println("Message: " + ((TextMessage)tempMsg).getText() + "<br>");
System.out.println("Message: " + tempMsg);
}
}

out.println("  </BODY>");
out.println("</HTML>");
out.flush();
out.close();

browser.close();
producer.close();
session.close();
connection.close();

} catch (JMSException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

}

/**
* Initialization of the servlet. <br>
*
* @throws ServletException
*           if an error occurs
*/
public void init() throws ServletException
{
// Put your code here
}

}

3)web.xml的配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>TestJMSServlet</servlet-name>
    <servlet-class>com.test.jms.TestJMSServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>TestJMSServlet</servlet-name>
    <url-pattern>/servlet/TestJMSServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

这样一个测试程序就算完成了,
部署应用到Glassfish上,然后启动服务,
地址栏中输入:http://localhost:8080/TestJMS2/servlet/TestJMSServlet
得到如下信息:
This is class com.test.jms.TestJMSServlet
TCF: com.sun.messaging.jms.ra.DirectConnectionFactory@6711b0
Topic: Sun Java System MQ Destination getName(): myQueueDes Class: com.sun.messaging.Queue getVERSION(): 3.0 isReadonly(): false getProperties(): {imqDestinationName=myQueueDes, imqDestinationDescription=A Description for the Destination Object} , using the POST method


your messages sent are:
Message: This is message
Message: This is message
Message: This is message
Message: This is message


下面就是要使用java 应用来执行JMS客户端代码。
package com.test.jms;

import java.util.Enumeration;
import java.util.Properties;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueBrowser;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class TestSendMessage
{

/**
* @param args
*/
public static void main(String[] args)
{

java.util.Properties properties = new Properties();

// set the properties of the connection

properties.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.enterprise.naming.SerialInitContextFactory");

properties.put(Context.PROVIDER_URL, "localhost:8080");

properties.put(Context.SECURITY_PRINCIPAL, "admin");

properties.put(Context.SECURITY_CREDENTIALS, "adminadmin");

// start the initial context with the specified properties
ConnectionFactory queueCF = null;
Queue queue = null;
try
{
InitialContext context = new InitialContext(properties);
queueCF = (ConnectionFactory) context.lookup("jms/myCF");

if (queueCF == null)
{
System.out.println("ConnectionFactory is null");
}

queue = (Queue) context.lookup("jms/myQueue");
if (queue == null)
{
System.out.println("Queue is null");
}
} catch (NamingException e)
{ //
}

try
{
Connection connection = queueCF.createConnection();
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer((Destination) queue);
TextMessage message = session.createTextMessage();
message.setText("This is message ");
producer.send(message);

QueueBrowser browser = session.createBrowser(queue);
Enumeration msgs = browser.getEnumeration();

System.out.println("TCF: " + queueCF);
System.out.println("<br />Topic: " + queue);

if (!msgs.hasMoreElements())
{
System.out.println("No messages in queue");
} else
{
while (msgs.hasMoreElements())
{
Message tempMsg = (Message) msgs.nextElement();
System.out.println("Message: " + ((TextMessage) tempMsg).getText()
+ "<br>");
}
}

browser.close();
producer.close();
session.close();
connection.close();

} catch (JMSException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

执行后显示:

TCF: com.sun.messaging.jms.ra.ConnectionFactoryAdapter@1988886
<br />Topic: Sun Java System MQ Destination
getName(): myQueueDes
Class: com.sun.messaging.Queue
getVERSION(): 3.0
isReadonly(): false
getProperties(): {imqDestinationName=myQueueDes, imqDestinationDescription=A Description for the Destination Object}
Message: This is message <br>
Message: This is message <br>
Message: This is message <br>
Message: This is message <br>
Message: This is message <br>

即说明我们的测试成功了。

从消息队列中接收消息,无疑我们会使用MDB(Message Driven Bean)。
在刚刚发送消息的工程下,我们写MDB接收程序 TestMessageDrivenBean。
package com.test.jms;

import javax.annotation.Resource;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

@MessageDriven(mappedName = "jms/myQueue")
public class TestMessageDrivenBean implements MessageListener
{
@Resource
  private MessageDrivenContext mdc;

public TestMessageDrivenBean()
{}

public void onMessage(Message inMessage)
{
TextMessage msg = null;

    try {
        if (inMessage instanceof TextMessage) {
            msg = (TextMessage) inMessage;
            System.out.println("\n\n**** MESSAGE BEAN: Message received: " +
                msg.getText());
        } else {
        System.out.println("Message of wrong type: " +
                inMessage.getClass().getName());
        }
    } catch (JMSException e) {
        e.printStackTrace();
        mdc.setRollbackOnly();
    } catch (Throwable te) {
        te.printStackTrace();
    }

}
}

配置文件需要两个,ejb-jar.xml和sun-ejb-jar.xml
ejb-jar.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans
2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>
<ejb-jar>
<enterprise-beans>
<message-driven>
<ejb-name>MessageBean</ejb-name>
<ejb-class>com.test.jms.TestMessageDrivenBean</ejb-class>
<transaction-type>Container</transaction-type>
<message-driven-destination>
<destination-type>javax.jms.Queue</destination-type>
</message-driven-destination>
<resource-ref>
<res-ref-name>jms/myCF</res-ref-name>
<res-type>javax.jms.ConnectionFactory</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
<res-ref-name>jms/myQueue</res-ref-name>
<res-type>javax.jms.Queue</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</message-driven>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>MessageBean</ejb-name>
<method-intf>Bean</method-intf>
<method-name>onMessage</method-name>
<method-params>
<method-param>javax.jms.Message</method-param>
</method-params>
</method>
<trans-attribute>NotSupported</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>


sun-ejb-jar.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Application
Server 8.1 EJB 2.1//EN'
'http://www.sun.com/software/appserver/dtds/sun-ejb-jar_2_1-1.dtd'>
<sun-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>MessageBean</ejb-name>
<jndi-name>jms/myQueue</jndi-name>
<resource-ref>
<res-ref-name>jms/myCF</res-ref-name>
<jndi-name>jms/myCF</jndi-name>
<default-resource-principal>
<name>guest</name>
<password>guest</password>
</default-resource-principal>
</resource-ref>
<mdb-connection-factory>
<jndi-name>jms/myCF</jndi-name>
<default-resource-principal>
<name>guest</name>
<password>guest</password>
</default-resource-principal>
</mdb-connection-factory>
</ejb>
</enterprise-beans>
</sun-ejb-jar>

一切准备工作完成,打包。
将上述两个xml配置文件放到META-INF目录下,目录结构为:
TestJMS_fat.jar
   META-INF
            ejb-jar.xml
             sun-ejb-jar.xml
             MANIFEST.MF
   com
       test
            jms
                TestSendMessage.class
                 TestMessageDrivenBean.class
打包好后,将TestJMS_fat.jar扔到 %Glassfish_HOME%/domains/domain1/autodeploy下即可。

这样一个完整的收发JMS消息的程序便算大功告成。
如果我们的mdb打包是一个web工程,在控制台会报错,不用管它,不会影响我们对mdb的使用。
大家可以参考: http://www.jroller.com/vprise/entry/trying_glassfish_again
这篇文章就是说的如果我们的mdb是打包的web工程,将会出现的错误。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics