`
lu2002lulu
  • 浏览: 97338 次
  • 性别: 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工程,将会出现的错误。

分享到:
评论

相关推荐

    glassfish_demo

    步骤二:创建或导入域 在首次部署应用之前,可能需要创建一个新的域或者导入现有的域配置。使用`asadmin create-domain`命令创建新域,或者使用`asadmin import-domain`命令导入已有的域配置。 步骤三:部署WAR文件...

    Sun Glassfish v3 Administration 2009/12 PDF

    - **“希望大家可以使用愉快”**:作者希望读者能够通过阅读此文档获得愉快的学习体验并成功地管理Glassfish v3。 #### 标签分析 - **glassfish**:指的是Sun Microsystems开发的应用服务器产品,支持Java EE标准。...

    Java EE 6 with GlassFish 3 Application Server

    4. **JSF 2.0**:JavaServer Faces的第二个主要版本,引入了Facelets作为默认视图技术,提供了更简洁的视图声明和组件树管理。此外,还引入了部分刷新和 AJAX 支持,增强了用户体验。 5. **EJB 3.1**:EJB在这一...

    Glassfish + josso 单点登录范例

    通过上述步骤,我们成功实现了基于Glassfish与JOSSO的单点登录系统,并利用MySQL数据库存储了经过MD5加密的用户密码,从而确保了系统的安全性和用户的便捷体验。此外,通过实践操作加深了对单点登录机制的理解,为...

    glassfish-6_2007

    #### 二、发展历程 1. **2004年**: 开始整合一系列关键组件,包括Tomcat、Jasper、Catalina等。 2. **2005年**: 继续集成更多的技术和框架,如Struts、Crimson等。 3. **2006年5月**: GlassFish正式发布,标志着项目...

    GlassFish Security

    2. **GlassFish安全特性**:详细介绍GlassFish提供的各种内置安全功能,如身份验证、授权、加密等。 3. **Java EE安全机制**:深入探讨Java EE规范中的安全机制,包括如何利用这些机制保护Web应用、EJB应用、...

    GlassFish+josso单点登录

    2. **配置Josso与GlassFish集成:** - **部署Josso网关应用**: 1. 将Josso安装包中的`josso-gateway-web-1.8.0.war`文件复制到GlassFish的`domains/domain1/autodeploy`目录下。 2. 等待GlassFish自动部署该WAR...

    jmaki development with sun glassfish v3

    **技术预览版本 2** 的发布标志着 jMaki 在 Sun GlassFish V3 上的应用取得了显著进展。这个版本包含了多项改进和新特性,包括但不限于对动态网页构建的支持增强以及与 GlassFish V3 的更深层次集成。通过 jMaki,...

    GlassFish_Enterprise_WP.rar_wp

    DWR通过Ajax技术,极大地提高了用户体验,用户无需刷新页面就能获取或更新数据。例如,在一个动态表格应用中,用户可以即时查看数据库中的最新信息,而无需等待整个页面重新加载。 集成DWR到GlassFish中,开发者...

    glassfish 4.1 AP 標題列圖片撐開排除方法1

    《Glassfish 4.1 AP 标题列图片撑开问题解决方案》 在开发Java EE应用程序时,我们可能会遇到各种各样的技术难题。在Glassfish 4.1应用程序服务器环境中,尤其是在使用JavaServer Faces (JSF) 2.2渲染XHTML页面时,...

    jsf_page.rar_ jsf_page_JSF_PAGE_java jsf_jsf glassfish_jsp page

    2. JSF与JSP(JavaServer Pages)的关系: - JSF是一种MVC(模型-视图-控制器)框架,而JSP是一种用于创建动态网页的技术。在JSF中,JSP通常作为视图层,用于渲染JSF组件。 - JSF的视图是由UI组件(如输入字段、...

    jvisualvm 插件集合

    专门为Glassfish应用服务器设计的插件,提供全面的监控和管理功能,包括服务器状态、应用部署、性能统计等,优化了对Glassfish环境的运维体验。 8. **VisualGC插件(com-sun-tools-visualvm-modules-visualgc.nbm...

    5 j2ee体验之Web建立、发布与运行.rar

    1. **环境配置**:首先,你需要安装Java Development Kit(JDK)和一个j2EE兼容的应用服务器,如Tomcat或Glassfish。这些工具为开发和运行Web应用提供了必要的环境。 2. **项目结构**:按照j2EE规范,Web应用的目录...

    深入体验Java Web开发内幕——核心基础

    Java EE容器如Tomcat、Jetty、Glassfish等,它们负责管理Web应用的生命周期,提供Servlet和JSP的运行环境。容器自动处理线程安全、事务管理等问题,开发者只需关注业务逻辑。 六、数据库连接与JDBC Java Database ...

    深入体验Java_Web开发内幕-核心基础.高清扫描版

    2. **MVC设计模式**:Model-View-Controller(模型-视图-控制器)模式是Web应用中常用的设计模式,有助于实现业务逻辑、数据和用户界面的分离。书中会介绍如何在Java Web中实现和运用MVC架构。 3. **JDBC与数据库...

    glass 调优

    2. **应用调优**:在应用层面,调优可能包括代码优化、数据库优化、缓存使用、查询优化、代码分解等多个方面。应用调优的目的是减少应用的响应时间、提高吞吐量,并降低资源消耗,从而提供更快更流畅的用户体验。 3...

    NetBeans Struts2 插件 惟一一个支持Struts2的IDE

    在实际开发中,安装并启用NetBeans Struts2插件后,开发者可以享受到无缝的Struts2开发体验,无需离开IDE就可以完成大部分开发任务,从而提高工作效率。这个插件是NetBeans对Struts2开发者友好性的体现,也是其成为...

Global site tag (gtag.js) - Google Analytics