此文檔以SpringSide 發布的為準 http://wiki.springside.org.cn/display/springside/ActiveMQ+Spring+Jencks
ActiveMQ4.1 +Spring2.0的POJO JMS方案(Jencks 版)
???? 作者:cctvx1
???? 此文檔僅適用于說明使用 Jecncks 和 使用Spring 2.0(DefaultMessageListenerContainer)? 充當MDP Container之間的區別,同時
演示Jecnks 的Spring 2.0 新配置實例。
????
1.引入ActiveMQ ResourceAdapter 和Jencks 的XSD
? 在ApplicationContext.xml(Spring的配置文件)中引入ActiveMQ ResourceAdapter 和Jencks 的XML Scheam 配置文件),如下:
?? ActiveMQ4.1 響應Spring 2.0號召,支持了引入XML Schema namespace的簡單配置語法,簡化了配置的語句。?
? 在ApplicationContext.xml(Spring的配置文件)中引入ActiveMQ的XML Scheam 配置文件),如下:
<
beans
??
xmlns
="http://www.springframework.org/schema/beans"
???xmlns:amq
="http://activemq.org/config/1.0"
???xmlns:ampra
="http://activemq.org/ra/1.0"
???xmlns:jencks
="http://jencks.org/1.3"
???xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
??xsi:schemaLocation
="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans.xsd
??http://activemq.org/config/1.0?http://people.apache.org/repository/org.apache.activemq/xsds/activemq-core-4.1-incubator-SNAPSHOT.xsd
??http://activemq.org/ra/1.0?http://people.apache.org/repository/org.apache.activemq/xsds/activemq-ra-4.1-incubator-SNAPSHOT.xsd
??http://jencks.org/1.3?http://repository.codehaus.org/org/jencks/jencks/1.3/jencks-1.3.xsd"
>
?
由于ActiveMQ RA和Jencks?那個XSD 仍然有部分錯誤,因此使用的是自行修改過的XSD。(是xs:any元素引起的錯誤)
先在ClassPath根目錄放一個修改過的activemq-ra-4.1-incubator-SNAPSHOT.xsd和jencks-1.3.xsd。
同樣修改 ClassPath 下面META-INF\spring.schemas 增加內容如下。這個spring.schemas是spring自定義scheam的配置文件,請注意"http:\://"部分寫法
http\://people.apache.org/repository/org.apache.activemq/xsds/activemq-ra-4.1-incubator-SNAPSHOT.xsd=/activemq-ra-4.1-incubator-SNAPSHOT.xsd
http\://repository.codehaus.org/org/jencks/jencks/1.3/jencks-1.3.xsd=/jencks-1.3.xsd
?
2. 配置方案
2.1?基礎零件?
1.?配置ActiveMQ Broker? 參見 ActiveMQ+Spring
?
2.?配置ActiveMQ Resource Adapter
<amqra:managedConnectionFactory id="jmsManagedConnectionFactory" resourceAdapter="#resourceAdapter"/><amqra:resourceAdapter id="resourceAdapter" serverUrl="vm: />
?
3.?配置Jencks 基礎配置
?? 具體的配置可以參見Jencks的XSD
1
<!--
?jencks?PoolFactory?config
-->
2
<
jencks:singlePoolFactory?
id
="poolingSupport"
?maxSize
="16"
?minSize
="5"
?blockingTimeoutMilliseconds
="60"
?idleTimeoutMinutes
="60"
?matchOne
="true"
?matchAll
="true"
?selectOneAssumeMatch
="true"
?
/>
?
<!--
?jencks?XATransactionFactory?
-->
3
<
jencks:xATransactionFactory?
id
="transactionSupport"
?useTransactionCaching
="true"
?useThreadCaching
="true"
?
/>
??
4
<!--
?jencks?ConnectionManagerFactory?
-->
5
<
jencks:connectionManagerFactory?
id
="connectionManager"
?containerManagedSecurity
="false"
??poolingSupport
="#poolingSupport"
?transactionSupport
="#transactionSupport"
?
/>
?
<!--
?jencks?TransactionContextManagerFactory?
-->
6
<
jencks:transactionContextManagerFactory?
id
="transactionContextManagerFactory"
/>
7
??
?
4.?配置給JmsTemplate使用的connectionFactory (主要是生成者/發送者 使用)
?? 這里注意下,在配置jmsTemplate的使用的targetConnectionFactory就是使用jencks配置的connectionManager
<!--
?spring?config?jms?with?jca
-->
?
<
bean?
id
="jmsManagerConnectionFactory"
?class
="org.springframework.jca.support.LocalConnectionFactoryBean"
>
??
<
property?
name
="managedConnectionFactory"
>
???
<
ref?
local
="jmsManagedConnectionFactory"
?
/>
??
</
property
>
??
<
property?
name
="connectionManager"
>
???
<
ref?
local
="connectionManager"
?
/>
??
</
property
>
?
</
bean
>
?
?
<!--
??Spring?JmsTemplate?config?
-->
?
<
bean?
id
="jmsTemplate"
?class
="org.springframework.jms.core.JmsTemplate"
>
??
<
property?
name
="connectionFactory"
>
???
<!--
??lets?wrap?in?a?pool?to?avoid?creating?a?connection?per?send?
-->
???
<
bean?
class
="org.springframework.jms.connection.SingleConnectionFactory"
>
????????
<
property?
name
="targetConnectionFactory"
?ref
="jmsManagerConnectionFactory"
?
/>
???
</
bean
>
??
</
property
>
??
<!--
?custom?MessageConverter?
-->
??
<
property?
name
="messageConverter"
?ref
="orderMessageConverter"
?
/>
?
</
bean
>
?
?
5*.?配置Spring 2.0的MessageListenerAdapter,保證不需要用戶實現MessageListener*
?? 見ActiveMQ+Spring
?
?6.配置Jecnks 充當MDP的Container
? 就是把上面的MessageListenerAdapter配置到Jencks里面,完成整個MDP的配置
?
<!--?Jencks?Container-->
?<jencks:jcaContainer>??????<jencks:bootstrapContext>
???????????<jencks:bootstrapContextFactory?threadPoolSize="25"?/>
??????</jencks:bootstrapContext>
??????????<jencks:connectors>
??????????<!--?use?jencks?container?(use?spring?MessageListenerAdapter)-->
???????????<jencks:connector?ref="messageListener">
????????????????<jencks:activationSpec>
?????????????????????<amqra:activationSpec?destination="org.apache.activemq.spring.Test.spring.embedded"?destinationType="javax.jms.Queue"?/>
????????????????</jencks:activationSpec>
???????????</jencks:connector>??????</jencks:connectors>??????????<jencks:resourceAdapter>
???????????<amqra:resourceAdapter?serverUrl="vm://localhost"?/>
??????</jencks:resourceAdapter>
?</jencks:jcaContainer> ?
3. 說明
?? Spring 2.0本身使用DefaultMessageListenerContainer 可以充當MDP中的Container角色,但是鑒于Jencks是對于JCA標準,它不僅僅能夠提供jms的jca整合,包括其他資源比如jdbc都可以做到jca管理
所以,同時完成了這個ActiveMQ+Spring+Jencks 配置演示,更多的針對生產系統的JCA特性展示,會在稍后的開發計劃討論中確定。