﻿<?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-All in Blending-文章分类-J2EE相关</title><link>http://www.blogjava.net/javaniu/category/13625.html</link><description>Blending</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:31:46 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:31:46 GMT</pubDate><ttl>60</ttl><item><title>如何使用Timer Service</title><link>http://www.blogjava.net/javaniu/articles/60996.html</link><dc:creator>Gary Niu</dc:creator><author>Gary Niu</author><pubDate>Mon, 31 Jul 2006 05:13:00 GMT</pubDate><guid>http://www.blogjava.net/javaniu/articles/60996.html</guid><wfw:comment>http://www.blogjava.net/javaniu/comments/60996.html</wfw:comment><comments>http://www.blogjava.net/javaniu/articles/60996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaniu/comments/commentRss/60996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaniu/services/trackbacks/60996.html</trackback:ping><description><![CDATA[
		<p align="center">
				<span>
						<font size="4">　　</font>
						<font size="4">
								<strong>如何使用Timer Service<br /></strong>            作者：牛秀元</font>
						<br />
						<br />
						<br />         WebLogic Server</span>
				<span style="FONT-FAMILY: 宋体">包含了</span>
				<span>Timer Service</span>
				<span style="FONT-FAMILY: 宋体">功能，你可以指定某一时刻或某一时间间隔产生</span>
				<span>Timer</span>
				<span style="FONT-FAMILY: 宋体">事件，同时你可以使用委托代理的机制，为这个事件注册事件监听器，以实现</span>
				<span>Timer Service</span>
				<span style="FONT-FAMILY: 宋体">功能。</span>
		</p>
		<p>
				<span>　　</span>
				<span style="FONT-FAMILY: 宋体">从</span>
				<span>WebLogic Server 7.0</span>
				<span style="FONT-FAMILY: 宋体">以后的版本，</span>
				<span>WebLogic Timer Service</span>
				<span style="FONT-FAMILY: 宋体">扩展自标准的</span>
				<span>JMX Timer Service</span>
				<span style="FONT-FAMILY: 宋体">，使其可以运行于</span>
				<span>WebLogic Server</span>
				<span style="FONT-FAMILY: 宋体">的执行线程中，并且享有</span>
				<span>WebLogic Server</span>
				<span style="FONT-FAMILY: 宋体">的安全上下文环境，也就是说，可以在代码中得到安全信息，如用户名等。下面结合一个实例演示其功能。</span>
		</p>
		<p>
				<span>File:TimerServiceListener.java</span>
		</p>
		<p>
				<span>package org.yekki.weblogic.timer;</span>
		</p>
		<p>
				<span>import java.util.Date;</span>
		</p>
		<p>
				<span>import java.util.Random;</span>
		</p>
		<p>
				<span>import javax.jms.JMSException;</span>
		</p>
		<p>
				<span>import javax.jms.Queue;</span>
		</p>
		<p>
				<span>import javax.jms.QueueConnection;</span>
		</p>
		<p>
				<span>import javax.jms.QueueConnectionFactory;</span>
		</p>
		<p>
				<span>import javax.jms.QueueSender;</span>
		</p>
		<p>
				<span>import javax.jms.QueueSession;</span>
		</p>
		<p>
				<span>import javax.jms.Session;</span>
		</p>
		<p>
				<span>import javax.jms.TextMessage;</span>
		</p>
		<p>
				<span>import javax.management.InstanceNotFoundException;</span>
		</p>
		<p>
				<span>import javax.management.Notification;</span>
		</p>
		<p>
				<span>import javax.management.NotificationListener;</span>
		</p>
		<p>
				<span>import javax.naming.Context;</span>
		</p>
		<p>
				<span>import javax.naming.InitialContext;</span>
		</p>
		<p>
				<span>import javax.servlet.ServletContext;</span>
		</p>
		<p>
				<span>import javax.servlet.ServletContextEvent;</span>
		</p>
		<p>
				<span>import javax.servlet.ServletContextListener;</span>
		</p>
		<p>
				<span>import org.apache.ecs.xml.XML;</span>
		</p>
		<p>
				<span>import weblogic.management.timer.Timer;</span>
		</p>
		<p>
				<span>public class TimerServiceListener</span>
		</p>
		<p>
				<span>       </span>implements ServletContextListener, NotificationListener {</p>
		<p>
				<span>       </span>private long period;</p>
		<p>
				<span>       </span>private boolean debug;</p>
		<p>
				<span>       </span>
				<span lang="DA">private Timer timer;</span>
		</p>
		<p>
				<span>       </span>private Integer notificationId;</p>
		<p>
				<span>       </span>
				<span>private QueueConnectionFactory factory;</span>
		</p>
		<p>
				<span>       </span>private QueueConnection connection;</p>
		<p>
				<span>       </span>private QueueSession session;</p>
		<p>
				<span>       </span>private QueueSender sender;</p>
		<p>
				<span>       </span>private Queue queue;</p>
		<p>
				<span>       </span>private Context ctx;</p>
		<p>
				<span>       </span>public void contextInitialized(ServletContextEvent event) {</p>
		<p>
				<span>       </span>       initParams(event);</p>
		<p>
				<span>       </span>       initJMS();</p>
		<p>
				<span>       </span>       debug("&gt;&gt;&gt; contextInitialized called.");</p>
		<p>
				<span>              </span>timer = new Timer();</p>
		<p>
				<span>       </span>       timer.addNotificationListener(this, null, "Message Broker ");</p>
		<p>
				<span>              </span>Date timerTriggerAt = new Date((new Date()).getTime() + 5000L);</p>
		<p>
				<span>       </span>       notificationId =</p>
		<p>
				<span>              </span>       timer.addNotification(</p>
		<p>
				<span>                     </span>       "Timer Type",</p>
		<p>
				<span>                     </span>       <span lang="DA">"Timer Message",</span></p>
		<p>
				<span>                     </span>       this,</p>
		<p>
				<span>                     </span>       timerTriggerAt,</p>
		<p>
				<span>                     </span>       period);</p>
		<p>
				<span>       </span>       timer.start();</p>
		<p>
				<span>       </span>       debug("&gt;&gt;&gt; timer started.");</p>
		<p>
				<span>       </span>       <span>printBrief();</span></p>
		<p>
				<span>       </span>}</p>
		<p>
				<span>       </span>public void initParams(ServletContextEvent event) {</p>
		<p>
				<span>       </span>       ServletContext ctx = event.getServletContext();</p>
		<p>
				<span>              </span>try {</p>
		<p>
				<span>              </span>       debug = Boolean.valueOf((String)ctx.getInitParameter("debug")).booleanValue();</p>
		<p>
				<span>              </span>}</p>
		<p>
				<span>              </span>catch (Exception e) {</p>
		<p>
				<span>              </span>       debug = false;</p>
		<p>
				<span>              </span>       e.printStackTrace();</p>
		<p>
				<span>              </span>}</p>
		<p>
				<span>              </span>try {</p>
		<p>
				<span>                     </span>/*</p>
		<p>
				<span>                     </span> second:1000L</p>
		<p>
				<span>                     </span> minute:60000L</p>
		<p>
				<span>                     </span> hour:3600000L</p>
		<p>
				<span>                     </span> day:86400000L</p>
		<p>
				<span>                     </span> week:604800000L</p>
		<p>
				<span>                     </span> */</p>
		<p>
				<span>              </span>       period =</p>
		<p>
				<span>                     </span>       Long</p>
		<p>
				<span>                     </span>              .valueOf((String)ctx.getInitParameter("period"))</p>
		<p>
				<span>                     </span>              .longValue();</p>
		<p>
				<span>              </span>}</p>
		<p>
				<span>              </span>catch (Exception e) {</p>
		<p>
				<span>              </span>       period = Timer.ONE_MINUTE;</p>
		<p>
				<span>              </span>       e.printStackTrace();</p>
		<p>
				<span>              </span>}</p>
		<p>
				<span>       </span>       debug("&gt;&gt;&gt; initialized application parameters.");</p>
		<p>
				<span>       </span>}</p>
		<p>
				<span>       </span>private void initJMS() {</p>
		<p>
				<span>              </span>try {</p>
		<p>
				<span>              </span>       ctx = new InitialContext();</p>
		<p>
				<span>              </span>       factory =</p>
		<p>
				<span>                     </span>       (QueueConnectionFactory)ctx.lookup(</p>
		<p>
				<span>                     </span>              "javax.jms.QueueConnectionFactory");</p>
		<p>
				<span>              </span>       queue = (Queue)ctx.lookup("queue");</p>
		<p>
				<span>              </span>       connection = factory.createQueueConnection();</p>
		<p>
				<span>              </span>       session =</p>
		<p>
				<span>                     </span>       connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);</p>
		<p>
				<span>              </span>       sender = session.createSender(queue);</p>
		<p>
				<span>              </span>       connection.start();</p>
		<p>
				<span>              </span>       debug("&gt;&gt;&gt; initialized jms.");</p>
		<p>
				<span>              </span>}</p>
		<p>
				<span>              </span>catch (Exception e) {</p>
		<p>
				<span>              </span>       e.printStackTrace();</p>
		<p>
				<span>              </span>}</p>
		<p>
				<span>       </span>}</p>
		<p>
				<span>       </span>public void sendMessage(String message) {</p>
		<p>
				<span>              </span>try {</p>
		<p>
				<span>              </span>       TextMessage msg = session.createTextMessage();</p>
		<p>
				<span>              </span>       <span lang="DA">msg.setText(message);</span></p>
		<p>
				<span>              </span>       sender.send(msg);</p>
		<p>
				<span>              </span>       <span>debug("&gt;&gt;&gt; ################################");</span></p>
		<p>
				<span>              </span>       debug("Send a message on " + new Date());</p>
		<p>
				<span>              </span>       debug(message);</p>
		<p>
				<span>              </span>       debug("&gt;&gt;&gt; ################################");</p>
		<p>
				<span>              </span>}</p>
		<p>
				<span>              </span>catch (JMSException e) {</p>
		<p>
				<span>              </span>       e.printStackTrace();</p>
		<p>
				<span>              </span>}</p>
		<p>
				<span>       </span>}</p>
		<p>
				<span>       </span>public void contextDestroyed(ServletContextEvent event) {</p>
		<p>
				<span>       </span>       debug("&gt;&gt;&gt; contextDestroyed called.");</p>
		<p>
				<span>              </span>try {</p>
		<p>
				<span>              </span>       timer.stop();</p>
		<p>
				<span>              </span>       timer.removeNotification(notificationId);</p>
		<p>
				<span>              </span>       debug("&gt;&gt;&gt; timer stopped.");</p>
		<p>
				<span>              </span>}</p>
		<p>
				<span>              </span>catch (InstanceNotFoundException e) {</p>
		<p>
				<span>              </span>       e.printStackTrace();</p>
		<p>
				<span>              </span>}</p>
		<p>
				<span>              </span>try {</p>
		<p>
				<span>                     </span>if (session != null)</p>
		<p>
				<span>                     </span>       session.close();</p>
		<p>
				<span>                     </span>if (connection != null)</p>
		<p>
				<span>                     </span>       connection.close();</p>
		<p>
				<span>              </span>       debug("&gt;&gt;&gt; closed jms connection and session.");</p>
		<p>
				<span>              </span>}</p>
		<p>
				<span>              </span>catch (JMSException e) {</p>
		<p>
				<span>              </span>       e.printStackTrace();</p>
		<p>
				<span>              </span>}</p>
		<p>
				<span>       </span>}</p>
		<p>
				<span>       </span>private void printBrief() {</p>
		<p>
				<span>              </span>String d = "";</p>
		<p>
				<span>              </span>d = debug ? "ON" : "OFF";</p>
		<p>
				<span>       </span>       print("&gt;&gt;&gt; ################################");</p>
		<p>
				<span>       </span>       print("&gt;&gt;&gt; Author: Niu Xiuyuan");</p>
		<p>
				<span>       </span>       print("&gt;&gt;&gt; EMail: niuxiuyuan@bea.com.cn");</p>
		<p>
				<span>       </span>       print("&gt;&gt;&gt; Company: BEA Systems");</p>
		<p>
				<span>       </span>       print("");</p>
		<p>
				<span>       </span>       print("&gt;&gt;&gt; Debug: " + d);</p>
		<p>
				<span>       </span>       print("&gt;&gt;&gt; Period: " + getPeriodInfo(period));</p>
		<p>
				<span>       </span>       print("&gt;&gt;&gt; ################################");</p>
		<p>
				<span>       </span>}</p>
		<p>
				<span>       </span>private void print(String str) {</p>
		<p>
				<span>       </span>       System.out.println(str);</p>
		<p>
				<span>       </span>}</p>
		<p>
				<span>       </span>private String getPeriodInfo(long p) {</p>
		<p>
				<span>              </span>if (p == Timer.ONE_DAY)</p>
		<p>
				<span>              </span>       return "One Day";</p>
		<p>
				<span>              </span>if (p == Timer.ONE_HOUR)</p>
		<p>
				<span>              </span>       return "One Hour";</p>
		<p>
				<span>              </span>if (p == Timer.ONE_MINUTE)</p>
		<p>
				<span>              </span>       return "One Minute";</p>
		<p>
				<span>              </span>if (p == Timer.ONE_SECOND)</p>
		<p>
				<span>              </span>       return "One Second";</p>
		<p>
				<span>              </span>if (p == Timer.ONE_WEEK)</p>
		<p>
				<span>              </span>       return "One Week";</p>
		<p>
				<span>              </span>return "Unsupported time period!! period=" + p;</p>
		<p>
				<span>       </span>}</p>
		<p>
				<span>       </span>public void handleNotification(Notification notif, Object handback) {</p>
		<p>
				<span>       </span>       Random rnd = new Random();</p>
		<p>
				<span>       </span>       sendMessage(genXML(rnd.nextInt(10)));</p>
		<p>
				<span>       </span>}</p>
		<p>
				<span>       </span>public String genXML(int id) {</p>
		<p>
				<span>              </span>String username = "guru";</p>
		<p>
				<span>              </span>String password = "niu986";</p>
		<p>
				<span>              </span>XML usernameXML = null;</p>
		<p>
				<span>              </span>XML idXML = null;</p>
		<p>
				<span>              </span>XML passwordXML = null;</p>
		<p>
				<span>              </span>XML userXML = null;</p>
		<p>
				<span>              </span>XML profileXML = new XML("profiles");</p>
		<p>
				<span>              </span>
				<span lang="DA">for (int i = 1; i &lt;= id; i++) {</span>
		</p>
		<p>
				<span>              </span>       <span>usernameXML = (new XML("user")).addElement(username);</span></p>
		<p>
				<span>              </span>       idXML = (new XML("id")).addElement(Integer.toString(id));</p>
		<p>
				<span>              </span>       passwordXML = (new XML("password")).addElement(password);</p>
		<p>
				<span>              </span>       userXML =</p>
		<p>
				<span>                     </span>       (new XML("user"))</p>
		<p>
				<span>                     </span>              .addXMLAttribute("age", "27")</p>
		<p>
				<span>                     </span>              .addElement(idXML)</p>
		<p>
				<span>                     </span>              .addElement(usernameXML)</p>
		<p>
				<span>                     </span>              .addElement(passwordXML);</p>
		<p>
				<span>              </span>       profileXML.addElement(userXML);</p>
		<p>
				<span>              </span>}</p>
		<p>
				<span>              </span>return profileXML.toString();</p>
		<p>
				<span>       </span>
				<span lang="DA">}</span>
		</p>
		<p>
				<span>       </span>private void debug(String msg) {</p>
		<p>
				<span>              </span>
				<span>if (debug) {</span>
		</p>
		<p>
				<span>              </span>       System.out.println(msg);</p>
		<p>
				<span>              </span>}</p>
		<p>
				<span>       </span>}</p>
		<p>
				<span>       </span>public static void main(String[] args) {</p>
		<p>
				<span>       </span>}</p>
		<p>
				<span>}</span>
		</p>
		<p>
				<span style="FONT-FAMILY: 宋体">
						<span>　　</span>说明：为了方便演示，此类中包含了事件产生器代码与事件监听器代码。使用</span>
				<span>ServletContextListener</span>
				<span style="FONT-FAMILY: 宋体">接口来控制</span>
				<span>Timer</span>
				<span style="FONT-FAMILY: 宋体">的启动与停止。</span>
		</p>
		<p>
				<span>File:web.xml</span>
		</p>
		<p>
				<span>&lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"&gt;</span>
		</p>
		<p>
				<span>&lt;web-app&gt;</span>
		</p>
		<p>
				<span>  </span>&lt;context-param&gt;</p>
		<p>
				<span>    </span>&lt;param-name&gt;debug&lt;/param-name&gt;</p>
		<p>
				<span>    </span>&lt;param-value&gt;false&lt;/param-value&gt;</p>
		<p>
				<span>  </span>&lt;/context-param&gt;</p>
		<p>
				<span>  </span>&lt;context-param&gt;</p>
		<p>
				<span>    </span>&lt;param-name&gt;period&lt;/param-name&gt;</p>
		<p>
				<span>    </span>&lt;param-value&gt;60000&lt;/param-value&gt;</p>
		<p>
				<span>  </span>&lt;/context-param&gt;</p>
		<p>
				<span>  </span>&lt;listener&gt;</p>
		<p>
				<span>    </span>&lt;listener-class&gt;org.yekki.weblogic.timer.TimerServiceListener&lt;/listener-class&gt;</p>
		<p>
				<span>  </span>&lt;/listener&gt;</p>
		<p>
				<span>  </span>&lt;login-config&gt;</p>
		<p>
				<span>    </span>&lt;auth-method&gt;&lt;/auth-method&gt;</p>
		<p>
				<span>  </span>&lt;/login-config&gt;</p>
		<p>
				<span>&lt;/web-app&gt;</span>
		</p>
		<p>
				<span style="FONT-FAMILY: 宋体">
						<span>　　</span>说明：我们将</span>
				<span>webapp</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span>Lisener</span>
				<span style="FONT-FAMILY: 宋体">注册，并且指定事件产生的时间间隔</span>
		</p>
		<p>
				<span>    </span>
				<span style="FONT-FAMILY: 宋体">将此</span>
				<span>WebApp</span>
				<span style="FONT-FAMILY: 宋体">部署到</span>
				<span>WebLogic Server</span>
				<span style="FONT-FAMILY: 宋体">上，然后通过中端（例如：</span>
				<span>DOS</span>
				<span style="FONT-FAMILY: 宋体">窗口）查看实验结果。</span>
		</p>
		<p>
				<span style="FONT-FAMILY: 宋体">
						<span>　　</span>附：本例中使用了</span>
				<span>Apache</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span>ECS</span>
				<span style="FONT-FAMILY: 宋体">项目类库，您可以访问如下</span>
				<span>URL:</span>
		</p>
		<p>
				<span>
						<span>　　</span>http://jakarta.apache.org/ecs/index.html<br /></span>
		</p>
		<!--文章其他信息-->
<img src ="http://www.blogjava.net/javaniu/aggbug/60996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaniu/" target="_blank">Gary Niu</a> 2006-07-31 13:13 <a href="http://www.blogjava.net/javaniu/articles/60996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>