ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>
åœ?lt;amq:broker>里é¢å¢žåŠ äº?br />Â
 Â
<amq:persistenceAdapter>
            <amq:jdbcPersistenceAdapter id="jdbcAdapter" dataSource="#hsql-ds" createTablesOnStartup="true" useDatabaseLock="false"/>
            <!--Â
                Mysql can setup useDatabaseLock="true",this is defualt
                HSQLDB,MSSQL plz setup useDatabaseLock="false",
                if u setup useDatabaseLock="true",u will catch error:
                MSSQL Error Info:FOR UPDATE clause allowed only for DECLARE CURSORÂ
                HSQLDB Error Info:FOR in statement [SELECT * FROM ACTIVEMQ_LOCK FOR UPDATE]
                see http://www.nabble.com/ActiveMQ-JDBC-Persistence-with-SQL-Server-tf2022248.html#a5560296
            -->
        </amq:persistenceAdapter>
è¯äh³¨æ„MSSQL(2000/2005)å’ŒHSQLç”׃ºŽä¸æ”¯æŒ[SELECT * ACTIVEMQ_LOCK FOR UPDATE ]
è¯æ³•,å› æ¤ä¸èƒ½ä½¿ç”¨é»˜è®¤çš„userDatabaseLock="true",åªèƒ½è®„¡½®æˆuseDatabaseLock="false"
时在spring里é¢é…ç½®äº†å¤šä¸ªæ•°æ®æº
1.SpringSide 使用内嵌的HSQL <!-- The HSQL Datasource that will be used by the Broker -->
    <bean id="hsql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName">
            <value>org.hsqldb.jdbcDriver</value>
        </property>
        <property name="url">
            <!--springside use HSQL,table info see hsql/activemq.script-->
            <value>jdbc:hsqldb:res:hsql/activemq</value>
        </property>
        <property name="username">
            <value>sa</value>
        </property>
        <property name="password">
            <value></value>
        </property>
        <property name="poolPreparedStatements">
            <value>true</value>
        </property>
    </bean>
2.MySql
 <!-- MySql DataSource Sample Setup -->
    <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName">
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property name="url">
            <value>jdbc:mysql://localhost/myproject?relaxAutoCommit=true</value>
        </property>
        <property name="username">
            <value>activemq</value>
        </property>
        <property name="password">
            <value>activemq</value>
        </property>
    </bean>
3.MSSQL
<!-- The MSSQL Datasource Sample Setup -->
    <bean id="mssql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName">
            <value>net.sourceforge.jtds.jdbc.Driver</value>
        </property>
        <property name="url">
            <value>jdbc:jtds:sqlserver://127.0.0.1:1433/YourDataBase</value>
        </property>
        <property name="username">
            <value>yourusername</value>
        </property>
        <property name="password">
            <value>youruserpassword</value>
        </property>
        <property name="poolPreparedStatements">
            <value>true</value>
        </property>
    </bean>   Â
    作者:cctvx1
Â Â Â Â æ¤æ–‡æ¡£ä»…适用于说明ä‹Éç”?Jecncks å’?使用Spring 2.0(DefaultMessageListenerContainer) 充当MDP Container之间的区åˆ?åŒæ—¶
演示Jecnks çš„Spring 2.0 æ–°é…¾|®å®žä¾‹ã€?/p>
   Â
 在ApplicationContext.xml(Spring的酾|®æ–‡ä»?ä¸å¼•å…¥ActiveMQ ResourceAdapter å’ŒJencks çš„XML Scheam é…置文äšg),如下:
  ActiveMQ4.1 å“应Spring 2.0å·å¬åQŒæ”¯æŒäº†å¼•å…¥XML Schema namespace的简å•é…¾|®è¯æ³•,½Ž€åŒ–了é…置的è¯å¥ã€‚Â?/p>
 在ApplicationContext.xml(Spring的酾|®æ–‡ä»?ä¸å¼•å…¥ActiveMQçš„XML Scheam é…置文äšg),如下:
< 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" >
�/p>
ç”׃ºŽActiveMQ RAå’ŒJencks 那个XSD ä»ç„¶æœ‰éƒ¨åˆ†é”™è¯¯ï¼Œå› æ¤ä½¿ç”¨çš„æ˜¯è‡ªè¡Œä¿®æ”¹˜q‡çš„XSDã€?是xs:anyå…ƒç´ å¼•è“v的错è¯?
先在ClassPathæ ¹ç›®å½•æ”¾ä¸€ä¸ªä¿®æ”¹è¿‡çš„activemq-ra-4.1-incubator-SNAPSHOT.xsdå’Œjencks-1.3.xsdã€?/p>
åŒæ ·ä¿®æ”¹ ClassPath 下é¢META-INF\spring.schemas å¢žåŠ å†…å®¹å¦‚ä¸‹ã€‚è¿™ä¸ªspring.schemas是spring自定义scheam的酾|®æ–‡ä»?è¯äh³¨æ„?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
�/p>
1. é…ç½®ActiveMQ Broker å‚è§ ActiveMQ+Springâ€?/p>
2. é…ç½®ActiveMQ Resource Adapter
<amqra:managedConnectionFactory id="jmsManagedConnectionFactory" resourceAdapter="#resourceAdapter"/><amqra:resourceAdapter id="resourceAdapter" serverUrl="vm://localhost" />
�/p>
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![]()
�/p>
4. é…ç½®¾l™JmsTemplate使用的connectionFactory (ä¸»è¦æ˜¯ç”Ÿæˆè€?å‘é€è€?使用)
  ˜q™é‡Œæ³¨æ„ä¸?在酾|®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 > Â
�/p>
5*. é…ç½®Spring 2.0çš„MessageListenerAdapter,ä¿è¯ä¸éœ€è¦ç”¨æˆ·å®žçްMessageListener*
  �span class="nobr">ActiveMQ+Spring�/p>
 6.é…ç½®Jecnks 充当MDPçš„Container
 ž®±æ˜¯æŠŠä¸Šé¢çš„MessageListenerAdapteré…置到Jencks里é¢,å®Œæˆæ•´ä¸ªMDP的酾|?/p>
Ââ€?/pre><!-- 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>
  Spring 2.0本èín使用DefaultMessageListenerContainer å¯ä»¥å……当MDPä¸çš„Container角色åQŒä½†æ˜¯é‰´äºŽJencks是对于JCAæ ‡å‡†,它ä¸ä»…仅能够æä¾›jmsçš„jcaæ•´åˆ,åŒ…æ‹¬å…¶ä»–èµ„æºæ¯”如jdbc都å¯ä»¥åšåˆ°jca½Ž¡ç†
所ä»?åŒæ—¶å®Œæˆäº†è¿™ä¸ªActiveMQ+Spring+Jencks é…置演示,更多的针对生产系¾lŸçš„JCAç‰ÒŽ€§å±•½C?会在½EåŽçš„å¼€å‘计划讨è®ÞZ¸¼‹®å®šã€?/p>