﻿<?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-Terry.B.Li           彬-文章分类-spring</title><link>http://www.blogjava.net/libin2722/category/26104.html</link><description>虚其心，可解天下之问；专其心，可治天下之学；静其心，可悟天下之理；恒其心，可成天下之业。</description><language>zh-cn</language><lastBuildDate>Thu, 04 Nov 2010 06:26:09 GMT</lastBuildDate><pubDate>Thu, 04 Nov 2010 06:26:09 GMT</pubDate><ttl>60</ttl><item><title>spring任务调度方法之Quartz</title><link>http://www.blogjava.net/libin2722/articles/336753.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Tue, 02 Nov 2010 00:52:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/336753.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/336753.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/336753.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/336753.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/336753.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、Quartz简介						 												    Quartz是一个开放源码项目，专注于任务调度器，提供了极为广泛的特性如持久化任务，集群和分布式任务等。Spring对Quartz的集成与其对JDK Timer的集成在任务、触发器和调度计划的声明式配置方面等都非常相似。     Quartz的核心由两个接口和两个类组成：Job和Scheduler接口，JobDetail...&nbsp;&nbsp;<a href='http://www.blogjava.net/libin2722/articles/336753.html'>阅读全文</a><img src ="http://www.blogjava.net/libin2722/aggbug/336753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2010-11-02 08:52 <a href="http://www.blogjava.net/libin2722/articles/336753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring JMS</title><link>http://www.blogjava.net/libin2722/articles/330632.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 01 Sep 2010 14:33:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/330632.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/330632.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/330632.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/330632.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/330632.html</trackback:ping><description><![CDATA[
		<div class="blog_content">
				<p>
						<strong>1 DestinationResolver</strong>
						<br />
    DestinationResolver接口的作用是将指定的目的地名解析为目的地实例。其定义如下：</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span class="keyword">public</span>
												<span> </span>
												<span class="keyword">interface</span>
												<span> DestinationResolver {  </span>
										</span>
								</li>
								<li>
										<span>    Destination resolveDestinationName(Session session, String destinationName,   </span>
								</li>
								<li>
										<span>        <span class="keyword">boolean</span><span> pubSubDomain) </span><span class="keyword">throws</span><span> JMSException;  </span></span>
								</li>
								<li>
										<span>}  </span>
								</li>
						</ol>
				</div>
				<p>    参数pubSubDomain用于指定是使用“发布/订阅”模式（解析后的目的地是Topic），还是使用“点对点”模式（解析后的目的地是Queue）。</p>
				<p> </p>
				<p>    CachingDestinationResolver接口继承了DestinationResolver，增加了缓存的功能，其接口定义如下：</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span class="keyword">public</span>
												<span> </span>
												<span class="keyword">interface</span>
												<span> CachingDestinationResolver </span>
												<span class="keyword">extends</span>
												<span> DestinationResolver {  </span>
										</span>
								</li>
								<li>
										<span>    <span class="keyword">void</span><span> removeFromCache(String destinationName);  </span></span>
								</li>
								<li>
										<span>    <span class="keyword">void</span><span> clearCache();  </span></span>
								</li>
								<li>
										<span>}  </span>
								</li>
						</ol>
				</div>
				<p>    在目的地失效的时候，removeFromCache方法会被调用；在JMS provider失效的时候，clearCache方法会被调用。<br /><br /><strong>1.1 DynamicDestinationResolver</strong><br />
    DynamicDestinationResolver实现了DestinationResolver接口。根据指定的目的地名，DynamicDestinationResolver会动态创建目的地实例。针对JMS1.1规范，它采用如下方法创建目的地：</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span>session.createTopic(topicName)  </span>
										</span>
								</li>
								<li>
										<span>session.createQueue(queueName);  </span>
								</li>
						</ol>
				</div>
				<p>
						<br />
						<strong>1.2 JndiDestinationResolver</strong>
						<br />
    JndiDestinationResolver继承自JndiLocatorSupport， 
同时实现了CachingDestinationResolver接口。如果在JMS 
provider中配置了静态目的地，那么JndiDestinationResolver通过JNDI查找的方式获得目的地实例。</p>
				<p>
						<br />
    
JndiDestinationResolver的fallbackToDynamicDestination属性用于指定在JNDI查找失败后，是否使
用动态目的地，默认值是false。JndiDestinationResolver的cache属性用于指定是否对目的地实例进行缓存，默认值是
true。</p>
				<p> </p>
				<p>
						<strong>1.3 BeanFactoryDestinationResolver</strong>
						<br />
    BeanFactoryDestinationResolver实现了DestinationResolver接口和BeanFactoryAware接口。它会根据指定的目的地名从BeanFactory中查找目的地实例。以下是相关的代码：</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span class="keyword">public</span>
												<span> Destination resolveDestinationName(Session session, String destinationName,   </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">boolean</span>
												<span> pubSubDomain) </span>
												<span class="keyword">throws</span>
												<span> JMSException {  </span>
										</span>
								</li>
								<li>
										<span>    Assert.state(<span class="keyword">this</span><span>.beanFactory != </span><span class="keyword">null</span><span>, </span><span class="string">"BeanFactory is required"</span><span>);  </span></span>
								</li>
								<li>
										<span>    <span class="keyword">try</span><span> {  </span></span>
								</li>
								<li>
										<span>        <span class="keyword">return</span><span> (Destination) </span><span class="keyword">this</span><span>.beanFactory.getBean(destinationName, Destination.</span><span class="keyword">class</span><span>);  </span></span>
								</li>
								<li>
										<span>    }  </span>
								</li>
								<li>
										<span>    <span class="keyword">catch</span><span> (BeansException ex) {  </span></span>
								</li>
								<li>
										<span>        <span class="keyword">throw</span><span> </span><span class="keyword">new</span><span> DestinationResolutionException(  </span></span>
								</li>
								<li>
										<span>            <span class="string">"Failed to look up Destinaton bean with name '"</span><span> + destinationName + </span><span class="string">"'"</span><span>, ex);  </span></span>
								</li>
								<li>
										<span>    }  </span>
								</li>
								<li>
										<span>}  </span>
								</li>
						</ol>
				</div>
				<p> </p>
				<p>
						<strong>2 JmsAccessor</strong>
						<br />
    
抽象类JmsAccessor是JmsTemplate、SimpleMessageListenerContainer和
DefaultMessageListenerContainer等concrete 
class的基类。JmsAccessor定义了如下几个用于访问JMS服务的共通属性。</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span class="keyword">private</span>
												<span> ConnectionFactory connectionFactory;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">boolean</span>
												<span> sessionTransacted = </span>
												<span class="keyword">false</span>
												<span>;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">int</span>
												<span> sessionAcknowledgeMode = Session.AUTO_ACKNOWLEDGE;  </span>
										</span>
								</li>
						</ol>
				</div>
				<p>
						<br />
    JmsAccessor提供了创建Connection和Session的方法，如下：</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span class="keyword">protected</span>
												<span> Connection createConnection() </span>
												<span class="keyword">throws</span>
												<span> JMSException {  </span>
										</span>
								</li>
								<li>
										<span>    <span class="keyword">return</span><span> getConnectionFactory().createConnection();  </span></span>
								</li>
								<li>
										<span>}  </span>
								</li>
								<li>
										<span>  </span>
								</li>
								<li>
										<span>
												<span class="keyword">protected</span>
												<span> Session createSession(Connection con) </span>
												<span class="keyword">throws</span>
												<span> JMSException {  </span>
										</span>
								</li>
								<li>
										<span>    <span class="keyword">return</span><span> con.createSession(isSessionTransacted(), getSessionAcknowledgeMode());  </span></span>
								</li>
								<li>
										<span>}  </span>
								</li>
						</ol>
				</div>
				<p> <br /><strong>2.1 JmsDestinationAccessor</strong><br />
    
抽象类JmsDestinationAccessor继承自JmsAccessor，增加了destinationResolver和
pubSubDomain属性。destinationResolver的默认值是DynamicDestinationResolver的实例，也就是
说默认采用动态目的地解析的方式；pubSubDomain用于指定是使用“发布/订阅”模式还是使用“点对点”模式，默认值是false。<br /><br />
    JmsDestinationAccessor提供了用于解析目的地的方法，如下：</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span class="keyword">protected</span>
												<span> Destination resolveDestinationName(Session session, String destinationName)   </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">throws</span>
												<span> JMSException {  </span>
										</span>
								</li>
								<li>
										<span>    <span class="keyword">return</span><span> getDestinationResolver().resolveDestinationName(session, destinationName,   </span></span>
								</li>
								<li>
										<span>        isPubSubDomain());  </span>
								</li>
								<li>
										<span>}  </span>
								</li>
						</ol>
				</div>
				<p>
						<br />
						<strong>2.2 AbstractJmsListeningContainer</strong>
						<br />
    AbstractJmsListeningContainer继承自JmsDestinationAccessor，作为所有Message 
Listener Container的公共基类。它主要提供了JMS 
connection的生命周期管理的功能，但是没有对消息接收的方式（主动接收方式或者异步接收方式）等做任何假定。该类主要的属性如下：</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span class="keyword">private</span>
												<span> String clientId;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> Connection sharedConnection;  </span>
										</span>
								</li>
						</ol>
				</div>
				<p>    clientId通常用于持久订阅；sharedConnection保存了被共享的JMS connection。</p>
				<p> </p>
				<p>    该类定义了如下的抽象方法，以便子类可以决定是否使用共享的JMS connection。</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span class="keyword">protected</span>
												<span> </span>
												<span class="keyword">abstract</span>
												<span> </span>
												<span class="keyword">boolean</span>
												<span> sharedConnectionEnabled();  </span>
										</span>
								</li>
						</ol>
				</div>
				<p> </p>
				<p>
						<strong>2.3 AbstractMessageListenerContainer</strong>
						<br />
    AbstractMessageListenerContainer继承自AbstractJmsListeningContainer，也是作为所有Message Listener Container的公共基类。该类主要的属性如下：</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">volatile</span>
												<span> Object destination;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">volatile</span>
												<span> Object messageListener;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">boolean</span>
												<span> exposeListenerSession = </span>
												<span class="keyword">true</span>
												<span>;  </span>
										</span>
								</li>
						</ol>
				</div>
				<p>    destination用于指定接收消息的目的地。<br />
    
messageListener用于指定处理消息的listener。对于messageListener，它既可以是符合JMS规范的
javax.jms.MessageListener，也可以是Spring特有的
org.springframework.jms.listener.SessionAwareMessageListener。
SessionAwareMessageListener的定义如下：</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span class="keyword">public</span>
												<span> </span>
												<span class="keyword">interface</span>
												<span> SessionAwareMessageListener {  </span>
										</span>
								</li>
								<li>
										<span>    <span class="keyword">void</span><span> onMessage(Message message, Session session) </span><span class="keyword">throws</span><span> JMSException;  </span></span>
								</li>
								<li>
										<span>}  </span>
								</li>
						</ol>
				</div>
				<p>    跟javax.jms.MessageListener相比，这个接口的onMessage方法增加了一个Session 类型的参数，可以通过这个session发送回复消息（reply message）。</p>
				<p>
						<br />
    如果使用了SessionAwareMessageListener 类型的message 
listener，那么exposeListenerSession参数指定了传入onMessage方法的session参数是否是创建了
MessageConsumer的session，默认值是true。如果是false，那么
AbstractMessageListenerContainer会在connection上新建一个session，并传入onMessage方法。<br /><br /><strong>2.4 AbstractPollingMessageListenerContainer</strong><br />
    AbstractPollingMessageListenerContainer继承自AbstractMessageListenerContainer，它提供了对于主动接收消息(polling)的支持，以及支持外部的事务管理。</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">boolean</span>
												<span> pubSubNoLocal = </span>
												<span class="keyword">false</span>
												<span>;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">long</span>
												<span> receiveTimeout = DEFAULT_RECEIVE_TIMEOUT;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> PlatformTransactionManager transactionManager;  </span>
										</span>
								</li>
						</ol>
				</div>
				<p>    如果使用“发布/订阅”模式，那么pubSubNoLocal 属性指定通过某个连接发送到某个Topic的消息，是否应该被投递回这个连接。</p>
				<p>
						<br />
    receiveTimeout属性用于指定调用MessageConsumer的receive方法时的超时时间，默认值是1秒。需要注意的是，这个值应该比transactionManager 中指定的事务超时时间略小。</p>
				<p>
						<br />
    
通常情况下，应该为transactionManager设置一个
org.springframework.transaction.jta.JtaTransactionManager的实例，此外也要设置一个支持
XA的ConnectionFactory。需要注意的是，XA 事务对性能有较大的影响。<br />
    如果只是希望使用local JMS 
transaction，那么只要设置sessionTransacted为true或者使用JmsTransactionManager即可。实际上，
如果设置了非JTA的transactionManager，那么sessionTransacted属性会自动被设置成true。<br />
    由于local JMS transaction无法同其它local transaction（例如local database 
transaction）进行协调，因此客户端程序可能需要对重发的消息进行检查。JMS规范要求：JMS 
provider应该将重发消息的JMSRedelivered属性设置为true。<br /><br /><strong>2.5 SimpleMessageListenerContainer</strong><br />
    
SimpleMessageListenerContainer继承自AbstractMessageListenerContainer，使用异步方式
接收消息（也就是通过MessageConsumer上注册MessageListener的方式接收消息）。该类主要的属性如下：</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">boolean</span>
												<span> pubSubNoLocal = </span>
												<span class="keyword">false</span>
												<span>;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">int</span>
												<span> concurrentConsumers = </span>
												<span class="number">1</span>
												<span>;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> Set sessions;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> Set consumers;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> TaskExecutor taskExecutor;  </span>
										</span>
								</li>
						</ol>
				</div>
				<p>    如果使用“发布/订阅”模式，那么pubSubNoLocal 属性指定通过某个连接发送到某个Topic的消息，是否应该被投递回这个连接。</p>
				<p> </p>
				<p>
    
SimpleMessageListenerContainer允许创建多个Session和MessageConsumer来接收消息。具体的个数由
concurrentConsumers属性指定。需要注意的是，应该只是在Destination为Queue的时候才使用多个
MessageConsumer（Queue中的一个消息只能被一个Consumer接收），虽然使用多个MessageConsumer会提高消息处理
的性能，但是消息处理的顺序却得不到保证：消息被接收的顺序仍然是消息发送时的顺序，但是由于消息可能会被并发处理，因此消息处理的顺序可能和消息发送的
顺序不同。此外，不应该在Destination为Topic的时候使用多个MessageConsumer，这是因为多个
MessageConsumer会接收到同样的消息。</p>
				<p>    SimpleMessageListenerContainer创建的Session和MessageConsumer分别保存在sessions和consumers属性中。</p>
				<p>
						<br />
    
taskExecutor属性的默认值是null，也就是说，对MessageListener（或者
SessionAwareMessageListener）的回调是在MessageConsumer的内部线程中执行。如果指定了
taskExecutor，那么回调是在TaskExecutor内部的线程中执行。以下是相关的代码：</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span class="keyword">protected</span>
												<span> MessageConsumer createListenerConsumer(</span>
												<span class="keyword">final</span>
												<span> Session session)   </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">throws</span>
												<span> JMSException {  </span>
										</span>
								</li>
								<li>
										<span>    Destination destination = getDestination();  </span>
								</li>
								<li>
										<span>    <span class="keyword">if</span><span> (destination == </span><span class="keyword">null</span><span>) {  </span></span>
								</li>
								<li>
										<span>        destination = resolveDestinationName(session, getDestinationName());  </span>
								</li>
								<li>
										<span>    }  </span>
								</li>
								<li>
										<span>    MessageConsumer consumer = createConsumer(session, destination);  </span>
								</li>
								<li>
										<span>  </span>
								</li>
								<li>
										<span>    <span class="keyword">if</span><span> (</span><span class="keyword">this</span><span>.taskExecutor != </span><span class="keyword">null</span><span>) {  </span></span>
								</li>
								<li>
										<span>        consumer.setMessageListener(<span class="keyword">new</span><span> MessageListener() {  </span></span>
								</li>
								<li>
										<span>            <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> onMessage(</span><span class="keyword">final</span><span> Message message) {  </span></span>
								</li>
								<li>
										<span>                taskExecutor.execute(<span class="keyword">new</span><span> Runnable() {  </span></span>
								</li>
								<li>
										<span>                    <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> run() {  </span></span>
								</li>
								<li>
										<span>                        processMessage(message, session);  </span>
								</li>
								<li>
										<span>                    }  </span>
								</li>
								<li>
										<span>                });  </span>
								</li>
								<li>
										<span>            }  </span>
								</li>
								<li>
										<span>        });  </span>
								</li>
								<li>
										<span>    }  </span>
								</li>
								<li>
										<span>    <span class="keyword">else</span><span> {  </span></span>
								</li>
								<li>
										<span>        consumer.setMessageListener(<span class="keyword">new</span><span> MessageListener() {  </span></span>
								</li>
								<li>
										<span>            <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> onMessage(Message message) {  </span></span>
								</li>
								<li>
										<span>                processMessage(message, session);  </span>
								</li>
								<li>
										<span>            }  </span>
								</li>
								<li>
										<span>        });  </span>
								</li>
								<li>
										<span>    }  </span>
								</li>
								<li>
										<span>  </span>
								</li>
								<li>
										<span>    <span class="keyword">return</span><span> consumer;  </span></span>
								</li>
								<li>
										<span>}  </span>
								</li>
						</ol>
				</div>
				<p>    
需要注意的是，如果指定了taskExecutor，那么消息在被taskExecutor内部的线程处理前，可能已经被确认过了（外层的
onMessage方法可能已经执行结束了）。因此如果使用事务Session或者Session.CLIENT_ACKNOWLEDGE类型的确认模
式，那么可能会导致问题。</p>
				<p> </p>
				<p>    
该类的sharedConnectionEnabled方法（在AbstractJmsListeningContainer中定义）总是返回true，
因此SimpleMessageListenerContainer会使用共享的JMS connection。<br /><br /><strong>2.6 DefaultMessageListenerContainer</strong><br />
    
DefaultMessageListenerContainer继承自
AbstractPollingMessageListenerContainer，主要使用同步的方式接收消息（也就是通过循环调用
MessageConsumer.receive的方式接收消息）。该类主要的属性如下：</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">int</span>
												<span> concurrentConsumers = </span>
												<span class="number">1</span>
												<span>;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">int</span>
												<span> maxConcurrentConsumers = </span>
												<span class="number">1</span>
												<span>;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">int</span>
												<span> maxMessagesPerTask = Integer.MIN_VALUE;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">int</span>
												<span> idleTaskExecutionLimit = </span>
												<span class="number">1</span>
												<span>;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">final</span>
												<span> Set scheduledInvokers = </span>
												<span class="keyword">new</span>
												<span> HashSet();  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> TaskExecutor taskExecutor;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">int</span>
												<span> cacheLevel = CACHE_AUTO;  </span>
										</span>
								</li>
						</ol>
				</div>
				<p>    
跟SimpleMessageListenerContainer一样，DefaultMessageListenerContainer也支持创建多个
Session和MessageConsumer来接收消息。跟SimpleMessageListenerContainer不同的
是，DefaultMessageListenerContainer创建了concurrentConsumers所指定个数的
AsyncMessageListenerInvoker（实现了SchedulingAwareRunnable接口），并交给
taskExecutor运行。</p>
				<p>
						<br />
    
maxMessagesPerTask属性的默认值是Integer.MIN_VALUE，但是如果设置的taskExecutor（默认值是
SimpleAsyncTaskExecutor）实现了SchedulingTaskExecutor接口并且其
prefersShortLivedTasks方法返回true（也就是说该TaskExecutor倾向于短期任务），那么
maxMessagesPerTask属性会自动被设置为10。<br />
    
如果maxMessagesPerTask属性的值小于0，那么AsyncMessageListenerInvoker.run方法会在循环中反复尝试
接收消息，并在接收到消息后调用MessageListener（或者SessionAwareMessageListener）；如果
maxMessagesPerTask属性的值不小于0，那么AsyncMessageListenerInvoker.run方法里最多会尝试接收消息
maxMessagesPerTask次，每次接收消息的超时时间由其父类
AbstractPollingMessageListenerContainer的receiveTimeout属性指定。如果在这些尝试中都没有接收
到消息，那么AsyncMessageListenerInvoker的idleTaskExecutionCount属性会被累加。在run方法执行完
毕前会对idleTaskExecutionCount进行检查，如果该值超过了
DefaultMessageListenerContainer.idleTaskExecutionLimit（默认值1），那么这个
AsyncMessageListenerInvoker可能会被销毁。</p>
				<p>
						<br />
    
所有AsyncMessageListenerInvoker实例都保存在scheduledInvokers中，实例的个数可以在
concurrentConsumers和maxConcurrentConsumers之间浮动。跟
SimpleMessageListenerContainer一样，应该只是在Destination为Queue的时候才使用多个
AsyncMessageListenerInvoker实例。</p>
				<p> </p>
				<p>    cacheLevel属性用于指定是否对JMS资源进行缓存，可选的值是CACHE_NONE = 0、CACHE_CONNECTION
 = 1、CACHE_SESSION = 2、CACHE_CONSUMER = 3和CACHE_AUTO = 
4。默认情况下，如果transactionManager属性不为null，那么cacheLevel被自动设置为CACHE_NONE（不进行缓
存），否则cacheLevel被自动设置为CACHE_CONSUMER。</p>
				<p>
						<br />
    如果cacheLevel属性值大于等于CACHE_CONNECTION，那么sharedConnectionEnabled方法（在AbstractJmsListeningContainer中定义）返回true，也就是说使用共享的JMS连接。</p>
				<p> </p>
				<p> </p>
				<p>
						<strong>3 SingleConnectionFactory</strong>
						<br />
    
SingleConnectionFactory实现了ConnectionFactory接口，其createConnection方法总是返回相同的
Connection。可以在SingleConnectionFactory的构造函数中传入Connection对象或者
ConnectionFactory对象，用来创建被代理的连接对象。
SingleConnectionFactory.createConnection方法返回的连接是个代理，它忽略了对stop和close方法的调用
（连接会在SingleConnectionFactory.destroy方法中关闭）。</p>
				<p>
						<br />
    SingleConnectionFactory的reconnectOnException属性用来指定是否在连接抛出JMSException的时候，对连接进行重置，重置后如果再调用createConnection方法，那么会返回一个新的连接。</p>
				<p>
						<br />
    
需要注意的是，AbstractJmsListeningContainer类的抽象方法sharedConnectionEnabled指定了是否在
message listener container内部使用共享的JMS连接。因此通常情况下不需要为单独的message listener 
container设置SingleConnectionFactory（及其子类）；如果希望在不同的message listener 
container之间共享JMS连接，那么可以考虑使用SingleConnectionFactory。<br /><br /><strong>3.1 CachingConnectionFactory</strong><br />
    CachingConnectionFactory继承自SingleConnectionFactory，增加了对Session和MessageProducer缓存的功能。该类主要的属性如下：</p>
				<div class="dp-highlighter">
						<div class="bar">
								<div class="tools">Java代码 </div>
						</div>
						<ol class="dp-j" start="1">
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">int</span>
												<span> sessionCacheSize = </span>
												<span class="number">1</span>
												<span>;  </span>
										</span>
								</li>
								<li>
										<span>
												<span class="keyword">private</span>
												<span> </span>
												<span class="keyword">boolean</span>
												<span> cacheProducers = </span>
												<span class="keyword">true</span>
												<span>;  </span>
										</span>
								</li>
						</ol>
				</div>
				<p>    sessionCacheSize属性指定了被缓存的Session实例的个数（默认值是1），也就是说，如果同时请求的Session个数大于sessionCacheSize，那么这些Session不会被缓存，而是正常的被创建和销毁。</p>
				<p>
						<br />
    cacheProducers属性指定了是否对MessageProducer进行缓存，默认值是true。</p>
		</div>
<img src ="http://www.blogjava.net/libin2722/aggbug/330632.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2010-09-01 22:33 <a href="http://www.blogjava.net/libin2722/articles/330632.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring事务配置的五种方式</title><link>http://www.blogjava.net/libin2722/articles/264190.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Tue, 07 Apr 2009 01:29:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/264190.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/264190.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/264190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/264190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/264190.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前段时间对Spring的事务配置做了比较深入的研究，在此之间对Spring的事务配置虽说也配置过，但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清，还是比较好掌握的。&nbsp;&nbsp;&nbsp; 总结如下：&nbsp;&nbsp;&nbsp; Spring配置文件中关于事务配置总是由三个组成部分，分别是DataSource、TransactionM...&nbsp;&nbsp;<a href='http://www.blogjava.net/libin2722/articles/264190.html'>阅读全文</a><img src ="http://www.blogjava.net/libin2722/aggbug/264190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2009-04-07 09:29 <a href="http://www.blogjava.net/libin2722/articles/264190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转载)Spring Security 2 配置精讲</title><link>http://www.blogjava.net/libin2722/articles/256678.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Wed, 25 Feb 2009 11:15:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/256678.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/256678.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/256678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/256678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/256678.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 论坛上看了不少Spring Security的相关文章。这些文章基本上都还是基于Acegi-1.X的配置方式，而主要的配置示例也来自于SpringSide的贡献。众所周知，Spring Security针对Acegi的一个重大的改进就在于其配置方式大大简化了。所以如果配置还是基于Acegi-1.X这样比较繁琐的配置方式的话，那么我们还不如直接使用Acegi而不要去升级了。所以在这里，我...&nbsp;&nbsp;<a href='http://www.blogjava.net/libin2722/articles/256678.html'>阅读全文</a><img src ="http://www.blogjava.net/libin2722/aggbug/256678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2009-02-25 19:15 <a href="http://www.blogjava.net/libin2722/articles/256678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Security学习总结一 </title><link>http://www.blogjava.net/libin2722/articles/256336.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Mon, 23 Feb 2009 12:26:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/256336.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/256336.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/256336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/256336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/256336.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在认识SpringSecurity之前，所有的权限验证逻辑都混杂在业务逻辑中，用户的每个操作以前可能都需要对用户是否有进行该项操作的权限进行判断，来达到认证授权的目的。类似这样的权限验证逻辑代码被分散在系统的许多地方，难以维护。AOP（Aspect OrientedProgramming）和SpringSecurity为我们的应用程序很好的解决了此类问题，正如系统日志，事务管理等这...&nbsp;&nbsp;<a href='http://www.blogjava.net/libin2722/articles/256336.html'>阅读全文</a><img src ="http://www.blogjava.net/libin2722/aggbug/256336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2009-02-23 20:26 <a href="http://www.blogjava.net/libin2722/articles/256336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring2事务管理的两种配置(XML&amp;&amp;标注)-转载</title><link>http://www.blogjava.net/libin2722/articles/234750.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Thu, 16 Oct 2008 12:04:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/234750.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/234750.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/234750.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/234750.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/234750.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: package&nbsp;com.epeer.dao;public&nbsp;interface&nbsp;UserDao&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;insertUserIp(String&nbsp;startip,&nbsp;String&nbsp;endip);}package&nbs...&nbsp;&nbsp;<a href='http://www.blogjava.net/libin2722/articles/234750.html'>阅读全文</a><img src ="http://www.blogjava.net/libin2722/aggbug/234750.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-10-16 20:04 <a href="http://www.blogjava.net/libin2722/articles/234750.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring--简单使用quartz实现定时作业</title><link>http://www.blogjava.net/libin2722/articles/201177.html</link><dc:creator>礼物</dc:creator><author>礼物</author><pubDate>Sat, 17 May 2008 15:29:00 GMT</pubDate><guid>http://www.blogjava.net/libin2722/articles/201177.html</guid><wfw:comment>http://www.blogjava.net/libin2722/comments/201177.html</wfw:comment><comments>http://www.blogjava.net/libin2722/articles/201177.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/libin2722/comments/commentRss/201177.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/libin2722/services/trackbacks/201177.html</trackback:ping><description><![CDATA[<ol class="dp-j" start="1">
    <li><span><span>&lt;?xml&nbsp;version=</span><span class="string">"1.0"</span><span>&nbsp;encoding=</span><span class="string">"UTF-8"</span><span>?&gt;&nbsp;&nbsp;</span></span></li>
    <li><span>&lt;!DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;<span class="string">"-//<span class="hilite1">SPRING</span>//DTD&nbsp;BEAN//EN"</span><span>&nbsp;</span><span class="string">"http://www.<span class="hilite1">spring</span>framework.org/dtd/<span class="hilite1">spring</span>-beans.dtd"</span><span>&gt;&nbsp;&nbsp;</span></span></li>
    <li><span>&lt;beans&gt;&nbsp;&nbsp;</span></li>
    <li><span>&lt;!--起动Bean--&gt;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&lt;bean&nbsp;id=<span class="string">"z"</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.<span class="hilite1">spring</span>framework.scheduling.<span class="hilite2">quartz</span>.SchedulerFactoryBean"</span><span>&gt;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"triggers"</span><span>&gt;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&nbsp;bean=<span class="string">"cronReportTrigger"</span><span>/&gt;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&lt;/bean&gt;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&lt;!--实际的工作Bean--&gt;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&lt;bean&nbsp;id=<span class="string">"courseService"</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"com.<span class="hilite1">spring</span>.helloworld.CourseService"</span><span>&gt;&lt;/bean&gt;&nbsp;&nbsp;</span></span></li>
    <li><span>&lt;!--jobBean用于设定启动时运用的Bean与方法--&gt;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&lt;bean&nbsp;id=<span class="string">"scheduledReportJobDetail"</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li><span><span class="keyword">class</span><span>=</span><span class="string">"org.<span class="hilite1">spring</span>framework.scheduling.<span class="hilite2">quartz</span>.MethodInvokingJobDetailFactoryBean"</span><span>&gt;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"targetObject"</span><span>&gt;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&nbsp;&nbsp;bean=<span class="string">"courseService"</span><span>/&gt;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"targetMethod"</span><span>&gt;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;sendCourseEnrollmentReport&lt;/value&gt;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&lt;/bean&gt;&nbsp;&nbsp;</span></li>
    <li><span>&lt;!--定时器设定起动频率&amp;启动时间我设的是每<span class="number">5</span><span>秒起动一次&nbsp;(</span><span class="number">0</span><span>&nbsp;</span><span class="number">0</span><span>&nbsp;&nbsp;</span><span class="number">4</span><span>&nbsp;*&nbsp;*&nbsp;?每日四点起动....)--&gt;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&lt;bean&nbsp;id=<span class="string">"cronReportTrigger"</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li><span><span class="keyword">class</span><span>=</span><span class="string">"org.<span class="hilite1">spring</span>framework.scheduling.<span class="hilite2">quartz</span>.CronTriggerBean"</span><span>&gt;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&lt;property&nbsp;&nbsp;name=<span class="string">"jobDetail"</span><span>&gt;&lt;ref&nbsp;bean=</span><span class="string">"scheduledReportJobDetail"</span><span>/&gt;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&lt;/property&gt;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&lt;property&nbsp;name=<span class="string">"cronExpression"</span><span>&gt;&lt;value&gt;</span><span class="number">10</span><span>,</span><span class="number">15</span><span>,</span><span class="number">20</span><span>,</span><span class="number">25</span><span>,</span><span class="number">30</span><span>,</span><span class="number">35</span><span>,</span><span class="number">40</span><span>,</span><span class="number">45</span><span>,</span><span class="number">50</span><span>,</span><span class="number">55</span><span>&nbsp;*&nbsp;*&nbsp;*&nbsp;*&nbsp;?&lt;/value&gt;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li><span>&lt;/property&gt;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&lt;/bean&gt;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&lt;/beans&gt;&nbsp; <br />
    </span></li>
</ol>
<br />
<ol class="dp-j" start="1">
    <li><span><span class="keyword">package</span><span>&nbsp;com.<span class="hilite1">spring</span>.helloworld;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span><span class="keyword">import</span><span>&nbsp;java.io.FileNotFoundException;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span><span class="keyword">import</span><span>&nbsp;org.<span class="hilite1">spring</span>framework.beans.BeansException;&nbsp;&nbsp;</span></span></li>
    <li><span><span class="keyword">import</span><span>&nbsp;org.<span class="hilite1">spring</span>framework.beans.factory.BeanFactory;&nbsp;&nbsp;</span></span></li>
    <li><span><span class="keyword">import</span><span>&nbsp;org.<span class="hilite1">spring</span>framework.beans.factory.xml.XmlBeanFactory;&nbsp;&nbsp;</span></span></li>
    <li><span><span class="keyword">import</span><span>&nbsp;org.<span class="hilite1">spring</span>framework.core.io.FileSystemResource;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span><span class="keyword">import</span><span>&nbsp;com.<span class="hilite1">spring</span>.hellow.LogInit;&nbsp;&nbsp;</span></span></li>
    <li><span><span class="keyword">import</span><span>&nbsp;com.<span class="hilite1">spring</span>.hellow.QuestException;&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TaskApp&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;BeansException,&nbsp;FileNotFoundException,&nbsp;QuestException,&nbsp;InterruptedException&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">new</span><span>&nbsp;LogInit(</span><span class="string">"WEB-INF/classes/com/<span class="hilite1">spring</span>/helloworld/log4j.properties"</span><span>);&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanFactory&nbsp;factory&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;XmlBeanFactory(</span><span class="keyword">new</span><span>&nbsp;FileSystemResource(&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"WEB-INF/classes/"</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"com/<span class="hilite1">spring</span>/helloworld/"</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"helloworld.xml"</span><span>));&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory.getBean(<span class="string">"z"</span><span>);</span><span class="comment">//为什么必须用这个方法触发呢不触发为什么不行呢?</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>}</span></li>
    <li><br />
    </li>
    <li>附：cronExpression配置说明
    <table cellspacing="8">
        <tbody>
            <tr>
                <th align="left">字段</th>
                <th align="left">&nbsp;</th>
                <th align="left">允许值</th>
                <th align="left">&nbsp;</th>
                <th align="left">允许的特殊字符</th>
            </tr>
            <tr>
                <td align="left"><code>秒</code></td>
                <td align="left">&nbsp; </td>
                <td align="left"><code>0-59</code></td>
                <td align="left">&nbsp; </td>
                <td align="left"><code>, - * /</code></td>
            </tr>
            <tr>
                <td align="left"><code>分</code></td>
                <td align="left">&nbsp; </td>
                <td align="left"><code>0-59</code></td>
                <td align="left">&nbsp; </td>
                <td align="left"><code>, - * /</code></td>
            </tr>
            <tr>
                <td align="left"><code>小时</code></td>
                <td align="left">&nbsp; </td>
                <td align="left"><code>0-23</code></td>
                <td align="left">&nbsp; </td>
                <td align="left"><code>, - * /</code></td>
            </tr>
            <tr>
                <td align="left"><code>日期</code></td>
                <td align="left">&nbsp; </td>
                <td align="left"><code>1-31</code></td>
                <td align="left">&nbsp; </td>
                <td align="left"><code>, - * ? / L W C</code></td>
            </tr>
            <tr>
                <td align="left"><code>月份</code></td>
                <td align="left">&nbsp; </td>
                <td align="left"><code>1-12&nbsp;或者 JAN-DEC</code></td>
                <td align="left">&nbsp; </td>
                <td align="left"><code>, - * /</code></td>
            </tr>
            <tr>
                <td align="left"><code>星期</code></td>
                <td align="left">&nbsp; </td>
                <td align="left"><code>1-7&nbsp;或者 SUN-SAT</code></td>
                <td align="left">&nbsp; </td>
                <td align="left"><code>, - * ? / L C #</code></td>
            </tr>
            <tr>
                <td align="left"><code>年（可选）</code></td>
                <td align="left">&nbsp; </td>
                <td align="left"><code>留空, 1970-2099</code></td>
                <td align="left">&nbsp; </td>
                <td align="left"><code>, - * /</code></td>
            </tr>
        </tbody>
    </table>
    <span>&nbsp;
    </span></li>
</ol>
<table cellspacing="8">
    <tbody>
        <tr>
            <th align="left">字段</th>
            <th align="left">&nbsp;</th>
            <th align="left">允许值</th>
            <th align="left">&nbsp;</th>
            <th align="left">允许的特殊字符</th>
        </tr>
        <tr>
            <td align="left">
            <code>秒</code>
            </td>
            <td align="left">&nbsp; </td>
            <td align="left">
            <code>0-59</code>
            </td>
            <td align="left">&nbsp; </td>
            <td align="left">
            <code>, - * /</code>
            </td>
        </tr>
        <tr>
            <td align="left">
            <code>分</code>
            </td>
            <td align="left">&nbsp; </td>
            <td align="left">
            <code>0-59</code>
            </td>
            <td align="left">&nbsp; </td>
            <td align="left">
            <code>, - * /</code>
            </td>
        </tr>
        <tr>
            <td align="left">
            <code>小时</code>
            </td>
            <td align="left">&nbsp; </td>
            <td align="left">
            <code>0-23</code>
            </td>
            <td align="left">&nbsp; </td>
            <td align="left">
            <code>, - * /</code>
            </td>
        </tr>
        <tr>
            <td align="left">
            <code>日期</code>
            </td>
            <td align="left">&nbsp; </td>
            <td align="left">
            <code>1-31</code>
            </td>
            <td align="left">&nbsp; </td>
            <td align="left">
            <code>, - * ? / L W C</code>
            </td>
        </tr>
        <tr>
            <td align="left">
            <code>月份</code>
            </td>
            <td align="left">&nbsp; </td>
            <td align="left">
            <code>1-12&nbsp;或者 JAN-DEC</code>
            </td>
            <td align="left">&nbsp; </td>
            <td align="left">
            <code>, - * /</code>
            </td>
        </tr>
        <tr>
            <td align="left">
            <code>星期</code>
            </td>
            <td align="left">&nbsp; </td>
            <td align="left">
            <code>1-7&nbsp;或者 SUN-SAT</code>
            </td>
            <td align="left">&nbsp; </td>
            <td align="left">
            <code>, - * ? / L C #</code>
            </td>
        </tr>
        <tr>
            <td align="left">
            <code>年（可选）</code>
            </td>
            <td align="left">&nbsp; </td>
            <td align="left">
            <code>留空, 1970-2099</code>
            </td>
            <td align="left">&nbsp; </td>
            <td align="left">
            <code>, - * /</code>
            </td>
        </tr>
    </tbody>
</table>
<p>
<br />
The '*' character is used to specify all values. For example, "*" in the minute field means "every minute". <br />
&#8220;*&#8221;字符被用来指定所有的值。如：&#8221;*&#8220;在分钟的字段域里表示&#8220;每分钟&#8221;。 <br />
The
'?' character is allowed for the day-of-month and day-of-week fields.
It is used to specify 'no specific value'. This is useful when you need
to specify something in one of the two fileds, but not the other. See
the examples below for clarification. <br />
&#8220;?&#8221;字符只在日期域和星期域中使用。它被用来指定&#8220;非明确的值&#8221;。当你需要通过在这两个域中的一个来指定一些东西的时候，它是有用的。看下面的例子你就会明白。 <br />
月份中的日期和星期中的日期这两个元素时互斥的一起应该通过设置一个问号(?)来表明不想设置那个字段<br />
<br />
The '-' character is used to specify ranges For example "10-12" in the hour field means "the hours 10, 11 and 12". <br />
&#8220;-&#8221;字符被用来指定一个范围。如：&#8220;10-12&#8221;在小时域意味着&#8220;10点、11点、12点&#8221;。 <br />
<br />
The
',' character is used to specify additional values. For example
"MON,WED,FRI" in the day-of-week field means "the days Monday,
Wednesday, and Friday". <br />
&#8220;,&#8221;字符被用来指定另外的值。如：&#8220;MON,WED,FRI&#8221;在星期域里表示&#8221;星期一、星期三、星期五&#8221;. <br />
<br />
The
'/' character is used to specify increments. For example "0/15" in the
seconds field means "the seconds 0, 15, 30, and 45". And "5/15" in the
seconds field means "the seconds 5, 20, 35, and 50". Specifying '*'
before the '/' is equivalent to specifying 0 is the value to start
with. Essentially, for each field in the expression, there is a set of
numbers that can be turned on or off. For seconds and minutes, the
numbers range from 0 to 59. For hours 0 to 23, for days of the month 0
to 31, and for months 1 to 12. The "/" character simply helps you turn
on every "nth" value in the given set. Thus "7/6" in the month field
only turns on month "7", it does NOT mean every 6th month, please note
that subtlety. <br />
<br />
The 'L' character is allowed for the
day-of-month and day-of-week fields. This character is short-hand for
"last", but it has different meaning in each of the two fields. For
example, the value "L" in the day-of-month field means "the last day of
the month" - day 31 for January, day 28 for February on non-leap years.
If used in the day-of-week field by itself, it simply means "7" or
"SAT". But if used in the day-of-week field after another value, it
means "the last xxx day of the month" - for example "6L" means "the
last friday of the month". When using the 'L' option, it is important
not to specify lists, or ranges of values, as you'll get confusing
results. <br />
<br />
L是&#8216;last&#8217;的省略写法可以表示day-of-month和day-of-week域，但在两个字段中的意思不同，例如day-of-month域中表示一个月的最后一天，<br />
如果在day-of-week域表示&#8216;7&#8217;或者&#8216;SAT&#8217;，如果在day-of-week域中前面加上数字，它表示一个月的最后几天，例如&#8216;6L&#8217;就表示一个月的最后一个<br />
星期五，<br />
<br />
The
'W' character is allowed for the day-of-month field. This character is
used to specify the weekday (Monday-Friday) nearest the given day. As
an example, if you were to specify "15W" as the value for the
day-of-month field, the meaning is: "the nearest weekday to the 15th of
the month". So if the 15th is a Saturday, the trigger will fire on
Friday the 14th. If the 15th is a Sunday, the trigger will fire on
Monday the 16th. If the 15th is a Tuesday, then it will fire on Tuesday
the 15th. However if you specify "1W" as the value for day-of-month,
and the 1st is a Saturday, the trigger will fire on Monday the 3rd, as
it will not 'jump' over the boundary of a month's days. The 'W'
character can only be specified when the day-of-month is a single day,
not a range or list of days<br />
. <br />
The 'L' and 'W' characters can
also be combined for the day-of-month expression to yield 'LW', which
translates to "last weekday of the month". <br />
<br />
The '#' character
is allowed for the day-of-week field. This character is used to specify
"the nth" XXX day of the month. For example, the value of "6#3" in the
day-of-week field means the third Friday of the month (day 6 = Friday
and "#3" = the 3rd one in the month). Other examples: "2#1" = the first
Monday of the month and "4#5" = the fifth Wednesday of the month. Note
that if you specify "#5" and there is not 5 of the given day-of-week in
the month, then no firing will occur that month. <br />
<br />
The 'C'
character is allowed for the day-of-month and day-of-week fields. This
character is short-hand for "calendar". This means values are
calculated against the associated calendar, if any. If no calendar is
associated, then it is equivalent to having an all-inclusive calendar.
A value of "5C" in the day-of-month field means "the first day included
by the calendar on or after the 5th". A value of "1C" in the
day-of-week field means "the first day included by the calendar on or
after sunday". <br />
关于cronExpression的介绍:<br />
<br />
字段 允许值 允许的特殊字符 <br />
秒 0-59 , - * / <br />
分 0-59 , - * / <br />
小时 0-23 , - * / <br />
日期 1-31 , - * ? / L W C <br />
月份 1-12 或者 JAN-DEC , - * / <br />
星期 1-7 或者 SUN-SAT , - * ? / L C # <br />
年（可选） 留空, 1970-2099 , - * / <br />
表达式意义 <br />
"0 0 12 * * ?" 每天中午12点触发 <br />
"0 15 10 ? * *" 每天上午10:15触发 <br />
"0 15 10 * * ?" 每天上午10:15触发 <br />
"0 15 10 * * ? *" 每天上午10:15触发 <br />
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发 <br />
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 <br />
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 <br />
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 <br />
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 <br />
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 <br />
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 <br />
"0 15 10 15 * ?" 每月15日上午10:15触发 <br />
"0 15 10 L * ?" 每月最后一日的上午10:15触发 <br />
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 <br />
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 <br />
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 <br />
每天早上6点 <br />
0 6 * * * <br />
每两个小时 <br />
0 */2 * * * <br />
晚上11点到早上8点之间每两个小时，早上八点 <br />
0 23-7/2，8 * * * <br />
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点 <br />
0 11 4 * 1-3 <br />
1月1日早上4点 <br />
0 4 1 1 *<br />
</p>
<p>quartz的高级特性不仅如此 <br />
1 数据库存储 <br />
2 集群支持 <br />
3 数据库持久化任务，trigger <br />
4 trigger 的停止，运行 <br />
5 任务的任意添加 <br />
6 比corntrigger 更详尽的任务安排 <br />
7 线程的内部数据交换</p>
<img src ="http://www.blogjava.net/libin2722/aggbug/201177.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/libin2722/" target="_blank">礼物</a> 2008-05-17 23:29 <a href="http://www.blogjava.net/libin2722/articles/201177.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>