﻿<?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-hk2000c技术专栏-随笔分类-JMS</title><link>http://www.blogjava.net/hk2000c/category/27378.html</link><description>技术源于哲学，哲学来源于生活

关心生活，关注健康，关心他人

</description><language>zh-cn</language><lastBuildDate>Sat, 17 Nov 2007 19:02:56 GMT</lastBuildDate><pubDate>Sat, 17 Nov 2007 19:02:56 GMT</pubDate><ttl>60</ttl><item><title>Mapping a Blob to a byte[]</title><link>http://www.blogjava.net/hk2000c/archive/2007/11/16/161085.html</link><dc:creator>hk2000c</dc:creator><author>hk2000c</author><pubDate>Fri, 16 Nov 2007 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/hk2000c/archive/2007/11/16/161085.html</guid><wfw:comment>http://www.blogjava.net/hk2000c/comments/161085.html</wfw:comment><comments>http://www.blogjava.net/hk2000c/archive/2007/11/16/161085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hk2000c/comments/commentRss/161085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hk2000c/services/trackbacks/161085.html</trackback:ping><description><![CDATA[<p><span style="color: #cc0000">Hibernate</span> 1.2.3 has built-in support for <span style="color: #cc0000">blob</span>s. <span style="color: #cc0000">Hibernate</span> natively maps <span style="color: #cc0000">blob</span> columns to <tt>java.sql.<span style="color: #cc0000">Blob</span></tt>. However, it's sometimes useful to read the whole <span style="color: #cc0000">blob</span> into memory and deal with it as a byte array.</p>
<p>One approach for doing this to create a new <tt>UserType</tt> as follows.</p>
<pre class="code">package mypackage;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.sql.<span style="color: #cc0000">Blob</span>;
import cirrus.<span style="color: #cc0000">hibernate</span>.<span style="color: #cc0000">Hibernate</span>;
import cirrus.<span style="color: #cc0000">hibernate</span>.<span style="color: #cc0000">Hibernate</span>Exception;
import cirrus.<span style="color: #cc0000">hibernate</span>.UserType;
public class Binary<span style="color: #cc0000">Blob</span>Type implements UserType
{
public int[] sqlTypes()
{
return new int[] { Types.<span style="color: #cc0000">BLOB</span> };
}
public Class returnedClass()
{
return byte[].class;
}
public boolean equals(Object x, Object y)
{
return (x == y)
|| (x != null
&amp;&amp; y != null
&amp;&amp; java.util.Arrays.equals((byte[]) x, (byte[]) y));
}
public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
throws <span style="color: #cc0000">Hibernate</span>Exception, SQLException
{
<span style="color: #cc0000">Blob</span> <span style="color: #cc0000">blob</span> = rs.get<span style="color: #cc0000">Blob</span>(names[0]);
return <span style="color: #cc0000">blob</span>.getBytes(1, (int) <span style="color: #cc0000">blob</span>.length());
}
public void nullSafeSet(PreparedStatement st, Object value, int index)
throws <span style="color: #cc0000">Hibernate</span>Exception, SQLException
{
st.set<span style="color: #cc0000">Blob</span>(index, <span style="color: #cc0000">Hibernate</span>.create<span style="color: #cc0000">Blob</span>((byte[]) value));
}
public Object deepCopy(Object value)
{
if (value == null) return null;
byte[] bytes = (byte[]) value;
byte[] result = new byte[bytes.length];
System.arraycopy(bytes, 0, result, 0, bytes.length);
return result;
}
public boolean isMutable()
{
return true;
}
}
</pre>
<p>The <tt>Binary<span style="color: #cc0000">Blob</span>Type</tt> will convert a <span style="color: #cc0000">blob</span> into a byte array and back again. </p>
<p>Here's how to use it. First, define an entity that contains a byte[] property:</p>
<pre class="code">public class ImageValue
{
private long id;
private image byte[];
public long getId() { return id; }
public void setId(long id) { this.id = id; }
public byte[] getImage() { return image; }
public void setImage(byte[] image) { this.image = image; }
}
</pre>
<p>Then map a <span style="color: #cc0000">blob</span> column onto the byte[] property:</p>
<pre class="code">&lt;class name="ImageValue" table="IMAGE_VALUE"&gt;
&lt;id name="id/&gt;
&lt;property name="image" column="IMAGE" type="mypackage.Binary<span style="color: #cc0000">Blob</span>Type"/&gt;
&lt;/class&gt;
</pre>
<p>Notes:</p>
<p>1) <span style="color: #cc0000">Blob</span>s aren't cachable. By converting the <span style="color: #cc0000">blob</span> into a byte array, you can now cache the entity.</p>
<p>2) This approach reads the whole <span style="color: #cc0000">blob</span> into memory at once.</p>
<p>3) The above type is known to work for reading <span style="color: #cc0000">blob</span>s out of the db. Other usage patterns might also work.</p>
<p><em>Comments (GK)</em></p>
<p><em>I changed <tt>isMutable()</tt> to return true, since an array is a mutable object.</em></p>
<p><em>The use of <tt>set<span style="color: #cc0000">Blob</span>()</tt> will work on some drivers, but not all. I think its more portable to use <tt>setBytes()</tt> or even <tt>setBinaryStream()</tt>.</em></p>
<p><em>comments (db)</em></p>
<p><em>db's comment above was right, <tt>set<span style="color: #cc0000">Blob</span>()</tt> didn't work on <span style="color: #cc0000">Oracle</span>, I used <tt>setBytes()</tt>.</em></p>
<p><em>comments (Chad Woolley)</em></p>
<p>Below is a modified nullsafeset() that i needed to use to get it to work with tomcat 4.1.27 &amp; <span style="color: #cc0000">oracle</span> 8/9i - the normal calls don't work through the tomcat/dbcp connection pool wrapper objects... (this caused me great pain)</p>
<p>pls note that the setBytes() doesn't seem to work with <span style="color: #cc0000">oracle</span> driver &amp; <span style="color: #cc0000">hibernate</span></p>
<p>d.birch@eclipsegroup.com.au</p>
<pre class="code">public void nullSafeSet(PreparedStatement st, Object value, int index)
throws <span style="color: #cc0000">Hibernate</span>Exception, SQLException
{
if(st instanceof org.apache.commons.dbcp.DelegatingPreparedStatement &amp;&amp;
((org.apache.commons.dbcp.DelegatingPreparedStatement)st).getDelegate()
instanceof <span style="color: #cc0000">oracle</span>.jdbc.<span style="color: #cc0000">Oracle</span>PreparedStatement)
{
<span style="color: #cc0000">oracle</span>.sql.<span style="color: #cc0000">BLOB</span> <span style="color: #cc0000">blob</span> = <span style="color: #cc0000">oracle</span>.sql.<span style="color: #cc0000">BLOB</span>.createTemporary(
((org.apache.commons.dbcp.PoolableConnection)st.getConnection()).getDelegate(), false, <span style="color: #cc0000">oracle</span>.sql.<span style="color: #cc0000">BLOB</span>.DURATION_SESSION);
<span style="color: #cc0000">blob</span>.open(<span style="color: #cc0000">BLOB</span>.MODE_READWRITE);
OutputStream out = <span style="color: #cc0000">blob</span>.getBinaryOutputStream();
try
{
out.write((byte[])value);
out.flush();
out.close();
}
catch(IOException e)
{
throw new SQLException("failed write to <span style="color: #cc0000">blob</span>" + e.getMessage());
}
<span style="color: #cc0000">blob</span>.close();
((<span style="color: #cc0000">oracle</span>.jdbc.<span style="color: #cc0000">Oracle</span>PreparedStatement)((org.apache.commons.dbcp.DelegatingPreparedStatement)st).getDelegate()).set<span style="color: #cc0000">BLOB</span>(index, <span style="color: #cc0000">blob</span>);
}
else
{
st.set<span style="color: #cc0000">Blob</span>(index, <span style="color: #cc0000">Hibernate</span>.create<span style="color: #cc0000">Blob</span>((byte[]) value));
}
}
//and.. note the null check, <span style="color: #cc0000">oracle</span> drivers return a null <span style="color: #cc0000">blob</span>...
public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
throws <span style="color: #cc0000">Hibernate</span>Exception, SQLException
{
final <span style="color: #cc0000">Blob</span> <span style="color: #cc0000">blob</span> = rs.get<span style="color: #cc0000">Blob</span>(names[0]);
return <span style="color: #cc0000">blob</span> != null?<span style="color: #cc0000">blob</span>.getBytes(1, (int)<span style="color: #cc0000">blob</span>.length()):null;
}
</pre>
<p>/ comments Vanitha</p>
<p>I had to use the user type to save pdfs as ora<span style="color: #cc0000">BLOB</span>s in <span style="color: #cc0000">oracle</span> 91 database. nullsafeSet </p>
<p>needed a sligh modification , or else ther was a classcastexception. Used <span style="color: #cc0000">oracle</span> <span style="color: #cc0000">Blob</span> instead of <span style="color: #cc0000">Hibernate</span> <span style="color: #cc0000">Blob</span> type and it works.</p>
<pre class="code"> public void nullSafeSet(PreparedStatement st, Object value, int index)
throws <span style="color: #cc0000">Hibernate</span>Exception, SQLException
{
<span style="color: #cc0000">oracle</span>.sql.<span style="color: #cc0000">BLOB</span> t_<span style="color: #cc0000">blob</span> = <span style="color: #cc0000">oracle</span>.sql.<span style="color: #cc0000">BLOB</span>.createTemporary(((org.jboss.resource.adapter.jdbc.WrappedConnection) st.getConnection()).getUnderlyingConnection(),
false, <span style="color: #cc0000">oracle</span>.sql.<span style="color: #cc0000">BLOB</span>.DURATION_SESSION);
OutputStream t_out = null;
t_<span style="color: #cc0000">blob</span>.open(<span style="color: #cc0000">BLOB</span>.MODE_READWRITE);
t_out = t_<span style="color: #cc0000">blob</span>.getBinaryOutputStream();
try
{
t_out.write((byte[]) value);
t_out.flush();
t_out.close();
}
catch (IOException e)
{
throw new SQLException("failed write to <span style="color: #cc0000">blob</span>" + e.getMessage());
}
t_<span style="color: #cc0000">blob</span>.close();
st.set<span style="color: #cc0000">Blob</span>(index, t_<span style="color: #cc0000">blob</span>);
}
</pre>
<p>&lt;/code&gt;</p>
<!-- End Body -->
<img src ="http://www.blogjava.net/hk2000c/aggbug/161085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hk2000c/" target="_blank">hk2000c</a> 2007-11-16 17:46 <a href="http://www.blogjava.net/hk2000c/archive/2007/11/16/161085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring调用Oracle存储过程,并返回结果集的完整实例 </title><link>http://www.blogjava.net/hk2000c/archive/2007/11/16/161082.html</link><dc:creator>hk2000c</dc:creator><author>hk2000c</author><pubDate>Fri, 16 Nov 2007 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/hk2000c/archive/2007/11/16/161082.html</guid><wfw:comment>http://www.blogjava.net/hk2000c/comments/161082.html</wfw:comment><comments>http://www.blogjava.net/hk2000c/archive/2007/11/16/161082.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hk2000c/comments/commentRss/161082.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hk2000c/services/trackbacks/161082.html</trackback:ping><description><![CDATA[<p>这是总结以前使用spring调用Oracle存储过程，并用cursor返回结果集的一个完整实例，希望能对大家有帮助。 </p>
<p>1. 创建表： <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>create&nbsp;table&nbsp;TEST_USERS&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>(&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;USER_ID&nbsp;&nbsp;VARCHAR2(</span><span class="number">10</span><span>)&nbsp;not&nbsp;</span><span class="keyword">null</span><span>,&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2(</span><span class="number">10</span><span>)&nbsp;not&nbsp;</span><span class="keyword">null</span><span>,&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;PASSWORD&nbsp;VARCHAR2(</span><span class="number">20</span><span>)&nbsp;not&nbsp;</span><span class="keyword">null</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>)&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>2. 创建存储过程： <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>create&nbsp;or&nbsp;replace&nbsp;</span><span class="keyword">package</span><span>&nbsp;display_users_package&nbsp;is&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type&nbsp;search_results&nbsp;is&nbsp;ref&nbsp;cursor;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;display_users_proc(results_out&nbsp;out&nbsp;search_results,&nbsp;userId&nbsp;in&nbsp;test_users.user_id%type);&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>end&nbsp;display_users_package;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>create&nbsp;or&nbsp;replace&nbsp;</span><span class="keyword">package</span><span>&nbsp;body&nbsp;display_users_package&nbsp;is&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;display_users_proc(results_out&nbsp;out&nbsp;search_results,&nbsp;userId&nbsp;in&nbsp;test_users.user_id%type)&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;userId&nbsp;is&nbsp;not&nbsp;</span><span class="keyword">null</span><span>&nbsp;then&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;open&nbsp;results_out&nbsp;</span><span class="keyword">for</span><span>&nbsp;select&nbsp;*&nbsp;from&nbsp;test_users&nbsp;where&nbsp;user_id&nbsp;like&nbsp;userId&nbsp;||&nbsp;'%';&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;open&nbsp;results_out&nbsp;</span><span class="keyword">for</span><span>&nbsp;&nbsp;select&nbsp;*&nbsp;from&nbsp;test_users;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;</span><span class="keyword">if</span><span>;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;display_users_proc;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>end&nbsp;display_users_package;&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>这个results_out是一个游标类型，用来返回查找的结果集。</p>
<p>3.　完整实现代码： <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.sql.CallableStatement; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;java.sql.Connection; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;java.sql.ResultSet; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;java.sql.SQLException; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;java.util.ArrayList; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;java.util.HashMap; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;java.util.List; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;java.util.Map; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;javax.sql.DataSource; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;oracle.jdbc.OracleTypes; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;org.springframework.dao.DataAccessException; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;org.springframework.jdbc.core.CallableStatementCallback; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;org.springframework.jdbc.core.CallableStatementCreator; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;org.springframework.jdbc.core.JdbcTemplate; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;com.spring.stored.procedure.util.DataContextUtil; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="comment">/** </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;Jane&nbsp;Jiao </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;* </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;SpringStoredProce&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;List&lt;Map&gt;&nbsp;execute(String&nbsp;storedProc,&nbsp;String&nbsp;params){ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Map&gt;&nbsp;resultList&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">final</span><span>&nbsp;DataSource&nbsp;ds&nbsp;=&nbsp;DataContextUtil.getInstance().getDataSource(); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">final</span><span>&nbsp;JdbcTemplate&nbsp;template&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;JdbcTemplate(ds); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultList&nbsp;=&nbsp;(List&lt;Map&gt;)template.execute(</span><span class="keyword">new</span><span>&nbsp;ProcCallableStatementCreator(storedProc,&nbsp;params), &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;ProcCallableStatementCallback()); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">catch</span><span>(DataAccessException&nbsp;e){ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;RuntimeException(</span><span class="string">"execute&nbsp;method&nbsp;error&nbsp;:&nbsp;DataAccessException&nbsp;"</span><span>&nbsp;+&nbsp;e.getMessage()); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;resultList; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Create&nbsp;a&nbsp;callable&nbsp;statement&nbsp;in&nbsp;this&nbsp;connection. </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ProcCallableStatementCreator&nbsp;</span><span class="keyword">implements</span><span>&nbsp;CallableStatementCreator&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;storedProc; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;params; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Constructs&nbsp;a&nbsp;callable&nbsp;statement. </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;storedProc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;stored&nbsp;procedure's&nbsp;name. </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;params&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Input&nbsp;parameters. </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;outResultCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;of&nbsp;output&nbsp;result&nbsp;set. </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;ProcCallableStatementCreator(String&nbsp;storedProc,&nbsp;String&nbsp;params)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.params&nbsp;=&nbsp;params; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.storedProc&nbsp;=&nbsp;storedProc; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Returns&nbsp;a&nbsp;callable&nbsp;statement </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;conn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;to&nbsp;use&nbsp;to&nbsp;create&nbsp;statement </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;cs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;callable&nbsp;statement </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;CallableStatement&nbsp;createCallableStatement(Connection&nbsp;conn)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;storedProcName&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;StringBuffer(</span><span class="string">"call&nbsp;"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;storedProcName.append(storedProc&nbsp;+&nbsp;</span><span class="string">"("</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//set&nbsp;output&nbsp;parameters </span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;storedProcName.append(</span><span class="string">"?"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;storedProcName.append(</span><span class="string">",&nbsp;"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//set&nbsp;input&nbsp;parameters </span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;storedProcName.append(</span><span class="string">"?"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;storedProcName.append(</span><span class="string">")"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CallableStatement&nbsp;cs&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;set&nbsp;the&nbsp;first&nbsp;parameter&nbsp;is&nbsp;OracleTyep.CURSOR&nbsp;for&nbsp;oracel&nbsp;stored&nbsp;procedure </span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cs&nbsp;=&nbsp;conn.prepareCall(storedProcName.toString()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cs.registerOutParameter&nbsp;(</span><span class="number">1</span><span>,&nbsp;OracleTypes.CURSOR); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;set&nbsp;the&nbsp;sencond&nbsp;paramter </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cs.setObject(</span><span class="number">2</span><span>,&nbsp;params); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(SQLException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;RuntimeException(</span><span class="string">"createCallableStatement&nbsp;method&nbsp;Error&nbsp;:&nbsp;SQLException&nbsp;"</span><span>&nbsp;+&nbsp;e.getMessage()); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;cs; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;ProcCallableStatementCallback&nbsp;return&nbsp;a&nbsp;result&nbsp;object,&nbsp; </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;for&nbsp;example&nbsp;a&nbsp;collection&nbsp;of&nbsp;domain&nbsp;objects. </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ProcCallableStatementCallback&nbsp;</span><span class="keyword">implements</span><span>&nbsp;CallableStatementCallback&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Constructs&nbsp;a&nbsp;ProcCallableStatementCallback. </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;ProcCallableStatementCallback()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Returns&nbsp;a&nbsp;List(Map)&nbsp;collection. </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;cs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;object&nbsp;that&nbsp;can&nbsp;create&nbsp;a&nbsp;CallableStatement&nbsp;given&nbsp;a&nbsp;Connection </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;resultsList&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;result&nbsp;object&nbsp;returned&nbsp;by&nbsp;the&nbsp;action,&nbsp;or&nbsp;null </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;doInCallableStatement(CallableStatement&nbsp;cs){ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Map&gt;&nbsp;resultsMap&nbsp;=&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;ArrayList&lt;Map&gt;(); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cs.execute();&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;(ResultSet)&nbsp;cs.getObject(</span><span class="number">1</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(rs.next())&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;String,&nbsp;String&gt;&nbsp;rowMap&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HashMap&lt;String,&nbsp;String&gt;(); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rowMap.put(</span><span class="string">"userId"</span><span>,&nbsp;rs.getString(</span><span class="string">"USER_ID"</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rowMap.put(</span><span class="string">"name"</span><span>,&nbsp;rs.getString(</span><span class="string">"NAME"</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rowMap.put(</span><span class="string">"password"</span><span>,&nbsp;rs.getString(</span><span class="string">"PASSWORD"</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultsMap.add(rowMap); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.close(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">catch</span><span>(SQLException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;RuntimeException(</span><span class="string">"doInCallableStatement&nbsp;method&nbsp;error&nbsp;:&nbsp;SQLException&nbsp;"</span><span>&nbsp;+&nbsp;e.getMessage()); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;resultsMap; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>4.　测试代码，在这里使用了Junit4测试： <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;org.junit.Assert.assertNotNull;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;org.junit.Assert.assertTrue;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;java.util.List;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;java.util.Map;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;org.junit.After;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;org.junit.Before;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;org.junit.Test;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="comment">/**&nbsp; </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;Jane&nbsp;Jiao&nbsp; </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp; </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;SpringStoredProceTest&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;SpringStoredProce&nbsp;springStoredProce;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="comment">/**&nbsp; </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;java.lang.Exception&nbsp; </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Before</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setUp()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;springStoredProce&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SpringStoredProce();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="comment">/**&nbsp; </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;java.lang.Exception&nbsp; </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="annotation">@After</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;tearDown()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;springStoredProce&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="comment">/**&nbsp; </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Test&nbsp;method&nbsp;for&nbsp;{@link&nbsp;com.hactl.listingframework.dao.SpringStoredProce#execute(java.lang.String,&nbsp;java.lang.String)}.&nbsp; </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Test</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testExecute()&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">final</span><span>&nbsp;String&nbsp;storedProcName&nbsp;=&nbsp;</span><span class="string">"display_users_package.display_users_proc"</span><span>;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">final</span><span>&nbsp;String&nbsp;param&nbsp;=&nbsp;</span><span class="string">"test"</span><span>;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Map&gt;&nbsp;resultList&nbsp;=&nbsp;springStoredProce.execute(storedProcName,&nbsp;param);&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertNotNull(resultList);&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertTrue(resultList.size()&nbsp;&gt;&nbsp;</span><span class="number">0</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;resultList.size();&nbsp;i++)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;rowMap&nbsp;=&nbsp;resultList.get(i);&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">final</span><span>&nbsp;String&nbsp;userId&nbsp;=&nbsp;rowMap.get(</span><span class="string">"userId"</span><span>).toString();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">final</span><span>&nbsp;String&nbsp;name&nbsp;=&nbsp;rowMap.get(</span><span class="string">"name"</span><span>).toString();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">final</span><span>&nbsp;String&nbsp;password&nbsp;=&nbsp;rowMap.get(</span><span class="string">"password"</span><span>).toString();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"USER_ID="</span><span>&nbsp;+&nbsp;userId&nbsp;+&nbsp;</span><span class="string">"\t&nbsp;name="</span><span>&nbsp;+&nbsp;name&nbsp;+&nbsp;</span><span class="string">"\t&nbsp;password="</span><span>&nbsp;+&nbsp;password);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>5. 测试的输出结果：
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span>USER_ID=test1&nbsp;&nbsp;&nbsp;&nbsp;name=aa&nbsp;&nbsp;&nbsp;&nbsp;password=aa&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>USER_ID=test2&nbsp;&nbsp;&nbsp;&nbsp;name=bb&nbsp;&nbsp;&nbsp;&nbsp;password=bb&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>USER_ID=test3&nbsp;&nbsp;&nbsp;&nbsp;name=cc&nbsp;&nbsp;&nbsp;&nbsp;password=cc&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<img src ="http://www.blogjava.net/hk2000c/aggbug/161082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hk2000c/" target="_blank">hk2000c</a> 2007-11-16 17:31 <a href="http://www.blogjava.net/hk2000c/archive/2007/11/16/161082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ActiveMQ 实践之路(四) ActiveMQ 4.x +JBoss 4.x MDP实战篇 </title><link>http://www.blogjava.net/hk2000c/archive/2007/11/16/161072.html</link><dc:creator>hk2000c</dc:creator><author>hk2000c</author><pubDate>Fri, 16 Nov 2007 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/hk2000c/archive/2007/11/16/161072.html</guid><wfw:comment>http://www.blogjava.net/hk2000c/comments/161072.html</wfw:comment><comments>http://www.blogjava.net/hk2000c/archive/2007/11/16/161072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hk2000c/comments/commentRss/161072.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hk2000c/services/trackbacks/161072.html</trackback:ping><description><![CDATA[<div style="margin-top: 5px; margin-left: 15px"><strong>关键字:</strong> &nbsp; ActiveMQ&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div style="margin-top: 10px; margin-left: 15px; overflow: auto">
<table width="100%">
    <tbody>
        <tr>
            <td><font face="Arial">
            <p class="code_title"><font face="Arial">ActiveMQ 实践之路(四) ActiveMQ 4.x +JBoss 4.x MDP实战篇</font></p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在&lt;&lt;<a href="http://cctvx1.javaeye.com/admin/show/58056">ActiveMQ 实践之路(三) ActiveMQ 4.x +JBoss 4.x 整合篇</a> &gt;&gt;里面我们比较详细的讲解了ActiveMQ与JBoss的整合,<br />
            既然选择了JBoss,那么项目里面或多或少都会使用到EJB,下面我们就详细地介绍如何在ActiveMQ 4.x+JBOSS 4.x环境下开发<br />
            Message Driven Bean,并且与使用jbossMQ在配置上作了比较详细地比较。这里的OrderMessage 仅仅是一个自动生成的Message Driven Bean,在onMessage方法里面,作日志输入。</p>
            <p><font face="Arial">&nbsp;<font face="Arial">一. 配置ejb-jar.xml<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.&nbsp; ejb-jar.xml 不能使用<font color="#ff0000">XML DTD</font>,需要使用<font color="#ff0000">XML Schema(XSD)<br />
            </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face="Arial"><font face="Arial">很多朋友可能使用XDoclet来生成ejb-jar.xml,我这里直接使用XDoclet生成的ejb-jar.xml是</font></font><br />
            </font><br />
            </p>
            <font face="Arial">
            <div class="code_title"><font face="Arial">&lt;!--CTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dt--&gt;</font></div>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial">但是在ActiveMQ+JBoss配置中间需要使用新的XML Schema才能完成对ra的定义,如下.<br />
            </font></p>
            <div class="code_title">xml 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">ejb-jar</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://java.sun.com/xml/ns/j2ee"</span><span>&nbsp;</span><span class="attribute">xmlns:xsi</span><span>=</span><span class="attribute-value">"http://www.w3.org/2001/XMLSchema-instance"</span><span>&nbsp;</span><span class="attribute">xsi:schemaLocation</span><span>=</span><span class="attribute-value">"http://java.sun.com/xml/ns/j2ee&nbsp;http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">"2.1"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
            </ol>
            </div>
            <p>&nbsp;</p>
            <p><font face="Arial">2. ejb-jar.xml 直接使用JBossMQ的Message DriverBean 和使用ActiveMQ RA配置的区别</font></p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1) .<font face="Arial">使用JBossMQ的MessageDrivenBean的 <font color="#ff0000">ejb-jar.xml</font>配置</font></p>
            <font face="Arial">
            <div class="code_title">xml 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="comments">&lt;!--&nbsp;Message&nbsp;Driven&nbsp;Beans&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span class="tag">&lt;</span><span class="tag-name">message-driven</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">description</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">description</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">display-name</span><span class="tag">&gt;</span><span>Name&nbsp;for&nbsp;OrderMessage</span><span class="tag"><span class="tag-name">display-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ejb-name</span><span class="tag">&gt;</span><span>OrderMessage</span><span class="tag"><span class="tag-name">ejb-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ejb-class</span><span class="tag">&gt;</span><span>com.mostone.ejb.OrderMessage</span><span class="tag"><span class="tag-name">ejb-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">transaction-type</span><span class="tag">&gt;</span><span>Container</span><span class="tag"><span class="tag-name">transaction-type</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">acknowledge-mode</span><span class="tag">&gt;</span><span>Auto-acknowledge</span><span class="tag"><span class="tag-name">acknowledge-mode</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">message-driven-destination</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">destination-type</span><span class="tag">&gt;</span><span>javax.jms.Queue</span><span class="tag"><span class="tag-name">destination-type</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">message-driven-destination</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span class="tag"><span class="tag-name">message-driven</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
            </ol>
            </div>
            <p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp; (2). 使用ActiveMQ RA配置的MessageDrivenBean的<font color="#ff0000">ejb-jar.xml</font>配置 </font></p>
            <div class="code_title">xml 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="comments">&lt;!--&nbsp;Message&nbsp;Driven&nbsp;Beans&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span class="tag">&lt;</span><span class="tag-name">message-driven</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">description</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">description</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">display-name</span><span class="tag">&gt;</span><span>Name&nbsp;for&nbsp;OrderMessage</span><span class="tag"><span class="tag-name">display-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ejb-name</span><span class="tag">&gt;</span><span>OrderMessage</span><span class="tag"><span class="tag-name">ejb-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ejb-class</span><span class="tag">&gt;</span><span>com.mostone.ejb.OrderMessage</span><span class="tag"><span class="tag-name">ejb-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">transaction-type</span><span class="tag">&gt;</span><span>Container</span><span class="tag"><span class="tag-name">transaction-type</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">acknowledge-mode</span><span class="tag">&gt;</span><span>Auto-acknowledge</span><span class="tag"><span class="tag-name">acknowledge-mode</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--使用了activetion-config--&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property-name</span><span class="tag">&gt;</span><span>destination</span><span class="tag"><span class="tag-name">activation-config-property-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property-value</span><span class="tag">&gt;</span><span>queue.outbound</span><span class="tag"><span class="tag-name">activation-config-property-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">activation-config-property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property-name</span><span class="tag">&gt;</span><span>destinationType</span><span class="tag"><span class="tag-name">activation-config-property-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property-value</span><span class="tag">&gt;</span><span>javax.jms.Queue</span><span class="tag"><span class="tag-name">activation-config-property-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">activation-config-property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">activation-config</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span class="tag"><span class="tag-name">message-driven</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
            </ol>
            </div>
            <p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中destination,destinationType是ra.xml里面提供的配置属性,(这里官方的文档是Destination,DestinationType, 而实际上activemq-ra.rar里面的ra.xml是destination,destinationType，注意大小写区别)</font></p>
            <font face="Arial">
            <p>二<font face="Arial">. <font face="Arial">配置jboss.xml<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial">大部分配置都是在jboss.xml里面.<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial">1.使用JBossMQ 和使用ActiveMQ RA配置Message Driven Bean的区别<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.) 使用JBossMQ&nbsp;的配置</font></font></font></font><font face="Arial"><br />
            </font><br />
            </p>
            <font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">
            <div class="code_title">xml 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">message-driven</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ejb-name</span><span class="tag">&gt;</span><span>OrderMessage</span><span class="tag"><span class="tag-name">ejb-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">destination-jndi-name</span><span class="tag">&gt;</span><span>queue/testQueue</span><span class="tag"><span class="tag-name">destination-jndi-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span class="tag"><span class="tag-name">message-driven</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
            </ol>
            </div>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.) 使用ActiveMQ RA的配置</p>
            <div class="code_title">xml 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">message-driven</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ejb-name</span><span class="tag">&gt;</span><span>ActiveMQMDP</span><span class="tag"><span class="tag-name">ejb-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;使用了resource-adapter-name&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">resource-adapter-name</span><span class="tag">&gt;</span><span>activemq-ra.rar</span><span class="tag"><span class="tag-name">resource-adapter-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;这里的configuration-name&nbsp;需要和后面container-name&nbsp;的名字相同&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">configuration-name</span><span class="tag">&gt;</span><span>ActiveMQ&nbsp;Message&nbsp;Driven&nbsp;Bean</span><span class="tag"><span class="tag-name">configuration-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span class="tag"><span class="tag-name">message-driven</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
            </ol>
            </div>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.&nbsp;<font color="#ff0000">jboss.xml</font> 配置<font face="Arial">invoker&nbsp;proxy和container 支持ActiveMQ RA</font></p>
            <div class="code_title">xml 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">invoker-proxy-bindings</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">invoker-proxy-binding</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>activemq-message-driven-bean</span><span class="tag"><span class="tag-name">name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">invoker-mbean</span><span class="tag">&gt;</span><span>default</span><span class="tag"><span class="tag-name">invoker-mbean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">proxy-factory</span><span class="tag">&gt;</span><span>org.jboss.ejb.plugins.inflow.JBossMessageEndpointFactory</span><span class="tag"><span class="tag-name">proxy-factory</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">proxy-factory-config</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">endpoint-interceptors</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>org.jboss.proxy.ClientMethodInterceptor</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>org.jboss.ejb.plugins.inflow.MessageEndpointInterceptor</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>org.jboss.proxy.TransactionInterceptor</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>org.jboss.invocation.InvokerInterceptor</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">endpoint-interceptors</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">proxy-factory-config</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">invoker-proxy-binding</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span class="tag"><span class="tag-name">invoker-proxy-bindings</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
            </ol>
            </div>
            <p><font face="Arial">MessageDrivenBean的container配置,这里的<container-name></container-name>必须和上面的<configuration-name></configuration-name>相同 才能起作用.</font></p>
            <p><font face="Arial"><br />
            </font>&nbsp;</p>
            <div class="code_title">xml 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">container-configurations</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">container-configuration</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">container-name</span><span class="tag">&gt;</span><span>ActiveMQ&nbsp;Message&nbsp;Driven&nbsp;Bean</span><span class="tag"><span class="tag-name">container-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">call-logging</span><span class="tag">&gt;</span><span>false</span><span class="tag"><span class="tag-name">call-logging</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">invoker-proxy-binding-name</span><span class="tag">&gt;</span><span>activemq-message-driven-bean</span><span class="tag"><span class="tag-name">invoker-proxy-binding-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">container-interceptors</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>org.jboss.ejb.plugins.LogInterceptor</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>org.jboss.ejb.plugins.RunAsSecurityInterceptor</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;CMT&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span>&nbsp;</span><span class="attribute">transaction</span><span>=</span><span class="attribute-value">"Container"</span><span class="tag">&gt;</span><span>org.jboss.ejb.plugins.TxInterceptorCMT</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span>&nbsp;</span><span class="attribute">transaction</span><span>=</span><span class="attribute-value">"Container"</span><span class="tag">&gt;</span><span>org.jboss.ejb.plugins.CallValidationInterceptor</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span>&nbsp;</span><span class="attribute">transaction</span><span>=</span><span class="attribute-value">"Container"</span><span>&nbsp;</span><span class="attribute">metricsEnabled</span><span>=</span><span class="attribute-value">"true"</span><span class="tag">&gt;</span><span>org.jboss.ejb.plugins.MetricsInterceptor</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span>&nbsp;</span><span class="attribute">transaction</span><span>=</span><span class="attribute-value">"Container"</span><span class="tag">&gt;</span><span>org.jboss.ejb.plugins.MessageDrivenInstanceInterceptor</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;BMT&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span>&nbsp;</span><span class="attribute">transaction</span><span>=</span><span class="attribute-value">"Bean"</span><span class="tag">&gt;</span><span>org.jboss.ejb.plugins.MessageDrivenInstanceInterceptor</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span>&nbsp;</span><span class="attribute">transaction</span><span>=</span><span class="attribute-value">"Bean"</span><span class="tag">&gt;</span><span>org.jboss.ejb.plugins.MessageDrivenTxInterceptorBMT</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span>&nbsp;</span><span class="attribute">transaction</span><span>=</span><span class="attribute-value">"Bean"</span><span class="tag">&gt;</span><span>org.jboss.ejb.plugins.CallValidationInterceptor</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span>&nbsp;</span><span class="attribute">transaction</span><span>=</span><span class="attribute-value">"Bean"</span><span>&nbsp;</span><span class="attribute">metricsEnabled</span><span>=</span><span class="attribute-value">"true"</span><span class="tag">&gt;</span><span>org.jboss.ejb.plugins.MetricsInterceptor</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</span><span class="tag"><span class="tag-name">interceptor</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">container-interceptors</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">instance-pool</span><span class="tag">&gt;</span><span>org.jboss.ejb.plugins.MessageDrivenInstancePool</span><span class="tag"><span class="tag-name">instance-pool</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">instance-cache</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">instance-cache</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">persistence-manager</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">persistence-manager</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">container-pool-conf</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">MaximumSize</span><span class="tag">&gt;</span><span>100</span><span class="tag"><span class="tag-name">MaximumSize</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">container-pool-conf</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">container-configuration</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span class="tag"><span class="tag-name">container-configurations</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
            </ol>
            </div>
            <p><font face="Arial">以上就是ActiveMQ+JBoss InBound 的配置</font></p>
            <p><font face="Arial">三.在Servlet中通过发送消息,验证上面的Message Driven Bean</font></p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial">为了验证这个MessageDrivenBean能够正常工作,我使用一个很简单的servlet向这个queue发送消息,前一篇的activemq-ds.xml 已经提供在启动的时候绑定了JNDI <span>activemq/QueueConnectionFactory,</span><span>activemq/queue/outbound,我们直接使用就行了,</span></font></p>
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initialContext&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;InitialContext(); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueConnectionFactory&nbsp;connectionFactory&nbsp;=&nbsp;(QueueConnectionFactory)&nbsp;initialContext &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.lookup(</span><span class="string">"java:activemq/QueueConnectionFactory"</span><span>); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con=connectionFactory.createConnection(); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;=&nbsp;&nbsp;con.createSession(</span><span class="keyword">false</span><span>,&nbsp;Session.AUTO_ACKNOWLEDGE); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue&nbsp;queue&nbsp;=&nbsp;(Queue)&nbsp;initialContext.lookup(</span><span class="string">"activemq/queue/outbound"</span><span>); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageProducer&nbsp;producer&nbsp;=&nbsp;session.createProducer(queue); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextMessage&nbsp;txtMessage&nbsp;=&nbsp;session.createTextMessage(); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtMessage.setText(</span><span class="string">"A"</span><span>); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;producer.send(txtMessage); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;producer.close(); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close(); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close(); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(NamingException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block </span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(JMSException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block </span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <p><font face="Arial">四.关于durable方式订阅topic的补充说明<br />
            </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font face="Arial">使用durable方式,你需要在<font color="#ff0000">ejb-jar.xml</font>中额外的配置,subscriptionDurability,clientId,subscriptionName</font></p>
            <font face="Arial">
            <div class="code_title">xml 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">activation-config</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...... &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property-name</span><span class="tag">&gt;</span><span>subscriptionDurability</span><span class="tag"><span class="tag-name">activation-config-property-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property-value</span><span class="tag">&gt;</span><span>Durable</span><span class="tag"><span class="tag-name">activation-config-property-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">activation-config-property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property-name</span><span class="tag">&gt;</span><span>clientId</span><span class="tag"><span class="tag-name">activation-config-property-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property-value</span><span class="tag">&gt;</span><span>foo</span><span class="tag"><span class="tag-name">activation-config-property-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">activation-config-property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property-name</span><span class="tag">&gt;</span><span>subscriptionName</span><span class="tag"><span class="tag-name">activation-config-property-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">activation-config-property-value</span><span class="tag">&gt;</span><span>bar</span><span class="tag"><span class="tag-name">activation-config-property-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">activation-config-property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...... &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">activation-config-property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span class="tag"><span class="tag-name">activation-config</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
            </ol>
            </div>
            <p>&nbsp;</p>
            <p>ok 这样就可以使用durable方式订阅topic了。</p>
            <p>参考文档:<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://activemq.apache.org/jboss-integration.html">JBoss <font face="Arial">Integration</font></a><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://activemq.apache.org/inbound-communication.html">ActiveMQ </a><font face="Arial"><a>Inbound Communication<br />
            </a>　&nbsp;&nbsp; <a href="http://activemq.apache.org/outbound-communication.html">ActiveMQ <font face="Arial">Outbound Communication</font></a></font><br />
            </p>
            </font><br />
            </font></font></font></font></font></font></font></font></td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/hk2000c/aggbug/161072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hk2000c/" target="_blank">hk2000c</a> 2007-11-16 17:10 <a href="http://www.blogjava.net/hk2000c/archive/2007/11/16/161072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ActiveMQ 实践之路(三) ActiveMQ 4.x +JBoss 4.x 整合篇 </title><link>http://www.blogjava.net/hk2000c/archive/2007/11/16/161071.html</link><dc:creator>hk2000c</dc:creator><author>hk2000c</author><pubDate>Fri, 16 Nov 2007 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/hk2000c/archive/2007/11/16/161071.html</guid><wfw:comment>http://www.blogjava.net/hk2000c/comments/161071.html</wfw:comment><comments>http://www.blogjava.net/hk2000c/archive/2007/11/16/161071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hk2000c/comments/commentRss/161071.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hk2000c/services/trackbacks/161071.html</trackback:ping><description><![CDATA[<div style="margin-top: 5px; margin-left: 15px"><strong>关键字:</strong> &nbsp; ActiveMQ&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div style="margin-top: 10px; margin-left: 15px; overflow: auto">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActiveMQ本身是开源项目,所以采用ActiveMQ的项目往往也是以其他开源软件共同构建,目前主流开源应用服务器有Boss,geronimo,JOnAs，而其中geronimo 默认的JMS Provider就是ActiveMQ，那我们就着重介绍ActiveMQ与JBoss,JOnAs的整合方案</p>
            <p>本文参考了 <a href="http://devzone.logicblaze.com/site/integrating-apache-activemq-with-jboss.html">Integrating Apache ActiveMQ with JBoss</a>与<a href="http://activemq.apache.org/jboss-integration.html">JBoss Integration</a>,再根据笔者实际整合经验总结而成。</p>
            <p>&nbsp;<font face="Arial">一.整合需要的环境.<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jdk1.5<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;jboss-4.0.5.GA<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; activemq-ra-4.1.0-incubator.rar&nbsp; (在ActiveMQ 4.*&nbsp; <font face="Arial">lib\optional 目录里面有对应的ra的压缩包</font>)<br />
            　　　开始整合前请确保jboss能够正确的启动起来。</font> </p>
            <div><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial">二.整合步骤<br />
            <br />
            </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial">1. 步骤一: 解压activemq-rar-4.1.0-incubator.rar 到 jboss-4.0.5.GA\server\default\deploy\<font color="#ff0000">activemq-ra.rar</font> (这个是目录名字) 下面是activemq-rar.rar目录下面的文件和子目录,请注意红色标记的地方(后面会逐一说明,整合的过程)<br />
            </font><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial">activeio-core-3.0.0-incubator.jar<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; activemq-core-4.1.0-incubator.jar<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; activemq-ra-4.1.0-incubator.jar<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; backport-util-concurrent-2.1.jar<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commons-logging-1.0.3.jar<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; derby-10.1.1.0.jar<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; geronimo-j2ee-management_1.0_spec-1.0.jar<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">spring-2.0.jar<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spring-1.2.6.jar <br />
            </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">xbean-spring-2.7.jar<br />
            </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">broker-config.xml</font><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; META-INF&nbsp;<br />
            &nbsp;<font face="Arial">2.步骤二. 删除多余的<font color="#ff0000">spring-1.2.6.jar</font>,由于4.1.0的ra里面包含了2个不同版本的spring会触发一个exception的产生,https://issues.apache.org/activemq/browse/AMQ-1124, 而且为了以后能够使用新的spring schema配置方式,我们这里会删除<font color="#ff0000">spring-1.2.6.jar</font>,保留<font color="#ff0000">spring-2.0.jar</font>。(最新的snapshot version的ra已经去掉了这个多余的<font color="#ff0000">spring-1.2.6.jar</font>).</font>
            <p><font face="Arial"><font face="Arial">&nbsp;&nbsp;<font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.步骤三: 修改META-INF\ra.xml,让JBoss使用broker-config.xml 作为默认的配置文件配置borker. 修改下面的地方<br />
            </font></font></font></p>
            <div class="code_title"></div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">config-property-value</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">config-property-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span> </span>
                <li class=""><span class="comments">&lt;!--&nbsp; &lt;config-property-value&gt;xbean:broker-config.xml&lt;/config-property-value&gt;--&gt;</span><span>&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <p>&nbsp;　　　　&nbsp;改为:<br />
            </p>
            <div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="comments">&lt;!-- &lt;config-property-value&gt;&lt;/config-property-value&gt;&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span class="tag">&lt;</span><span class="tag-name">config-property-value</span><span class="tag">&gt;</span><span>xbean:broker-config.xml</span><span class="tag"><span class="tag-name">config-property-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
            </ol>
            </div>
            <br />
            　　　　表示使用broker-config.xml来配置启动ActiveMQ.</div>
            <div>&nbsp;</div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.步骤四: 修改borker-config.xml,默认的borker-config.xml会产生一个错误,无论是我使用的版本还是最后的snapshot版本,默认的borker-config.xml都会让xbean-spring 2.7(snapshot 使用的是2.8)抛出exception.解决的办法如下</div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">beans</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://activemq.org/config/1.0"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">broker</span><span>&nbsp;</span><span class="attribute">useJmx</span><span>=</span><span class="attribute-value">"true"</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            </div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp; 改为</div>
            <div>
            <div class="code_title">&nbsp;</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">beans</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span class="tag">&lt;</span><span class="tag-name">broker</span><span>&nbsp;</span><span class="attribute">useJmx</span><span>=</span><span class="attribute-value">"true"</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://activemq.org/config/1.0"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            </div>
            <div>&nbsp;</div>
            <div>&nbsp;&nbsp; 即可</div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.步骤五: 将xbean-spring-2.7.jar (或者是2.8) 复制到jboss-4.0.5.GA\server\default\lib下面</div>
            <div>&nbsp;</div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三 使用整合完毕的ActiveMQ作为ds绑定到JBoss的JNDI服务。</div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;编写jboss-4.0.5.GA\server\default\depoly\activemq-ds.xml
            <div class="code_title">xml 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span>&lt;!DOCTYPE&nbsp;connection-factories &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;PUBLIC&nbsp;"-//JBoss//DTD&nbsp;JBOSS&nbsp;JCA&nbsp;Config&nbsp;1.5//EN" &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;"http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;</span>
                <li class=""><span class="tag">&lt;</span><span class="tag-name">connection-factories</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">tx-connection-factory</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">jndi-name</span><span class="tag">&gt;</span><span>activemq/QueueConnectionFactory</span><span class="tag">&lt;/</span><span class="tag-name">jndi-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xa-transaction</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">track-connection-by-tx</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">rar-name</span><span class="tag">&gt;</span><span>activemq-ra.rar</span><span class="tag">&lt;/</span><span class="tag-name">rar-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">connection-definition</span><span class="tag">&gt;</span><span>javax.jms.QueueConnectionFactory</span><span class="tag">&lt;/</span><span class="tag-name">connection-definition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ServerUrl</span><span class="tag">&gt;</span><span>tcp://localhost:61616</span><span class="tag">&lt;/</span><span class="tag-name">ServerUrl</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">min-pool-size</span><span class="tag">&gt;</span><span>1</span><span class="tag">&lt;/</span><span class="tag-name">min-pool-size</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">max-pool-size</span><span class="tag">&gt;</span><span>200</span><span class="tag">&lt;/</span><span class="tag-name">max-pool-size</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">blocking-timeout-millis</span><span class="tag">&gt;</span><span>30000</span><span class="tag">&lt;/</span><span class="tag-name">blocking-timeout-millis</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">idle-timeout-minutes</span><span class="tag">&gt;</span><span>3</span><span class="tag">&lt;/</span><span class="tag-name">idle-timeout-minutes</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">tx-connection-factory</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">tx-connection-factory</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">jndi-name</span><span class="tag">&gt;</span><span>activemq/TopicConnectionFactory</span><span class="tag">&lt;/</span><span class="tag-name">jndi-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xa-transaction</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">track-connection-by-tx</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">rar-name</span><span class="tag">&gt;</span><span>activemq-ra.rar</span><span class="tag">&lt;/</span><span class="tag-name">rar-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">connection-definition</span><span class="tag">&gt;</span><span>javax.jms.TopicConnectionFactory</span><span class="tag">&lt;/</span><span class="tag-name">connection-definition</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ServerUrl</span><span class="tag">&gt;</span><span>tcp://localhost:61616</span><span class="tag">&lt;/</span><span class="tag-name">ServerUrl</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">min-pool-size</span><span class="tag">&gt;</span><span>1</span><span class="tag">&lt;/</span><span class="tag-name">min-pool-size</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">max-pool-size</span><span class="tag">&gt;</span><span>200</span><span class="tag">&lt;/</span><span class="tag-name">max-pool-size</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">blocking-timeout-millis</span><span class="tag">&gt;</span><span>30000</span><span class="tag">&lt;/</span><span class="tag-name">blocking-timeout-millis</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">idle-timeout-minutes</span><span class="tag">&gt;</span><span>3</span><span class="tag">&lt;/</span><span class="tag-name">idle-timeout-minutes</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">tx-connection-factory</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mbean</span><span>&nbsp;</span><span class="attribute">code</span><span>=</span><span class="attribute-value">"org.jboss.resource.deployment.AdminObject"</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"activemq.queue:name=outboundQueue"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"JNDIName"</span><span class="tag">&gt;</span><span>activemq/queue/outbound</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">depends</span><span>&nbsp;</span><span class="attribute">optional-attribute-name</span><span>=</span><span class="attribute-value">"RARName"</span><span class="tag">&gt;</span><span class="attribute">jboss.jca:service</span><span>=</span><span class="attribute-value">RARDeployment</span><span>,</span><span class="attribute">name</span><span>=&amp;apos;activemq-ra.rar&amp;apos;</span><span class="tag">&lt;/</span><span class="tag-name">depends</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"Type"</span><span class="tag">&gt;</span><span>javax.jms.Queue</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"Properties"</span><span class="tag">&gt;</span><span class="attribute">PhysicalName</span><span>=</span><span class="attribute-value">queue</span><span>.outbound</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">mbean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mbean</span><span>&nbsp;</span><span class="attribute">code</span><span>=</span><span class="attribute-value">"org.jboss.resource.deployment.AdminObject"</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"activemq.topic:name=inboundTopic"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"JNDIName"</span><span class="tag">&gt;</span><span>activemq/topic/inbound</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">depends</span><span>&nbsp;</span><span class="attribute">optional-attribute-name</span><span>=</span><span class="attribute-value">"RARName"</span><span class="tag">&gt;</span><span class="attribute">jboss.jca:service</span><span>=</span><span class="attribute-value">RARDeployment</span><span>,</span><span class="attribute">name</span><span>=&amp;apos;activemq-ra.rar&amp;apos;</span><span class="tag">&lt;/</span><span class="tag-name">depends</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"Type"</span><span class="tag">&gt;</span><span>javax.jms.Topic</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"Properties"</span><span class="tag">&gt;</span><span class="attribute">PhysicalName</span><span>=</span><span class="attribute-value">topic</span><span>.inbound</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">mbean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;</span>
                <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">connection-factories</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            </div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启动JBoss.如果看见以下信息就表示ActiveMQ已经成功启动,并且使用上面的ds配置文件成功地将topic/queue绑定到了JNDI服务上。</div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......</div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial">[TransportConnector] Connector tcp://localhost:61616 Started<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [NetworkConnector] Network Connector bridge Started<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [BrokerService] ActiveMQ JMS Message Broker (localhost, ID:MyNoteBook-2165-1173250880171-1:0) started</font></div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......</div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial">[ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=ConnectionFactoryBinding,name=activemq/QueueConnectionFactory' to JNDI name 'java:activemq/QueueConnectionFactory'<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=ConnectionFactoryBinding,name=activemq/TopicConnectionFactory' to JNDI name 'java:activemq/TopicConnectionFactory'<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [AdminObject] Bound admin object 'org.apache.activemq.command.ActiveMQQueue' at 'activemq/queue/outbound'<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [AdminObject] Bound admin object 'org.apache.activemq.command.ActiveMQTopic' at 'activemq/topic/inbound</font></div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......</div>
            <div></div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;四.验证ActiveMQ+JBoss</div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里你可以使用简单的jms&nbsp; client连接到broker-config.xml里面的协议连接器上面,默认的是tcp://localhost:61616</div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在后面我们会在此整合基础上开发Message Driver Bean和使用spring&nbsp;MDP 2种构架&nbsp;来验证本次ActiveMQ+JBoss的整合。</div>
            </font></font></div>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/hk2000c/aggbug/161071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hk2000c/" target="_blank">hk2000c</a> 2007-11-16 17:06 <a href="http://www.blogjava.net/hk2000c/archive/2007/11/16/161071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ActiveMQ 实践之路(二) 使用Queue或者Topic发送/接受消息 </title><link>http://www.blogjava.net/hk2000c/archive/2007/11/16/161069.html</link><dc:creator>hk2000c</dc:creator><author>hk2000c</author><pubDate>Fri, 16 Nov 2007 09:05:00 GMT</pubDate><guid>http://www.blogjava.net/hk2000c/archive/2007/11/16/161069.html</guid><wfw:comment>http://www.blogjava.net/hk2000c/comments/161069.html</wfw:comment><comments>http://www.blogjava.net/hk2000c/archive/2007/11/16/161069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hk2000c/comments/commentRss/161069.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hk2000c/services/trackbacks/161069.html</trackback:ping><description><![CDATA[<table width="100%">
    <tbody>
        <tr>
            <td>
            <p><font face="Arial">本篇主要讲解在未使用其他框架(Spring)整合情况下,独立基于ActiveMQ,使用JMS规范进行消息通信。<br />
            &nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; 一.JMS回顾<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为ActiveMQ是一个JMS Provider的实现,因此在开始实作前,有必要复习下JMS的基础知识<br />
            &nbsp;&nbsp;&nbsp; Java Message Service (JMS)是sun提出来的为J2EE提供企业消息处理的一套规范,JMS目前有2套规范还在使用JMS 1.0.2b和1.1. 1.1已经成为主流的JMS Provider事实上的标准了.<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *1.1主要在session上面有一些重要改变,比如支持建立同一session上的transaction,让他支持同时发送P2P(Queue)消息和接受<br />
            Topic消息。<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在JMS中间主要定义了2种消息模式Point-to-Point (点对点),Publich/Subscribe Model (发布/订阅者)，<br />
            &nbsp;&nbsp;&nbsp; 其中在Publich/Subscribe 模式下又有Nondurable subscription和durable subscription (持久化订阅)2种消息处理方式。<br />
            &nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; 下面是JMS规范基本的接口和实现<br />
            &nbsp;&nbsp;&nbsp;&nbsp; JMS Common Interfacse PTP-Specific Interface&nbsp;&nbsp; Pub/Sub-specific interfaces<br />
            &nbsp;&nbsp;&nbsp;&nbsp; ConnectionFactory&nbsp;&nbsp;&nbsp;&nbsp; QueueConnectionFactory&nbsp;&nbsp; TopicConnectionFactory<br />
            &nbsp;&nbsp;&nbsp;&nbsp; Connection&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueueConnection&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TopicConnection<br />
            &nbsp;&nbsp;&nbsp;&nbsp; Destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Queue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Topic<br />
            &nbsp;&nbsp;&nbsp;&nbsp; Session&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueueSession&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TopiSession<br />
            &nbsp;&nbsp;&nbsp;&nbsp; MessageProducer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueueSender&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TopicPublisher<br />
            &nbsp;&nbsp;&nbsp;&nbsp; MessageConsumer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueueReceiver/QueueBrwer TopicSubscriber</font></p>
            <font face="Arial">
            <p><br />
            &nbsp;&nbsp;&nbsp;&nbsp; 二.使用Queue </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面以ActiveMQ example的代码为主进行说明<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 使用ActiveMQ的Connection，ConnectionFactory 建立连接,注意这里没有用到pool<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.apache.activemq.ActiveMQConnection &nbsp;&nbsp;</span></span>
                <li class=""><span class="keyword">import</span><span>&nbsp;org.apache.activemq.ActiveMQConnectionFactory &nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //建立Connection<br />
            </p>
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="keyword">protected</span><span>&nbsp;Connection&nbsp;createConnection()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;JMSException,&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActiveMQConnectionFactory&nbsp;connectionFactory&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ActiveMQConnectionFactory(user,&nbsp;pwd,&nbsp;url); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;connection&nbsp;=&nbsp;connectionFactory.createConnection(); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(durable&nbsp;&amp;&amp;&nbsp;clientID!=</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.setClientID(clientID); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.start(); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;connection; &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //建立Session<br />
            &nbsp;&nbsp;</p>
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="keyword">protected</span><span>&nbsp;Session&nbsp;createSession(Connection&nbsp;connection)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;=&nbsp;connection.createSession(transacted,&nbsp;ackMode); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;session; &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2。发送消息的代码<br />
            &nbsp;//建立QueueSession<br />
            &nbsp;</p>
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="keyword">protected</span><span>&nbsp;MessageProducer&nbsp;createProducer(Session&nbsp;session)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;JMSException&nbsp;{ &nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Destincation&nbsp;destination&nbsp;=&nbsp;session.createQueue(</span><span class="string">"queue.hello"</span><span>); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageProducer&nbsp;producer&nbsp;=&nbsp;session.createProducer(destination); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;timeToLive!=</span><span class="number">0</span><span>&nbsp;) &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;producer.setTimeToLive(timeToLive); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;producer; &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使用Producer发送消息到Queue<br />
            &nbsp;&nbsp;&nbsp;&nbsp; </p>
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <ol class="dp-j">
                <li class="alt"><span><span>producer.send(message); &nbsp;&nbsp;</span></span> </li>
            </ol>
            </div>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3。接受消息,在JMS规范里面,你可以使用<br />
            &nbsp;&nbsp; </p>
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span>QueueReceiver/QueueBrowser直接接受消息,但是更多的情况下我们采用消息通知方式,即实现MessageListener接口 &nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;onMessage(Message&nbsp;message)&nbsp;{ &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;</span><span class="comment">//process&nbsp;message </span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;} &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;</span><span class="comment">//set&nbsp;MessageListner&nbsp;,receive&nbsp;message </span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;Destincation&nbsp;destination&nbsp;=&nbsp;session.createQueue(</span><span class="string">"queue.hello"</span><span>); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;consumer&nbsp;=&nbsp;session.createConsumer(destination); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;consumer.setMessageListener(</span><span class="keyword">this</span><span>); &nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上就是使用jms queue发送接受消息的基本方式</p>
            <p>&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; 三 Topic</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 建立连接<br />
            &nbsp;&nbsp;&nbsp;</p>
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="keyword">protected</span><span>&nbsp;Connection&nbsp;createConnection()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;JMSException,&nbsp;Exception&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActiveMQConnectionFactory&nbsp;connectionFactory&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ActiveMQConnectionFactory(user,&nbsp;pwd,&nbsp;url);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;connection&nbsp;=&nbsp;connectionFactory.createConnection();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//如果你要使用DurableSubScription&nbsp;方式,你必须为connection设置一个ClientID&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(durable&nbsp;&amp;&amp;&nbsp;clientID!=</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.setClientID(clientID);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.start();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;connection;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 建立Session<br />
            </p>
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="keyword">protected</span><span>&nbsp;Session&nbsp;createSession(Connection&nbsp;connection)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;=&nbsp;connection.createSession(transacted,&nbsp;ackMode);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;session;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <p>&nbsp;3.创建Producer 发送消息到Topic&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="comment">//create&nbsp;topic&nbsp;on&nbsp;&nbsp;session </span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;topic&nbsp;=&nbsp;session.createTopic(</span><span class="string">"topic.hello"</span><span>); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;producer&nbsp;=&nbsp;session.createProducer(topic); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//send&nbsp;message&nbsp; </span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;producer.send(message); &nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <p><br />
            &nbsp;4.创建Consumer接受消息(基本上和Queue相同)</p>
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span>Destincation&nbsp;destination&nbsp;&nbsp;=&nbsp;session.createTopic(</span><span class="string">"topic.hello"</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span>
                <li class=""><span>MessageConsumer&nbsp;consumer&nbsp;=&nbsp;session.createConsumer(destination);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class="alt"><span>consumer.setMessageListener(</span><span class="keyword">this</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//如果你使用的是Durable&nbsp;Subscription方式,你必须在建立connection的时候&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置ClientID,而且建立comsumer的时候使用createDurableSubscriber方法,为他指定一个consumerName。&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;</span><span class="comment">//connection.setClientID(clientId);&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;</span><span class="comment">//consumer&nbsp;=&nbsp;session.createDurableSubscriber((Topic)&nbsp;destination,&nbsp;consumerName);&nbsp;</span><span>&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            &nbsp;四:连接ActiveMQ的方式<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActiveMQConnectionFactory 提供了多种连接到Broker的方式<a title="ActiveMQ连接协议" href="http://activemq.apache.org/uri-protocols.html">activemq.apache.org/uri-protocols.html</a></p>
            <p>&nbsp;常见的有<br />
            &nbsp;vm://host:port&nbsp;&nbsp;&nbsp;&nbsp; //vm <br />
            &nbsp;tcp://host:port&nbsp;&nbsp;&nbsp; //tcp<br />
            &nbsp;ssl://host:port&nbsp;&nbsp;&nbsp; //SSL<br />
            &nbsp;stomp://host:port&nbsp; //stomp协议可以跨语言,目前有很多种stomp client 库(java,c#,c/c++,ruby,python...);</p>
            </font></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/hk2000c/aggbug/161069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hk2000c/" target="_blank">hk2000c</a> 2007-11-16 17:05 <a href="http://www.blogjava.net/hk2000c/archive/2007/11/16/161069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ActiveMQ 实践之路(一) 启动你的ActiveMQ </title><link>http://www.blogjava.net/hk2000c/archive/2007/11/16/161070.html</link><dc:creator>hk2000c</dc:creator><author>hk2000c</author><pubDate>Fri, 16 Nov 2007 09:05:00 GMT</pubDate><guid>http://www.blogjava.net/hk2000c/archive/2007/11/16/161070.html</guid><wfw:comment>http://www.blogjava.net/hk2000c/comments/161070.html</wfw:comment><comments>http://www.blogjava.net/hk2000c/archive/2007/11/16/161070.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hk2000c/comments/commentRss/161070.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hk2000c/services/trackbacks/161070.html</trackback:ping><description><![CDATA[&nbsp; 作者 cctvx1<br />
&nbsp;&nbsp;&nbsp; 程度: 入门<font face="Arial">
<p><br />
&nbsp;&nbsp;&nbsp; 一.安装ActiveMQ</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先去http://activemq.apache.org/download.html 下载最新版本4.1.0release (http://activemq.apache.org/activemq-410-release.html),<br />
&nbsp;&nbsp;&nbsp; 解压apache-activemq-4.1-incubator.zip(或者apache-activemq-4.1-incubator.tar.gz)目录如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +bin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (windows下面的bat和unix/linux下面的sh)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +conf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (activeMQ配置目录,包含最基本的activeMQ配置文件)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (默认是空的)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +docs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (index,replease版本里面没有文档,-.-b不知道为啥不带)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +example&nbsp;&nbsp; (几个例子<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +lib&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (activemMQ使用到的lib)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -apache-activemq-4.1-incubator.jar&nbsp; (ActiveMQ的binary)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -LICENSE.txt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -NOTICE.txt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -README.txt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -user-guide.html</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你可以使用bin\activemq.bat(activemq) 启动,如果一切顺利,你就会看见类似下面的信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (细节可能不一样,比如路径,或者jmx,jdbc信息)</p>
<p>&nbsp; ACTIVEMQ_HOME: D:\java\framework_and_lib\activemq\apache-activemq-4.1-incubator\<br />
bin\..<br />
Loading message broker from: xbean:activemq.xml<br />
INFO&nbsp; BrokerService&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - ActiveMQ null JMS Message Broker (localho<br />
st) is starting<br />
INFO&nbsp; BrokerService&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - For help or more information please see:<br />
http://incubator.apache.org/activemq/<br />
INFO&nbsp; ManagementContext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - JMX consoles can connect to service:jmx:r<br />
mi:///jndi/rmi://localhost:1099/jmxrmi<br />
INFO&nbsp; JDBCPersistenceAdapter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Database driver recognized: [apache_derby<br />
_embedded_jdbc_driver]<br />
INFO&nbsp; DefaultDatabaseLocker&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Attempting to acquire the exclusive lock<br />
to become the Master broker<br />
INFO&nbsp; DefaultDatabaseLocker&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Becoming the master on dataSource: org.ap<br />
ache.derby.jdbc.EmbeddedDataSource@1d840cd<br />
INFO&nbsp; JournalPersistenceAdapter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Journal Recovery Started from: Active Jou<br />
rnal: using 5 x 20.0 Megs at: D:\java\framework_and_lib\activemq\apache-activemq<br />
-4.1-incubator\activemq-data\journal<br />
INFO&nbsp; JournalPersistenceAdapter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Journal Recovered: 0 message(s) in transa<br />
ctions recovered.<br />
INFO&nbsp; TransportServerThreadSupport&nbsp;&nbsp; - Listening for connections at: tcp://P-SUW<br />
EI:61616<br />
WARN&nbsp; MulticastDiscoveryAgent&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - brokerName not set<br />
INFO&nbsp; TransportConnector&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Connector default Started<br />
INFO&nbsp; TransportServerThreadSupport&nbsp;&nbsp; - Listening for connections at: stomp://P-S<br />
UWEI:61613<br />
INFO&nbsp; TransportConnector&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Connector stomp Started<br />
INFO&nbsp; NetworkConnector&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Network Connector default Started<br />
INFO&nbsp; BrokerService&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - ActiveMQ JMS Message Broker (localhost, I<br />
D:P-SUWEI-1207-1170916242296-1:0) started&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *。几个小提示<br />
&nbsp; 1. 这个仅仅是最基础的ActiveMQ的配置,很多地方都没有配置因此不要直接使用这个配置用于生产系统<br />
&nbsp; 2. 有的时候由于端口被占用,导致ActiveMQ错误,ActiveMQ可能需要以下端口1099(JMX),61616(默认的TransportConnector)<br />
&nbsp; 3. 如果没有物理网卡,或者MS的LoopBackAdpater Multicast会报一个错误</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 二. 测试你的ActiveMQ<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于ActiveMQ是一个独立的jms provider,所以我们不需要其他任何第三方服务器就可以马上做我们的测试了.编译<br />
&nbsp;&nbsp;&nbsp;&nbsp; example目录下面的程序<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; ProducerTool/ConsumerTool 是JMS参考里面提到的典型应用,Producer产生消息,Consumer消费消息<br />
&nbsp;&nbsp; 而且这个例子还可以加入参数帮助你测试刚才启动的本地ActiveMQ或者是远程的ActiveMQ</p>
<p>&nbsp;&nbsp; ProducerTool [url] broker的地址,默认的是tcp://localhost:61616 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [true|flase] 是否使用topic,默认是false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [subject] subject的名字,默认是TOOL.DEFAULT<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [durabl] 是否持久化消息,默认是false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [messagecount] 发送消息数量,默认是10<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [messagesize] 消息长度,默认是255<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [clientID] durable为true的时候,需要配置clientID<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [timeToLive] 消息存活时间 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [sleepTime] 发送消息中间的休眠时间<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [transacte]&nbsp; 是否采用事务</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConsumerTool [url] broker的地址,默认的是tcp://localhost:61616 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [true|flase] 是否使用topic,默认是false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [subject] subject的名字,默认是TOOL.DEFAULT<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [durabl] 是否持久化消息,默认是false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [maxiumMessages] 接受最大消息数量,0表示不限制<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [clientID] durable为true的时候,需要配置clientID<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [transacte]&nbsp; 是否采用事务<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [sleepTime]&nbsp; 接受消息中间的休眠时间,默认是0,onMeesage方法不休眠<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [receiveTimeOut] 接受超时</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们这样可以使用:<br />
&nbsp;&nbsp; java -classpath .\apache-activemq-4.1-incubator.jar;example\bin ProducerTool&nbsp; tcp://192.168.3.142:61616 test.mysubject<br />
&nbsp;&nbsp; java -classpath .\apache-activemq-4.1-incubator.jar;example\bin ConsumerTool&nbsp; tcp://192.168.3.142:61616 test.mysubject</p>
<p>&nbsp;&nbsp; 当然你可以使用上面的参数进行更复杂的测试,持久,事务</p>
<p>&nbsp;&nbsp; 如果出现下面的信息,恭喜你,你的ActiveMQ已经能够工作了<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; Connecting to URL: tcp://192.168.3.142:61616<br />
&nbsp; Publishing a Message with size 255 to queue: TOOL.DEFAULT<br />
&nbsp; Using non-durable publishing<br />
&nbsp; Sleeping between publish 0 ms<br />
&nbsp; Sending message: Message: 0 sent at: Thu Feb 08 15:05:34 CST 2007&nbsp; ...<br />
&nbsp; Sending message: Message: 1 sent at: Thu Feb 08 15:05:34 CST 2007&nbsp; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。。。。。。。。</p>
<p><br />
&nbsp; Connecting to URL: tcp://192.168.3.142:61616<br />
&nbsp; Consuming queue: test.mysubject<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Using non-durable subscription<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Received: Message: 0 sent at: Thu Feb 08 14:51:34 CST 2007&nbsp; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Received: Message: 1 sent at: Thu Feb 08 14:51:34 CST 2007&nbsp; ...<br />
&nbsp; 。。。。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三.小结<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们已经下载,启动,并且用程序测试了我们的ActiveMQ,而后面将在这个能跑得ActiveMQ进一步的走下去,一步一步展示ActiveMQ的高级特性。</p>
</font>
<img src ="http://www.blogjava.net/hk2000c/aggbug/161070.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hk2000c/" target="_blank">hk2000c</a> 2007-11-16 17:05 <a href="http://www.blogjava.net/hk2000c/archive/2007/11/16/161070.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Spring中配置JMS</title><link>http://www.blogjava.net/hk2000c/archive/2007/11/16/161064.html</link><dc:creator>hk2000c</dc:creator><author>hk2000c</author><pubDate>Fri, 16 Nov 2007 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/hk2000c/archive/2007/11/16/161064.html</guid><wfw:comment>http://www.blogjava.net/hk2000c/comments/161064.html</wfw:comment><comments>http://www.blogjava.net/hk2000c/archive/2007/11/16/161064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hk2000c/comments/commentRss/161064.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hk2000c/services/trackbacks/161064.html</trackback:ping><description><![CDATA[<p>郁闷了三天，今天终于把JMS弄出来了，就是发送消息，然后消息监听器接收到了消息后发送邮件给管理员</p>
<p>先看web.xml里面关于activemq的invoke</p>
<p><font style="background-color: #cccccc">&lt;!--调用activemq --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;context-param &gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;brokerURI &lt;/param-name &gt; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;param-value&gt;/WEB-INF/activemq.xml &lt;/param-value &gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/context-param&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;listener&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;listener-class&gt;org.activemq.web.SpringBrokerContextListener&lt;/listener-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/listener&gt;</font></p>
<br />
<p>郁闷了三天，今天终于把JMS弄出来了，就是发送消息，然后消息监听器接收到了消息后发送邮件给管理员</p>
<p>先看web.xml里面关于activemq的invoke</p>
<p><font style="background-color: #cccccc">&lt;!--调用activemq --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;context-param &gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;brokerURI &lt;/param-name &gt; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;param-value&gt;/WEB-INF/activemq.xml &lt;/param-value &gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/context-param&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;listener&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;listener-class&gt;org.activemq.web.SpringBrokerContextListener&lt;/listener-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/listener&gt;</font></p>
<p><font style="background-color: #cccccc"></font></p>
<p><font style="background-color: #ffffff">然后是在上下文中定义的JmsTemplate和activemq监听</font></p>
<p><font style="background-color: #cccccc">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "</font><a href="http://www.springframework.org/dtd/spring-beans.dtd"><font style="background-color: #cccccc">http://www.springframework.org/dtd/spring-beans.dtd</font></a><font style="background-color: #cccccc">"&gt;<br />
&lt;beans&gt;</font></p>
<p><font style="background-color: #cccccc">&lt;!--JMS Template--&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="connectionFactory"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;bean class="org.activemq.ActiveMQConnectionFactory"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="brokerURL"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;value&gt;tcp://localhost:61616&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp; &lt;property name="defaultDestinationName" value="Hello.Queue"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</font></p>
<p><font style="background-color: #cccccc"></font></p>
<p><font style="background-color: #cccccc">&nbsp;&nbsp;&nbsp;&lt;bean id="activeMQContainer" class="org.activemq.jca.JCAContainer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="workManager"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="workManager" class="org.activemq.work.SpringWorkManager"/&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</font></p>
<p><font style="background-color: #cccccc">&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="resourceAdapter"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="activeMQResourceAdapter" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.activemq.ra.ActiveMQResourceAdapter"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="serverUrl" value="tcp://localhost:61616"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp; </font></p>
<p><font style="background-color: #cccccc">&nbsp;&nbsp;&lt;!--监听 Message 的Message Driven POJO--&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="HelloPlaceBean" class="com.officetao.jms.HelloMDP" autowire="byName"/&gt;</font></p>
<p><font style="background-color: #cccccc">&nbsp; &lt;bean id="HelloMDP" factory-method="addConnector" factory-bean="activeMQContainer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="activationSpec"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class="org.activemq.ra.ActiveMQActivationSpec"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="destination" value="Hello.Queue"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="destinationType" value="javax.jms.Queue"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="ref" value="HelloBean" /&gt; <br />
&nbsp;&nbsp; &lt;/bean&gt;</font></p>
<p><font style="background-color: #cccccc">&lt;/beans&gt;</font></p>
<p><font style="background-color: #cccccc"></font></p>
<p><font style="background-color: #ffffff">建立一个模拟的发送消息的bean，内容如下</font></p>
<p><font style="background-color: #cccccc">final String mailContent = "新增单号为0000的订单, 金额";<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (jmsTemplate != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmsTemplate.send(new MessageCreator() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Message createMessage(Session session)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws JMSException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message message = session.createMessage();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.setStringProperty("content", mailContent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.error("JMS error when place order:", e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font style="background-color: #cccccc"></font></p>
<p><font style="background-color: #ffffff">最后就是监听消息然后采取行动的bean</font></p>
<p><br />
<font style="background-color: #cccccc">public class HelloMDP implements MessageListener {</font></p>
<p><br />
<font style="background-color: #cccccc">&nbsp;<br />
&nbsp;public void onMessage(javax.jms.Message arg0) {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;try&nbsp;&nbsp; {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subAuthenticator&nbsp;&nbsp; subauth&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; subAuthenticator("邮箱登陆名","密码");//smtp验证&nbsp;&nbsp; authenticator&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.put("mail.smtp.host","smtp.163.com");&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.put("mail.smtp.auth","true");&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session&nbsp;&nbsp; =&nbsp;&nbsp; Session.getInstance(props,subauth);&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MimeMessage&nbsp;&nbsp; message&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; MimeMessage(session);&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.setRecipient(Message.RecipientType.TO,new&nbsp;&nbsp; InternetAddress("</font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#110;&#101;&#119;&#98;&#117;&#116;&#116;&#111;&#110;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;"><font style="background-color: #cccccc">接收邮件的邮箱</font></a><font style="background-color: #cccccc">"));&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.setFrom(new&nbsp;&nbsp; InternetAddress("</font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#110;&#101;&#119;&#98;&#117;&#116;&#116;&#111;&#110;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;"><font style="background-color: #cccccc">自己的邮箱</font></a><font style="background-color: #cccccc">"));&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.setSubject("ok");&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.setText("if you see it,it works!");&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transport.send(message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(AuthenticationFailedException&nbsp;&nbsp; e1){&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("SMTP认证出错！");&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch&nbsp;&nbsp; (MessagingException&nbsp;&nbsp; e)&nbsp;&nbsp; {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp;<br />
}</font></p>
<p><font style="background-color: #cccccc">public&nbsp;&nbsp; static&nbsp;&nbsp; Properties&nbsp;&nbsp; props&nbsp;&nbsp; =&nbsp;&nbsp; System.getProperties(); <br />
public&nbsp;&nbsp; static&nbsp;&nbsp; Session&nbsp;&nbsp; session&nbsp;&nbsp; =&nbsp;&nbsp; null;&nbsp;&nbsp; </font></p>
<p><font style="background-color: #cccccc">/**&nbsp;&nbsp; <br />
*此内部类定义了smtp认证方法&nbsp;&nbsp; <br />
*/&nbsp;&nbsp; <br />
public&nbsp;&nbsp; class&nbsp;&nbsp; subAuthenticator&nbsp;&nbsp; extends&nbsp;&nbsp; Authenticator{&nbsp;&nbsp; <br />
private&nbsp;&nbsp; String&nbsp;&nbsp; userName;&nbsp;&nbsp; <br />
private&nbsp;&nbsp; String&nbsp;&nbsp; password;&nbsp;&nbsp; <br />
public&nbsp;&nbsp; subAuthenticator(String&nbsp;&nbsp; user,String&nbsp;&nbsp; pass){&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; userName=user;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; password=pass;&nbsp;&nbsp; <br />
}&nbsp;&nbsp; <br />
public&nbsp;&nbsp; PasswordAuthentication&nbsp;&nbsp; getPasswordAuthentication(){&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; new&nbsp;&nbsp; PasswordAuthentication(userName,password);&nbsp;&nbsp; <br />
}&nbsp;&nbsp; <br />
</font></p>
<img src ="http://www.blogjava.net/hk2000c/aggbug/161064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hk2000c/" target="_blank">hk2000c</a> 2007-11-16 16:49 <a href="http://www.blogjava.net/hk2000c/archive/2007/11/16/161064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat下应用JMS </title><link>http://www.blogjava.net/hk2000c/archive/2007/11/16/161062.html</link><dc:creator>hk2000c</dc:creator><author>hk2000c</author><pubDate>Fri, 16 Nov 2007 08:48:00 GMT</pubDate><guid>http://www.blogjava.net/hk2000c/archive/2007/11/16/161062.html</guid><wfw:comment>http://www.blogjava.net/hk2000c/comments/161062.html</wfw:comment><comments>http://www.blogjava.net/hk2000c/archive/2007/11/16/161062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hk2000c/comments/commentRss/161062.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hk2000c/services/trackbacks/161062.html</trackback:ping><description><![CDATA[<div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/javajohn/archive/2005/12/08/23016.html">&nbsp;JMS做为J2EE的高级部分一直蒙着一层神秘的面纱，作为JMS的定制者SUN只规定了JMS规范，象很多其他SUN产品一样被多家厂商提供了具体的实现。但是作为tomcat和RESIN（今年初宣布全部支持J2EE规范）。这些面向低端但却被广泛应用的服务器本身并不对JMS提供支持。庆幸的是openjms和activeMQ两家开源软件提供了插件式的支持。 <br />
<br />
&nbsp;&nbsp;&nbsp; 在应用了一些开发框架如spring的项目里如果要使用到JMS，虽然SPRING提供了部分对JMS的支持但经过我一段时间的应用发现，OO的封装在某些地方反而成为开发过程中的障碍。在实现诸如监听之类的代码段里使人非常的懊恼，即使用callback(回调)有些东西仍然不能够很好的被取到。 <br />
<br />
下面就一些TOMCAT上面JMS的支持既实现做一下整理。 <br />
<br />
1.很自然的你需要下载JMS实现,如:opnerJMS或者activeMQ .下载地址www.jmsopen.com 或www.activeMQ.com <br />
<br />
2.服务器下载以后的具体配置在以上两个网站上都有很详细的说明，就不再列举了。 <br />
<br />
3.和WEB服务器的整合，首先要配置应用的web.xml这个文件配置如下： <br />
<br />
<center><ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
            <pre><ccid_code>1  &lt;context-param&gt;
            2  &lt;param-name&gt;brokerURI&lt;/param-name&gt;
            3  &lt;param-value&gt;/WEB-INF/activemq.xml&lt;/param-value&gt;
            4  &lt;/context-param&gt;
            5
            6  &lt;listener&gt;
            7  &lt;listener-class&gt;org.activemq.web.SpringBrokerContextListener&lt;/listener-class&gt;
            8  &lt;/listener&gt;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center><br />
<br />
将这一段代码放到web.xml里。注意到activemq.xml文件，是jms服务器的具体配置： <br />
<br />
<center><ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
            <pre><ccid_code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
            &lt;!DOCTYPE beans PUBLIC
            "-//ACTIVEMQ//DTD//EN"
            "http://activemq.org/dtd/activemq.dtd"&gt;
            &lt;beans&gt;
            &lt;!-- ===================== --&gt;
            &lt;!-- ActiveMQ Broker Configuration --&gt;
            &lt;!-- ===================== --&gt;
            &lt;broker&gt;
            &lt;connector&gt;
            &lt;tcpServerTransport
            uri="tcp://localhost:61616"
            useAsyncSend="true"
            maxOutstandingMessages="50"/&gt;
            &lt;/connector&gt;
            &lt;!-- to enable Stomp support uncomment this
            &lt;connector&gt;
            &lt;serverTransport
            uri="stomp://localhost:61626"/&gt;
            &lt;/connector&gt;
            --&gt;
            &lt;persistence&gt;
            &lt;jdbcPersistence
            dataSourceRef="oracle-ds"/&gt;
            &lt;/persistence&gt;
            &lt;/broker&gt;
            &lt;!-- ======================= --&gt;
            &lt;!-- JDBC DataSource Configurations --&gt;
            &lt;!-- ======================= --&gt;
            &lt;!-- The Derby Datasource
            that will be used by the Broker --&gt;
            &lt;bean id="derby-ds" class=
            "org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close"&gt;
            &lt;property name="driverClassName"&gt;
            &lt;value&gt;
            org.apache.derby.jdbc.EmbeddedDriver
            &lt;/value&gt;
            &lt;/property&gt;
            &lt;property name="url"&gt;
            &lt;!-- Use a URL like
            'jdbc:hsqldb:hsql://localhost:9001'
            if you want to connect to a remote hsqldb --&gt;
            &lt;value&gt;
            jdbc:derby:derbydb;create=true
            &lt;/value&gt;
            &lt;/property&gt;
            &lt;property name="username"&gt;
            &lt;value&gt;&lt;/value&gt;
            &lt;/property&gt;
            &lt;property name="password"&gt;
            &lt;value&gt;&lt;/value&gt;
            &lt;/property&gt;
            &lt;property name="poolPreparedStatements"&gt;
            &lt;value&gt;true&lt;/value&gt;
            &lt;/property&gt;
            &lt;/bean&gt;
            &lt;/beans&gt;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center><br />
<br />
此时，在启动你的TOMCAT的时候会看到JMS服务器已经绑到了上面。</a></div>
<img src ="http://www.blogjava.net/hk2000c/aggbug/161062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hk2000c/" target="_blank">hk2000c</a> 2007-11-16 16:48 <a href="http://www.blogjava.net/hk2000c/archive/2007/11/16/161062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>