﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-KE-文章分类-jboss</title><link>http://www.blogjava.net/keweibo/category/28980.html</link><description>As long as you are there to lead me ,I won't lose my way </description><language>zh-cn</language><lastBuildDate>Wed, 16 Jan 2008 04:06:01 GMT</lastBuildDate><pubDate>Wed, 16 Jan 2008 04:06:01 GMT</pubDate><ttl>60</ttl><item><title>java.lang.IllegalAccessError: tried to access method net.sf.ehcache.CacheManager.&lt;init&gt;()V from class org.hibernate.cache.EhCacheProvider</title><link>http://www.blogjava.net/keweibo/articles/175619.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Wed, 16 Jan 2008 02:36:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/175619.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/175619.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/175619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/175619.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/175619.html</trackback:ping><description><![CDATA[今天把项目从Tomcat下转移到JBOSS了,启动JBOSS服务器之后出了,控制台输出了<br />
java.lang.IllegalAccessError: tried to access method net.sf.ehcache.CacheManager.&lt;init&gt;()V from class org.hibernate.cache.EhCacheProvider<br />
此类错误错误信息,上网上查了一下.大概了解了下,原来是JAR文件版本问题,<br />
<div id="post_message_65747">The latest hibernate uses ehcache 1.2 - you seem to be using an older version (1.1 maybe). Upgrade your ehcache library and report back if you still have problems.</div>
<!-- / message --><!-- sig --><br />
原来项目中使用了ehcache-1.1.jar文件,<br />
把它换成<span style="color: #3366ff"><strong>ehcache-1.2.3.jar</strong></span>文件后,<br />
重新启动JBOSS服务器,问题解决~~~~
 <img src ="http://www.blogjava.net/keweibo/aggbug/175619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2008-01-16 10:36 <a href="http://www.blogjava.net/keweibo/articles/175619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j:ERROR A "org.jboss.logging.util.OnlyOnceErrorHandler" object is not assignable to a "org.apache.log4j.spi.ErrorHandler" variable的异常</title><link>http://www.blogjava.net/keweibo/articles/175618.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Wed, 16 Jan 2008 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/175618.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/175618.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/175618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/175618.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/175618.html</trackback:ping><description><![CDATA[<p><font size="3">log4j是一个很好的开源的日志项目，下面就我在实际中使用的一些情况作一个小结（我所写的是以spring为框架的运用，之所以要提到这点，是因为在spring中专门有处理log4j的地方，而我也用到了这些地方）。</font></p>
<p><font size="3">&nbsp;在使用的第一步你要明白你所发布的web项目所使用的服务器，因为不同的服务器对于使用log4j是有些不同的，我在实际使用中主要是用tomcat和jboss两类，对于tomcat,它本身是没有配置log4j的，所以使用起来和常规的一样；而在jboss中它是本身配置了log4j的，所以有时候我们在看项目代码时，其整个项目并没有log4j的配置文件，而在一些类中仍然定义了Logger,例如static Logger log = org.apache.log4j.Logger.getLogger(UserDaoImple.class);，这就表明开发者打算使用jboss默认的log4j的配置，我们可以在jboss下的对应的log目录下的server.log中看到日志，jboss本身的log4j的配置是将debug,info级的日志写在server.log中，而像error等级别比较高的日志打印到控制台上，而写到server.log中的日志比较多，并不方便查看。于是我们想到使用自己的log4j配置写到某个具体的文件中（注意文件要先建立，才能忘里面写东西，log4j自己不能建立文件），但这里因为jboss有它自己的log4j配置，所以如果我们配置的log4j包含Console的Appender时，就会出错，错误类似于</font></p>
<p><font size="3"><font color="#ff0000">ERROR: invalid console appender config detected, console stream is looping.</font><br />
解决方法一是不用Console的Appender,或者改jboss的配置文件，在jboss-service.xml文件里,把<br />
&lt;mbean code="org.jboss.logging.Log4jService" name="jboss.system:type=Log4jService,service=Logging"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;attribute name="ConfigurationURL"&gt;resource:log4j.xml&lt;/attribute&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&lt;attribute name="CatchSystemOut"&gt;false&lt;/attribute&gt;</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;attribute name="Log4jQuietMode"&gt;true&lt;/attribute&gt;<br />
&lt;/mbean&gt;。</font></p>
<p><font size="3">我建议不用Console的Appender<img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/teeth_smile.gif" />，当然这是对jboss3.2.x是这样，<strong>对于jboss4.0.x如果我们要用自己的log4j配置照上述改还是会有问题，会有类似于</strong></font><font color="#ff0000"><font size="3"><strong>log4j:ERROR A "org.jboss.logging.util.OnlyOnceErrorHandler" object is not assignable to a "org.apache.log4j.spi.ErrorHandler" variable</strong></font><font color="#000000" size="3"><strong>的异常，解决方法是把/server/default/jbossweb-tomcat55.sar/META-INF/jboss-service.xml 中的以下两个熟悉改成true<br />
&lt;attribute name="Java2ClassLoadingCompliance"&gt;<span style="color: red">true</span>&lt;/attribute&gt; <br />
&lt;attribute name="UseJBossWebLoader"&gt;<span style="color: red">true</span>&lt;/attribute&gt; </strong></font></font></p>
<p><font color="#ff0000"><font color="#000000" size="3"><strong>以上就是使用jboss服务器可能出现的问题，解决了这些再来使用log4j就比较简单了。</strong></font></font></p>
<p><font color="#ff0000"><font color="#000000" size="3">下面说说对于采用了spring框架的项目如何使用log4j,在spring中使用log4j，有些方便的地方，</font></font></p>
<p><font color="#ff0000"><font color="#000000" size="3">1. 动态的改变记录级别和策略，即修改log4j.properties,不需要重启Web应用，这需要在web.xml中设置一下。<br />
2. 把log文件定在 /WEB-INF/logs/ 而不需要写绝对路径。 <br />
3. 可以把log4j.properties和其他properties一起放在/WEB-INF/ ，而不是Class-Path。</font></font></p>
<p><font color="#ff0000"><font color="#000000" size="3">首先我们在web.xml中需要设定一下</font></font></p>
<p><font color="#ff0000"><font color="#000000" size="3">&lt;context-param&gt; <br />
&lt;param-name&gt;log4jConfigLocation&lt;/param-name&gt; <br />
&lt;param-value&gt;WEB-INF/log4j.properties&lt;/param-value&gt; <br />
&lt;/context-param&gt; <br />
<br />
&lt;context-param&gt; <br />
&lt;param-name&gt;log4jRefreshInterval&lt;/param-name&gt; <br />
&lt;param-value&gt;60000&lt;/param-value&gt; <br />
&lt;/context-param&gt; <br />
<br />
&lt;listener&gt; <br />
&lt;listener-class&gt;org.springframework.web.util.Log4jConfigListener&lt;/listener-class&gt; <br />
&lt;/listener&gt;&nbsp;<br />
其中第二部分就是能够动态修改log4j.properties的关键，容器会每60秒扫描log4j的配置文件&nbsp;。</font></font><font color="#ff0000"><font color="#000000" size="3">对于log4j的配置文件如何写，这就不多说了，大家可以去google，有一点就是我们如果用RollingFileAppender或者FileAppender时，可以通过${webapp.root}来定位到服务器的发布的该项目下，这是spring把web目录的路径压入到了webapp.root的系统变量。然后，在log4j.properties 里就可以这样定义logfile位置 <br />
log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/myfuse.log <br />
如果有多个web应用，怕webapp.root变量重复，可以在context-param里定义webAppRootKey。</font></font></p>
<p><font color="#ff0000"><font color="#000000" size="3"><font size="3">当我们定义完log4j.properties后，剩下的就是在需要记录的class中new 出Logger了<img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/teeth_smile.gif" /><br />
<br />
</font></font></font></p>
<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1067141</p>
 <img src ="http://www.blogjava.net/keweibo/aggbug/175618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2008-01-16 10:30 <a href="http://www.blogjava.net/keweibo/articles/175618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:用Spring快速开发jms应用（JBOSS服务器）</title><link>http://www.blogjava.net/keweibo/articles/175545.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Tue, 15 Jan 2008 13:00:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/175545.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/175545.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/175545.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/175545.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/175545.html</trackback:ping><description><![CDATA[异步进程通信是面向服务架构(SOA)一个重要的组成部分，因为企业里很多系统通信，特别是与外部组织间的通信，实质上都是异步的。<a href="http://java.sun.com/products/jms/" target="_blank"><strong><font color="#006bad">Java消息服务</font></strong></a>(JMS)是用于编写使用异步消息传递的JEE应用程序的API。传统的使用JMS API进行消息传递的实现包括多个步骤，例如JNDI查询队列连接工厂和Queue资源，在实际发送和接收消息前创建一个JMS会话。
<div class="postText">
<p>　　 <a href="http://www.springframework.org/" target="_blank"><strong><font color="#006bad">Spring框架</font></strong></a>则简化了使用JEE组件(包括JMS)的任务。它提供的模板机制隐藏了典型的JMS实现的细节，这样开发人员可以集中精力放在处理消息的实际工作中，而不用担心如何去创建，访问或清除JMS资源。</p>
<p>　　 本文将对Spring JMS API作一个概述，并通过一个运行在JBoss MQ服务器上的web例程来介绍如何使用Spring JMS API来异步处理（发送和接收）消息。我将通过传统JMS实现和Spring JMS实现两者间的比较，来展示使用Spring JMS处理消息是如何的简单和灵活。</p>
<h3>异步消息传递和面向服务架构</h3>
<p>　　在现实中，大多数web请求都是同步处理的。例如，当用户要登入一个网站，首先输入用户名和密码，然后服务器验证登录合法性。如果验证成功，程序将允许该用户进入网站。这里，登录请求在从客户端接收以后被即时处理了。信用卡验证是另一个同步处理的例子；只有服务器证实输入的信用卡号是有效的，同时客户在帐户上有足够的存款，客户才被允许继续操作。但是让我们思考一下在顺序处理系统上的支付结算步骤。一旦系统证实该用户信用卡的信息是准确的，并且在帐户上有足够的资金，就不必等到所有的支付细节落实、转账完成。支付结算可以异步方式进行，这样客户可以继续进行核查操作。</p>
<p>　　 需要比典型同步请求耗费更长时间的请求，可以使用异步处理。另一个异步处理的例子是，在本地贷款处理程序中，提交至自动承销系统（AUS）的信用请求处理过程。当借方提交贷款申请后，抵押公司会向AUS发送请求，以获取信用历史记录。由于这个请求要求得到全面而又详细的信用报告，包括借方现今和过去的帐户，最近的付款和其他财务资料，服务器需要耗费较长的时间（几小时或着有时甚至是几天）来对这些请求作出响应。客户端程序（应用）要与服务器连接并耗费如此长的时间来等待结果，这是毫无意义的。因此通信应该是异步发生的；也就是，一旦请求被提交，它就被放置在队列中，同时客户端与服务器断开连接。然后AUS服务从指定的队列中选出请求进行处理，并将处理得到的消息放置在另一个消息队列里。最后，客户端程序从这个队列中选出处理结果，紧接着处理这个信用历史数据。</p>
<h3>JMS</h3>
<p>　　 如果您使用过JMS代码，您会发现它与JDBC或JCA很像。它所包含的样本代码创建或JMS资源对象回溯，使得每一次您需要写一个新类来发送和接收消息时，都具有更好的代码密集性和重复性。以下序列显示了传统JMS实现所包括的步骤：</p>
<ol type="1">
    <li>创建JNDI初始上下文（context）。
    <li>从JNDI上下文获取一个队列连接工厂。
    <li>从队列连接工厂中获取一个Quene。
    <li>创建一个Session对象。
    <li>创建一个发送者（sender）或接收者（receiver）对象。
    <li>使用步骤5创建的发送者或接收者对象发送或接收消息。
    <li>处理完消息后，关闭所有JMS资源。 </li>
</ol>
<p>您可以看到，步骤6是处理消息的唯一地方。其他步骤都只是管理与实际业务要求无关的JMS资源，但是开发人员必须编写并维护这些额外步骤的代码。</p>
<h3>Spring JMS</h3>
<p>　　 Spring框架提供了一个模板机制来隐藏Java APIs的细节。JEE开发人员可以使用JDBCTemplate和JNDITemplate类来分别访问后台数据库和JEE资源（数据源，连接池）。JMS也不例外。Spring提供JMSTemplate类，因此开发人员不用为一个JMS实现去编写样本代码。接下来是在开发JMS应用程序时Spring所具有一些的优势。</p>
<ol type="1">
    <li>提供JMS抽象API，简化了访问目标（队列或主题）和向指定目标发布消息时JMS的使用。
    <li>JEE开发人员不需要关心JMS不同版本（例如JMS 1.0.2与JMS 1.1）之间的差异。
    <li>开发人员不必专门处理JMS异常，因为Spring为所有JMS异常提供了一个未经检查的异常，并在JMS代码中重新抛出。 </li>
</ol>
<h3>示例程序</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明：因为只是为了演示如何使用spring编写jms的应用，所以本例没有什么实际用途。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序功能：MessageProducer.java根据一用户信息产生一个消息发送到&nbsp;JMS Provider；由MessageConsumer.java接收。</p>
<p>1.在Jboss里配置XML文件创建一个新的JMS provider。<br />
打开位于%JBOSS_HOME%server\default\deploy\jms文件夹下的jbossmq-destinations-service.xml文件，加入以下代码片断：<br />
<span style="color: #3366ff"><strong>&nbsp;&lt;!--&nbsp; Register User Send/Receive Queue&nbsp; --&gt;<br />
&nbsp;&lt;mbean code="org.jboss.mq.server.jmx.Queue"<br />
&nbsp;&nbsp; name="jboss.mq.destination:service=Queue,name=registerUserQueue"&gt;<br />
&nbsp;&nbsp; &lt;depends optional-attribute-name="DestinationManager"&gt;jboss.mq:service=DestinationManager&lt;/depends&gt;<br />
&nbsp;&lt;/mbean&gt;<br />
&nbsp;&lt;!--&nbsp; Register User Send/Receive Topic&nbsp; --&gt;<br />
&nbsp;&lt;mbean code="org.jboss.mq.server.jmx.Topic"<br />
&nbsp; name="jboss.mq.destination:service=Topic,name=registerUserTopic"&gt;<br />
&nbsp;&nbsp; &lt;depends optional-attribute-name="DestinationManager"&gt;jboss.mq:service=DestinationManager&lt;/depends&gt;<br />
&nbsp;&lt;/mbean&gt;<br />
</strong></span>2.在spring的配置文件中配置JMS组件的具体细节。<br />
&nbsp;（1）JNDI上下文是取得JMS资源的起始位置，因此首先我们要配置JNDI模板：<br />
&nbsp;&nbsp;&nbsp; &lt;!-- JNDI上下文(它是取得JMS资源的起始位置) --&gt;<br />
&nbsp;&nbsp;<span style="color: #3366ff"><strong>&nbsp;&lt;bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="environment"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="java.naming.factory.initial"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.jnp.interfaces.NamingContextFactory<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="java.naming.provider.url"&gt;localhost&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="java.naming.factory.url.pkgs"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.jnp.interfaces:org.jboss.naming<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
</strong></span>&nbsp;&nbsp;&nbsp;注意：此JNDI模板用到了org.jnp.interfaces.NamingContextFactory所以要把%JBOSS_HOME%\client下的<span style="color: #3366ff">jbossall-client.jar</span>加到你的项目的classpath中。<br />
（2）配置连接工厂：<br />
&nbsp;&nbsp; &lt;!-- JMS连接工厂 --&gt;<br />
&nbsp;&nbsp;&nbsp;<strong style="color: #3366ff">&nbsp; &lt;bean id="jmsConnectionFactory"class="org.springframework.jndi.JndiObjectFactoryBean"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="jndiTemplate"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref bean="jndiTemplate" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="jndiName"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;XAConnectionFactory&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
</strong>&nbsp;&nbsp; 注意：XAConnectionFactory这个JNDI名字是在%JBOSS_HOME%server\default\deploy\jms文件夹下的jms-ds.xml中定义的(它是由JBoss指定的)。<br />
&nbsp;（3）配置JmsTemplate组件。在例程中我们使用JmsTemplate102。同时使用defaultDestination属性来指定JMS目标。<br />
&nbsp;&nbsp;&lt;!-- JMS模板配置 --&gt;<br />
&nbsp;&nbsp;<strong style="color: #3366ff">&lt;bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate102"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="connectionFactory" ref="jmsConnectionFactory" /&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="defaultDestination" ref="destination" /&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="pubSubDomain"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;true&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;!-- 等待消息的时间(ms) --&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="receiveTimeout"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;30000&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&lt;/bean&gt;<br />
</strong>&nbsp;&nbsp;注意：如果使用topic-subscribe(主题订阅)模式，该模板的pubSubDomain属性值为true;若使用PToP(点对点)模式，pubSubDomain属性值为false或不配置该属性。<br />
&nbsp;(4)定义一个JMS目标来发送和接收消息:<br />
&nbsp;&nbsp;<span style="color: #3366ff"><strong>&lt;bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="jndiTemplate"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref bean="jndiTemplate" /&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="jndiName"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;topic/registerUserTopic&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;/bean&gt;<br />
</strong></span>&nbsp;(5)配置发送者和接收者组件:<br />
&nbsp;&nbsp;&lt;!-- 消息发布者 --&gt;<br />
&nbsp;<strong style="color: #3366ff">&nbsp;&lt;bean id="msgProducer" class="com.boco.jms.MessageProducer"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="jmsTemplate" ref="jmsTemplate" /&gt;<br />
&nbsp;&nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp;&lt;!-- 消息接收者 --&gt;<br />
&nbsp;&nbsp;&lt;bean id="msgConsumer" class="com.boco.jms.MessageConsumer"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;property name="jmsTemplate" ref="jmsTemplate" /&gt;<br />
&nbsp;&nbsp;&lt;/bean&gt;<br />
</strong>3.相应的类:<br />
&nbsp;(1). User对象。<br />
&nbsp; &nbsp;/**<br />
&nbsp;&nbsp; *&nbsp; User.java<br />
&nbsp;&nbsp; *&nbsp; created on Jul 2, 2006<br />
&nbsp;&nbsp; *&nbsp; Copyrights 2006 BOCO,Inc. All rights reserved.<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;package com.boco.dto;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;import java.io.Serializable;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * desc: 用户信息 Bean<br />
&nbsp;&nbsp; * @author qiujy<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public class User {<br />
&nbsp;&nbsp;&nbsp;private int id;<br />
&nbsp;&nbsp;&nbsp;private String username;<br />
&nbsp;&nbsp;&nbsp;private String password;<br />
&nbsp;&nbsp;&nbsp;private String email;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;public User(){}<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;//以下为Getter,setter方法略<br />
&nbsp;&nbsp;&nbsp;......<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;(2).消息生产者：<br />
&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; *&nbsp; MessageProducer.java<br />
&nbsp;&nbsp; *&nbsp; created on Jul 22, 2006<br />
&nbsp;&nbsp; *&nbsp; Copyrights 2006 BOCO,Inc. All rights reserved.<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;package com.boco.jms;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;import javax.jms.JMSException;<br />
&nbsp;&nbsp;import javax.jms.MapMessage;<br />
&nbsp;&nbsp;import javax.jms.Message;<br />
&nbsp;&nbsp;import javax.jms.Session;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;import org.springframework.jms.core.JmsTemplate;<br />
&nbsp;&nbsp;import org.springframework.jms.core.MessageCreator;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;import com.boco.dto.User;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * desc:消息生产者<br />
&nbsp;&nbsp; * @author qiujy<br />
&nbsp;&nbsp; *<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public class MessageProducer {<br />
&nbsp;&nbsp;&nbsp;/** JMS模板 */<br />
&nbsp;&nbsp;&nbsp;private JmsTemplate jmsTemplate;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;public void setJmsTemplate(JmsTemplate jmsTemplate){<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.jmsTemplate = jmsTemplate;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;public void sendMessage(final User user){<br />
&nbsp;&nbsp;&nbsp;&nbsp;//调用模板的send来发送消息<br />
&nbsp;&nbsp;&nbsp;&nbsp;jmsTemplate.send(new MessageCreator(){<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Message createMessage(Session session) throws JMSException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//构造一个要发送的消息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MapMessage message = session.createMapMessage();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setInt("id", user.getId());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setString("username", user.getUsername());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setString("password", user.getPassword());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setString("email", user.getEmail());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("send success!!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;(3).消息消费者：<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; *&nbsp; MessageConsumer.java<br />
&nbsp;&nbsp; *&nbsp; created on Jul 22, 2006<br />
&nbsp;&nbsp; *&nbsp; Copyrights 2006 BOCO,Inc. All rights reserved.<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;package com.boco.jms;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;import javax.jms.JMSException;<br />
&nbsp;&nbsp;import javax.jms.MapMessage;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;import org.springframework.jms.core.JmsTemplate;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;import com.boco.dto.User;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * desc:消息消费者<br />
&nbsp;&nbsp; * @author qiujy<br />
&nbsp;&nbsp; *<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public class MessageConsumer {<br />
&nbsp;&nbsp;&nbsp;/** JMS模板 */<br />
&nbsp;&nbsp;&nbsp;private JmsTemplate jmsTemplate;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;public void setJmsTemplate(JmsTemplate jmsTemplate){<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.jmsTemplate = jmsTemplate;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;public User receiveMessage(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;//参数为Destination的JNDI名字去掉前面的模式类型标识<br />
&nbsp;&nbsp;&nbsp;&nbsp;//MapMessage msg = (MapMessage)jmsTemplate.receive("registerUserQueue");<br />
&nbsp;&nbsp;&nbsp;&nbsp;MapMessage msg = (MapMessage)jmsTemplate.receive("registerUserTopic");<br />
&nbsp;&nbsp;&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setId(msg.getInt("id"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setUsername(msg.getString("username"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setPassword(msg.getString("password"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setEmail(msg.getString("email"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;} catch (JMSException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return user;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;(4).测试用例：<br />
&nbsp;&nbsp;&nbsp;//======== 生产者测试用例 ===============<br />
&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; *&nbsp; TestMsgProducer.java<br />
&nbsp;&nbsp; *&nbsp; created on Jul 22, 2006<br />
&nbsp;&nbsp; *&nbsp; Copyrights 2006 BOCO,Inc. All rights reserved.<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;package com.boco.jms;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;import junit.framework.TestCase;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;import org.springframework.context.ApplicationContext;<br />
&nbsp;&nbsp;import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;import com.boco.dto.User;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * desc:<br />
&nbsp;&nbsp; * @author qiujy<br />
&nbsp;&nbsp; *<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public class TestMsgProducer extends TestCase {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;private ApplicationContext context;<br />
&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp; * @param arg0<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;public TestMsgProducer(String arg0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;super(arg0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;context = new ClassPathXmlApplicationContext("applicationContext_jms.xml");<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;/* (non-Javadoc)<br />
&nbsp;&nbsp;&nbsp; * @see junit.framework.TestCase#setUp()<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;protected void setUp() throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;super.setUp();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;/* (non-Javadoc)<br />
&nbsp;&nbsp;&nbsp; * @see junit.framework.TestCase#tearDown()<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;protected void tearDown() throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;super.tearDown();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp; * Test method for <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#55;&#66;&#64;&#108;&#105;&#110;&#107;"><strong><font color="#006bad">{@link</font></strong></a> com.boco.jms.MessageProducer#sendMessage(com.boco.dto.User)}.<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;public void testSendMessage() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;&nbsp;&nbsp;user.setId(132);<br />
&nbsp;&nbsp;&nbsp;&nbsp;user.setUsername("JMSTest");<br />
&nbsp;&nbsp;&nbsp;&nbsp;user.setPassword("password");<br />
&nbsp;&nbsp;&nbsp;&nbsp;user.setEmail("<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#117;&#112;&#112;&#111;&#114;&#116;&#64;&#98;&#111;&#99;&#111;&#46;&#99;&#111;&#109;&#46;&#99;&#110;"><strong><font color="#006bad">support@boco.com.cn</font></strong></a>");<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;MessageProducer producer = (MessageProducer)context.getBean("msgProducer");<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;producer.sendMessage(user);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;//============ 消费者测试用例 ===============<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; *&nbsp; TestMsgConsumer.java<br />
&nbsp;&nbsp; *&nbsp; created on Jul 22, 2006<br />
&nbsp;&nbsp; *&nbsp; Copyrights 2006 BOCO,Inc. All rights reserved.<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;package com.boco.jms;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;import junit.framework.TestCase;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;import org.springframework.context.ApplicationContext;<br />
&nbsp;&nbsp;import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;import com.boco.dto.User;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * desc:<br />
&nbsp;&nbsp; * @author qiujy<br />
&nbsp;&nbsp; *<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public class TestMsgConsumer extends TestCase {<br />
&nbsp;&nbsp;&nbsp;private ApplicationContext context;<br />
&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp; * @param arg0<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;public TestMsgConsumer(String arg0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;super(arg0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;context = new ClassPathXmlApplicationContext("applicationContext_jms.xml");<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;/* (non-Javadoc)<br />
&nbsp;&nbsp;&nbsp; * @see junit.framework.TestCase#setUp()<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;protected void setUp() throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;super.setUp();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;/* (non-Javadoc)<br />
&nbsp;&nbsp;&nbsp; * @see junit.framework.TestCase#tearDown()<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;protected void tearDown() throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;super.tearDown();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp; * Test method for <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#55;&#66;&#64;&#108;&#105;&#110;&#107;"><strong><font color="#006bad">{@link</font></strong></a> com.boco.jms.MessageConsumer#receiveMessage()}.<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;public void testReceiveMessage() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;MessageConsumer consumer = (MessageConsumer)context.getBean("msgConsumer");<br />
&nbsp;&nbsp;&nbsp;&nbsp;User user = consumer.receiveMessage();<br />
&nbsp;&nbsp;&nbsp;&nbsp;assertNotNull(user);<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println( "id========" + user.getId()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ "\nname======" + user.getUsername()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ "\npassword==" + user.getPassword()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ "\nemail=====" + user.getEmail());<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;}</p>
&nbsp;</div>
<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1418938<br />
<br />
<strong><u style="color: red">启动JBOSS服务器.先运行TestMsgConsumer.java;再运行TestMsgProducer.java,即可看到控制台的输出了,嘻嘻~~~~~</u></strong></p>
<img src ="http://www.blogjava.net/keweibo/aggbug/175545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2008-01-15 21:00 <a href="http://www.blogjava.net/keweibo/articles/175545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>