﻿<?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-Apusic初学者园地</title><link>http://www.blogjava.net/zhuyuanxiang/</link><description>主要是记录工作心得以便未来可以参考，也希望可以帮助喜欢Apusic和J2EE的朋友。</description><language>zh-cn</language><lastBuildDate>Sat, 06 Sep 2008 23:02:00 GMT</lastBuildDate><pubDate>Sat, 06 Sep 2008 23:02:00 GMT</pubDate><ttl>60</ttl><item><title>Apusic上用JavaMail发邮件</title><link>http://www.blogjava.net/zhuyuanxiang/archive/2008/09/04/226888.html</link><dc:creator>朱远翔-Apusic技术顾问</dc:creator><author>朱远翔-Apusic技术顾问</author><pubDate>Thu, 04 Sep 2008 04:11:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyuanxiang/archive/2008/09/04/226888.html</guid><wfw:comment>http://www.blogjava.net/zhuyuanxiang/comments/226888.html</wfw:comment><comments>http://www.blogjava.net/zhuyuanxiang/archive/2008/09/04/226888.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyuanxiang/comments/commentRss/226888.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyuanxiang/services/trackbacks/226888.html</trackback:ping><description><![CDATA[<p>0. JavaMail基本介绍<br /> JavaMail是属于J2EE框架中的一部分，主要是为简化Mail部分开发工作。使用JavaMail发送邮件需要以下步骤：<br /> 1）初始化Session实例；<br /> 在初始化Session实例中有两种方式：使用JNDI初始化和在代码中自行完成初始化。<br /> 2）初始化Message实例，填充相关信息；<br /> 3）初始化Transport实例，连接到远程SMTP服务器，发送邮件。<br /> 在初始化Transport实例时也有两种情况：<br /> ★ 如果SMTP不需要认证，可以直接调用send()函数发送邮件，调用connect()函数将会在后台进行；<br /> ★ 如果SMTP需要认证，需要调用connect()函数，并提供认证需要的用户名／密码，才可以正确发送邮件。<br /> <br />1. javax.mail.Session的初始化<br />1.1. 使用JNDI初始化(配置JavaMail的JNDI)<br />在Apusic的J2EE应用中找到apusic-application.xml文件，增加&lt;mail-session&gt;部分，示例如下：<br />&lt;apusic-application&gt;<br /> &lt;module uri="web.war"&gt;<br />  &lt;web /&gt;<br /> &lt;/module&gt;<br /> &lt;mail-session&gt;<br />  &lt;jndi-name&gt;javamail/myMail&lt;/jndi-name&gt;<br />  &lt;property name="mail.transport.protocol" value="smtp" /&gt;<br />  &lt;property name="mail.smtp.host" value="smtp.163.com" /&gt;<br />  &lt;property name="mail.smtp.user" value="user" /&gt;<br />  &lt;property name="mail.smtp.password" value="password" /&gt;<br />  &lt;property name="mail.smtp.auth" value="true" /&gt;<br />  &lt;property name="mail.from" value="<a href="mailto:user@163.com">user@163.com</a>" /&gt;<br /> &lt;/mail-session&gt;<br />&lt;/apusic-application&gt;</p>
		<p>1.1.1. 通过JNDI找到JavaMail<br />1.1.1.1. 使用远程访问获得JavaMail<br /> Hashtable env=new Hashtable();<br /> env.put(Context.INITIAL_CONTEXT_FACTORY,"com.apusic.naming.jndi.CNContextFactory");<br /> env.put(Context.PROVIDER_URL,"iiop://localhost:6888");<br /> //插入相关验证信息<br /> env.put(Context.SECURITY_CREDENTIALS,"admin" ) ;<br /> env.put(Context.SECURITY_PRINCIPAL,"admin");<br /> Context initCtx=new InitialContext(env);<br /> System.out.println(initCtx.PROVIDER_URL);<br /> //通过RMI 取得<br /> Session myMailSession = (Session) initCtx.lookup("javamail/myMailNoAuth");<br />1.1.1.2. 使用Apusic默认方式获得JavaMail<br /> Context initCtx = new InitialContext();<br /> Session myMailSession = (Session) initCtx.lookup("javamail/myMailNoAuth");<br /> System.out.println(myMailSession.getProperty("mail.smtp.host"));<br /> <br />1.1.2. 通过资源注入配置JavaMail<br /> @Resource(mappedName = "javamail/myMailAuth", type = javax.mail.Session.class, shareable = true, authenticationType = Resource.AuthenticationType.CONTAINER, description = "my email with auth")<br /> private Session myAuthMailSession;<br />或者<br /> @Resource(mappedName = "javamail/myMailAuth")<br /> private Session myAuthMailSession;</p>
		<p>1.2. 在代码中初始化<br />1.2.1. 无须认证的初始化<br /> final Properties props = new Properties();<br /> props.put("mail.transport.protocol", "smtp");<br /> props.put("mail.smtp.auth", "false");<br /> props.put("mail.smtp.host", "localhost");<br /> Session myMailSession = Session.getInstance(props);<br />1.2.2. 需要认证的初始化<br /> final Properties props = new Properties();<br /> props.put("mail.transport.protocol", "smtp");<br /> props.put("mail.smtp.auth", "true");<br /> props.put("mail.smtp.host", "smtp.163.com");<br /> Session myMailSession = Session.getInstance(props, new Authenticator() {<br />  public PasswordAuthentication getPasswordAuthentication() {<br />   return new PasswordAuthentication("user", "password");} });</p>
		<p>1.4. 对Session调试的配置<br />● 可以在mail-session中加入&lt;property name="mail.debug" value="true" /&gt;<br />● 可以在Session初始化前加入props.put("mail.debug", "true");<br />● 可以在Session初始化后,通过代码控制myMailSession.setDebug(true);</p>
		<p>1.5. Properties的解释<br />◆ mail.store.protocol：用于检索邮件的协议<br />◆ mail.transport.protocol：用于传送邮件的协议<br />◆ mail.host：默认的主机名，默认是本地计算机。<br />◆ mail.user：默认的用户名。<br />◆ mail.from：默认的返回地址。<br />◆ mail.debug：是否输出DEBUG信息。默认为False。<br />◆ mail.protocol.host：指定协议的主机名，没有指定就用mail.host。例如：mail.smtp.host=smtp.163.com<br />◆ mail.protocol.user：指定协议的用户名，没有指定就用mail.user。例如：mail.smtp.user=user<br />◆ mail.protocol.from：指定协议的返回地址，没有指定就用mail.from。例如：<a href="mailto:mail.smtp.from=user@163.com">mail.smtp.from=user@163.com</a><br />◆ mail.smtp.auth：如果是True，就会登录SMTP服务器，获得授权才能发送邮件。默认为False。</p>
		<p>
				<br />2. 通过JavaMail发送邮件<br />2.1. 通过无须认证的SMTP发邮件<br />  final Properties props = new Properties();<br />  props.put("mail.transport.protocol", "smtp");<br />  props.put("mail.smtp.auth", "false");<br />  props.put("mail.smtp.host", "localhost");<br />  try {<br />   Session myMailSession = Session.getInstance(props);<br />   myMailSession.setDebug(true); // 打开DEBUG模式<br />   Message msg = new MimeMessage(myMailSession);<br />   msg.setFrom(new InternetAddress("<a href="mailto:user@163.com">user@163.com</a>"));<br />   msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("<a href="mailto:zhuyuanxiang@apusic.com">zhuyuanxiang@apusic.com</a>"));<br />   msg.setContent("I have a email test!", "text/plain");<br />   msg.setSentDate(new java.util.Date());<br />   msg.setSubject("Test");<br />   msg.setText("This is a test!\n");<br />   System.out.println("1.Please wait for sending one...");</p>
		<p>   // 发送邮件<br />   // javax.mail.Transport.send(msg); // 与下面四行的功能一样<br />   javax.mail.Transport myTransport = myMailSession.getTransport("smtp");<br />   myTransport.connect();<br />   myTransport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));<br />   myTransport.close();<br />   <br />   System.out.println("2.Your message had send!");<br />  } catch (Exception error) {<br />   System.out.println("*.I am sorry to tell you the fail for " + error);<br />  }</p>
		<p>注：测试可以使用Microsft IIS SMTP 服务，安装好启动服务后，还需要进入“IIS管理器”，增加一个“远程域”，对于“远程域”的“出站安全性”需要把用户名和密码加上（就是平时发邮件时登录用的用户名／密码），否则邮件发不出去。</p>
		<p>2.2. 通过需要认证的SMTP发邮件<br />2.2.1. 默认方式初始化Session<br />  final Properties props = new Properties();<br />  props.put("mail.transport.protocol", "smtp");<br />  props.put("mail.smtp.auth", "true");</p>
		<p>  try {<br />   Session myMailSession = Session.getInstance(props);<br />   myMailSession.setDebug(true); // 打开DEBUG模式<br />   Message msg = new MimeMessage(myMailSession);<br />   msg.setFrom(new InternetAddress("<a href="mailto:user@163.com">user@163.com</a>"));<br />   msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("<a href="mailto:zhuyuanxiang@apusic.com">zhuyuanxiang@apusic.com</a>"));<br />   msg.setContent("I have a email test!", "text/plain");<br />   msg.setSentDate(new java.util.Date());<br />   msg.setSubject("Test");<br />   msg.setText("This is a test!\n");<br />   System.out.println("1.Please wait for sending two...");</p>
		<p>   // 发送邮件<br />   javax.mail.Transport myTransport = myMailSession.getTransport("smtp");<br />   myTransport.connect("smtp.163.com", "user", "password");<br />   myTransport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));<br />   myTransport.close();<br />   // javax.mail.Transport.send(msg); // 这行不能使用。<br />   System.out.println("2.Your message had send!");<br />  } catch (Exception error) {<br />   System.out.println("*.I am sorry to tell you the fail for " + error);<br />  }<br /> }</p>
		<p>2.2.2. 嵌入认证类初始化Session<br /> final Properties props = new Properties();<br /> props.put("mail.transport.protocol", "smtp");<br /> props.put("mail.smtp.auth", "true");<br /> props.put("mail.smtp.host", "smtp.163.com");</p>
		<p> try {<br />  Session myMailSession = Session.getInstance(props, new Authenticator() {<br />   public PasswordAuthentication getPasswordAuthentication() {<br />    return new PasswordAuthentication("user", "password");<br />   }<br />  });<br />  myMailSession.setDebug(true); // 打开DEBUG模式<br />  InternetAddress address = new InternetAddress("<a href="mailto:user@163.com">user@163.com</a>");<br />  String message = "I have a email test!";<br />  Message msg = new MimeMessage(myMailSession);<br />  msg.setFrom(address);<br />  msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("<a href="mailto:zhuyuanxiang@apusic.com">zhuyuanxiang@apusic.com</a>"));<br />  msg.setContent(message, "text/plain");<br />  msg.setSentDate(new java.util.Date());<br />  msg.setSubject("Test");<br />  msg.setText("This is a test!\n");<br />  out.println("1.Please wait for sending...");<br />  <br />  // 发送邮件<br />  javax.mail.Transport myTransport = myMailSession.getTransport("smtp");<br />  myTransport.connect();<br />  myTransport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));<br />  myTransport.close();<br />  // javax.mail.Transport.send(msg); // 注释上四行，打开这行代码，功能一样<br />  out.println("2.Your message had send!");<br /> } catch (Exception error) {<br />  out.println("*.I am sorry to tell you the fail for " + error);<br /> }</p>
		<p>注：资源注入的Session发送邮件时：<br />无须认证的SMTP，可以参考2.1.<br />需要认证的SMTP，可以参考2.2.1.</p>
		<p>参考：<br /><a href="http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html">http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html</a><br /><a href="http://commons.apache.org/email/userguide.html">http://commons.apache.org/email/userguide.html</a><br /><a href="/Unmi/archive/2007/06/07/124179.html">http://www.blogjava.net/Unmi/archive/2007/06/07/124179.html</a><br /><a href="http://unmi.blogcn.com/diary,117630488.shtml">http://unmi.blogcn.com/diary,117630488.shtml</a><br /></p>
		<p>
				<a title="金蝶中间件" href="http://www.apusic.com" target="_blank">Apusic</a> Stduio打包的示例工程。<a href="http://zhuyuanxiang.javaeye.com/topics/download/d6f5c3a9-9cd9-30be-9b64-9e311900b304"><br />http://zhuyuanxiang.javaeye.com/topics/download/d6f5c3a9-9cd9-30be-9b64-9e311900b304</a><br /><br />备注：本文耗时1周完成。</p><img src ="http://www.blogjava.net/zhuyuanxiang/aggbug/226888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyuanxiang/" target="_blank">朱远翔-Apusic技术顾问</a> 2008-09-04 12:11 <a href="http://www.blogjava.net/zhuyuanxiang/archive/2008/09/04/226888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Tomcat上开发Web应用如何保证兼容性</title><link>http://www.blogjava.net/zhuyuanxiang/archive/2008/08/14/221866.html</link><dc:creator>朱远翔-Apusic技术顾问</dc:creator><author>朱远翔-Apusic技术顾问</author><pubDate>Wed, 13 Aug 2008 23:42:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyuanxiang/archive/2008/08/14/221866.html</guid><wfw:comment>http://www.blogjava.net/zhuyuanxiang/comments/221866.html</wfw:comment><comments>http://www.blogjava.net/zhuyuanxiang/archive/2008/08/14/221866.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyuanxiang/comments/commentRss/221866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyuanxiang/services/trackbacks/221866.html</trackback:ping><description><![CDATA[最近，协助伙伴将Tomcat上开发的应用向Apusic移植时发现了一个兼容性问题。<br />应用中代码为：HashMap params = (HashMap) request.getParameterMap();<br /><br />而getParameterMap()在JCP规范中的定义为：<br />public java.util.Map getParameterMap()<br />Returns a java.util.Map of the parameters of this request. Request parameters are extra information sent with the request. For HTTP servlets, parameters are contained in the query string or posted form data.<br />请求的参数将返回一个java.util.Map。请求参数是请求发送的特别信息。对于HTTP servlets来说，参数包含在查询字符串或者发出的表单数据中。<br /><br />Returns: an immutable java.util.Map containing parameter names as keys and parameter values as map values. The keys in the parameter map are of type String. The values in the parameter map are of type String array.<br />一个不可更改的java.util.Map包含参数名称（关键字）和参数值（映射值）。参数映射中的关键字是String类型。参数映射中的值是String数组类型。<br /><br />可见规范中定义的返回值只是Map类型，而没有强制为HashMap。<br />Apusic在实现的时候也是Map作为返回值，而Tomcat返回时（参考org.apache.catalina.connector.Request.java）就是一个扩展自HashMap的ParameterMap类，因此开发时如何作为Map来用也不会出现问题，但是如果强制转换成HashMap就可能会与其他应用服务器产品无法正确兼容。<br /><br />Tomcat是一款非常不错的开源Web服务器，许多公司在软件开发时都使用Tomcat作为Web容器，并且Tomcat也较好的对Servlet和JSP规范进行了支持，因此许多在Tomcat上开发的应用都可以向其他商业应用服务器上进行移植。<br /><br />但是，Tomcat因为未去通过规范测试，因此可能会存在没有完全参考规范实现的部分，因此在开发中建议开发人员去<a href="http://www.jcp.org">www.jcp.org</a>上去下载一个规范来进行参考，开发过程中尽可能按照规范给定的参数和返回值来使用系统的核心功能，从而避免在移植中出现不必要的问题。<br /><br />附注：出现问题也不可怕，总有许多方式可以解决，就如上文出现的Map与HashMap的问题。其实网上有许多Map向HashMap转换的代码，可以增加个过渡参数将得到的Map进行一次转换就可以不修改其他业务代码了。<img src ="http://www.blogjava.net/zhuyuanxiang/aggbug/221866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyuanxiang/" target="_blank">朱远翔-Apusic技术顾问</a> 2008-08-14 07:42 <a href="http://www.blogjava.net/zhuyuanxiang/archive/2008/08/14/221866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apusic Operamasks的资源注入</title><link>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/30/218865.html</link><dc:creator>朱远翔-Apusic技术顾问</dc:creator><author>朱远翔-Apusic技术顾问</author><pubDate>Wed, 30 Jul 2008 15:58:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/30/218865.html</guid><wfw:comment>http://www.blogjava.net/zhuyuanxiang/comments/218865.html</wfw:comment><comments>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/30/218865.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyuanxiang/comments/commentRss/218865.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyuanxiang/services/trackbacks/218865.html</trackback:ping><description><![CDATA[<p>★ 什么是资源？<br />开发过程中与业务无关的服务、类的实例或者变量的值。比如：Apusic J2EE应用服务器管理的JDBC服务是资源，用户开发的EJB、WebService是资源、用户定义的配置文件也是资源。</p>
		<p>
				<br />★ 为什么要资源注入？<br />大多数企业级java应用程序都使用了诸如DataSources,EJBs或WebService的外在的资源和服务，在J2EE 1.4中，用户必须在部署描述符中明确声明所依赖的资源或者使用JNDI的lookup方法去获得资源的引用。</p>
		<p>最初目的是为了减少应用与资源的依赖度，具体可以参考IoC（控制反转）和DI（依赖注入），但现在作者认为优点很多：<br />1. 减少应用与资源的依赖度，便于应用的后期组装。例如：将数据库连接池在后期组装时作为资源注入到系统中，这样使应用在开发过程中不会与资源绑定。<br />2. 简化应用的复杂度，使程序员开发中更多关注业务。例如：通过标注将资源在变量定义的时候注入进去，开发人员直接可以使用变量，而无须再通过代码获得。<br />3. 规范应用的开发过程，提升应用后期运行的稳定性。例如：通过注入的方式使用资源，而无须在开发期管理资源的生命周期以及创建与销毁，避免出现重复创建或者内存泄漏。</p>
		<p>★ 哪些资源可以注入？<br />数据源、JMS目的地、环境变量、EJB、WebService、上下文资源、Managed Bean、Spring Bean、LocalString</p>
		<p>★ 如何注入和使用资源？<br /> // Apusic系统日志，采用的是JDK 1.4的日志系统<br /> @Inject<br /> private java.util.logging.Logger logger;<br /> public void IndexBean() {<br />  logger.info("初始化IndexBean!");<br /> }</p>
		<p>    // JavaServer Faces的相关资源<br /> // JSF的FacesContext<br /> @Inject<br /> private javax.faces.context.FacesContext fContext;<br />    // 获取应用的HttpRequest<br />    HttpServletRequest request=(HttpServletRequest)fContext.getCurrentInstance().getExternalContext().getRequest();<br />    // 获取应用的HttpResponse<br />    HttpServletResponse request=(HttpServletResponse)fContext.getCurrentInstance().getExternalContext().getResponse();<br />    // 获取应用的HttpSession<br />    HttpSession session=(HttpSession) fContext.getCurrentInstance().getExternalContext().getSession(true);<br />    // JSF的服务器实例<br /> @Inject<br /> private javax.faces.application.Application app;<br /> // JSF的导航句柄<br /> @Inject<br /> private javax.faces.application.NavigationHandler nHandler;<br /> // JSF的EL表达式工厂实例<br /> @Inject<br /> private javax.el.ExpressionFactory expFactory;<br /> // JSF的事件广播者实例<br /> @Inject<br /> private org.operamasks.faces.event.EventBroadcaster event;<br /> // 相同生命周期的ManagedBean，参考CRUD例子<br /> @Inject<br /> private IndexBean indexBean;</p>
		<p> // JNDI资源注入<br /> // 数据库连接池资源注入<br /> @Resource(mappedName = "jdbc/CRUD")<br /> private javax.sql.DataSource CRUD;<br />   Connection con = CRUD.getConnection();<br /> // 消息工厂资源注入<br /> @Resource(mappedName="jms/ConnectionFactory")<br /> private javax.jms.ConnectionFactory connFactory;<br /> // 消息主题资源注入<br /> @Resource(mappedName="testTopic")<br /> private javax.jms.Topic topic;<br /> // 消息队列资源注入<br /> @Resource(mappedName="testQueue")<br /> private javax.jms.Queue queue;<br /> // 事务服务资源注入，一个线程只提供一个事务服务，因此不需要提供名称直接可以注入<br /> @Resource<br /> private javax.transaction.UserTransaction tx;<br /> <br /> // EJB资源注入<br /> @EJB(name="com.apusic.examples.crud.second.service.PersonService")<br /> IPersonService personService;<br /> <br /> // 资源文件的注入，注意：只能注入前缀为LocalStrings的文件组<br /> @LocalString<br /> private Map&lt;String, String&gt; messages;<br /> messages.get("WindowBean.email.required");<br /> <br />    // 配置文件注入上下文资源<br />    在faces-config.xml中在需要注入的bean中加入managed-property属性和值<br /> &lt;managed-bean&gt;<br />  &lt;managed-bean-name&gt;windowBean&lt;/managed-bean-name&gt;<br />  &lt;managed-bean-class&gt;<br />   com.apusic.examples.crud.second.bean.WindowBean<br />  &lt;/managed-bean-class&gt;<br />  &lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />  &lt;managed-property&gt;<br />   &lt;property-name&gt;injectName&lt;/property-name&gt;<br />   &lt;property-class&gt;java.lang.String&lt;/property-class&gt;<br />   &lt;value&gt;Operamasks&lt;/value&gt;<br />  &lt;/managed-property&gt;<br /> &lt;/managed-bean&gt;<br /> 在WindowBean.java中直接定义<br /> private String injectName;<br /> public void setInjectName(String injectName) { // 通过这个函数提供资源注入<br />  this.injectName = injectName;<br /> }<br />★ 参考资料<br /><a href="http://www.matrix.org.cn/resource/article/2006-04-05/Dependency+Injection_44321.html">http://www.matrix.org.cn/resource/article/2006-04-05/Dependency+Injection_44321.html</a></p>
		<p>★ 备注<br />本文现在只介绍了基础资源注入知识，随着作者本人对资源注入的理解，将会继续补充与完善。</p><img src ="http://www.blogjava.net/zhuyuanxiang/aggbug/218865.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyuanxiang/" target="_blank">朱远翔-Apusic技术顾问</a> 2008-07-30 23:58 <a href="http://www.blogjava.net/zhuyuanxiang/archive/2008/07/30/218865.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring ImageDB在Apusic上部署</title><link>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/19/216040.html</link><dc:creator>朱远翔-Apusic技术顾问</dc:creator><author>朱远翔-Apusic技术顾问</author><pubDate>Sat, 19 Jul 2008 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/19/216040.html</guid><wfw:comment>http://www.blogjava.net/zhuyuanxiang/comments/216040.html</wfw:comment><comments>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/19/216040.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyuanxiang/comments/commentRss/216040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyuanxiang/services/trackbacks/216040.html</trackback:ping><description><![CDATA[<p>
				<strong>目标：<br /></strong>Spring的ImageDB例子在Apusic V5.1上部署</p>
		<p>
				<strong>术语：</strong>
				<br /><a title="金蝶中间件" href="http://www.apusic.com" target="_blank">Apusic</a>：提供了完整的J2EE支持的商用服务器；<br />Spring：开源框架，是其他各种框架的粘合剂；<br />Oracle：著名的商业关系数据库系统；<br />MySQL：著名的开源关系数据库系统；<br />%APUSIC_HOME%：Apusic安装目录；<br />%JAVA_HOME%：JDK安装目录。</p>
		<p>
				<strong>准备：</strong>
				<br />在<a href="http://java.sun.com">http://java.sun.com</a>下载JDK V1.5以上的版本并安装，确认JAVA_HOME正确指向装好的JDK目录；<br />在<a href="http://www.apusic.com">http://www.apusic.com</a>下载Apusic V5.1以上的版本并安装；<br />在<a href="http://www.springframework.org/download">http://www.springframework.org/download</a>上下载spring-framework-2.0.6-with-dependencies.zip（不过很遗憾，最近国内用户好像无法从sourceforge.net上下载东西，大家通过Google找找其他镜像网站吧）并解压缩到%APUSIC_HOME%/temp目录下；<br />在<a href="http://downloads.mysql.com/archives.php">http://downloads.mysql.com/archives.php</a>上下载MySQL Database V5.1并安装，下载MySQL Connector/J 3.1.14并解压缩到%APUSIC_HOME%/temp目录下。<br /><br /><strong>过程：<br /></strong>1. 执行%APUSIC_HOME%/domains/mydomain/bin/startapusic.cmd，访问主页：<a href="http://localhost:6888/">http://localhost:6888/</a>，确认Apusic已经成功安装，在窗口模式下按Ctrl+C停止服务器（记住因为是批处理还需要按Y确认）；<br />2. 安装MySQL数据库服务器，然后执行MySQL Query Browser，确认数据库正确安装、启动并可以连接使用；<br />3. 在%APUSIC_HOME%/temp/samples/imagedb/db目录下找到mysql-schema.txt文件，将这个文件中的脚本放到MySQL Query Browser中执行，创建新表imagedb；<br />4. 在%APUSIC_HOME%/temp/samples/imagedb/war/WEB-INF目录下找到jdbc.properties文件，打开并修改与JDBC相关的配置文件(注意配置正确的数据库名和用户名／)；<br /> jdbc.driverClassName=com.mysql.jdbc.Driver<br /> jdbc.url=jdbc:mysql://localhost:3306/mysql<br /> jdbc.username=root<br /> jdbc.password=password<br /> imageDatabase.lobHandler=defaultLobHandler<br />5. 在%APUSIC_HOME%/temp/mysql-connector-java-3.1.14目录下找到mysql-connector-java-3.1.14-bin.jar文件，拷贝到%APUSIC_HOME%/domains/mydomain/lib目录下，为应用提供支持JDBC的访问数据库的JAR包；<br />6. 找到samples/imagedb目录，执行warfile.bat生成dist/imagedb.war文件，将imagedb.war文件拷贝到%APUSIC_HOME%/domains/mydomain/applications/目录下，重新启动Apusic，稍等一会待Apusic自动部署，部署成功；<br />7. 有了前面的准备工作，访问<a href="http://localhost:6888/imagedb/">http://localhost:6888/imagedb/</a>，一切成功。</p>
		<p>
				<strong>备注：<br /></strong>1. 由于Apusic的ClassLoader需要将Spring框架载入，所以第一次启动时有点慢，请稍等一下。</p><img src ="http://www.blogjava.net/zhuyuanxiang/aggbug/216040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyuanxiang/" target="_blank">朱远翔-Apusic技术顾问</a> 2008-07-19 15:30 <a href="http://www.blogjava.net/zhuyuanxiang/archive/2008/07/19/216040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Countries在Apusic上部署</title><link>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/15/214925.html</link><dc:creator>朱远翔-Apusic技术顾问</dc:creator><author>朱远翔-Apusic技术顾问</author><pubDate>Tue, 15 Jul 2008 03:51:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/15/214925.html</guid><wfw:comment>http://www.blogjava.net/zhuyuanxiang/comments/214925.html</wfw:comment><comments>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/15/214925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyuanxiang/comments/commentRss/214925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyuanxiang/services/trackbacks/214925.html</trackback:ping><description><![CDATA[<p>
				<strong>目标：</strong>
				<br />Spring的Countries例子在Apusic V5.1上部署</p>
		<p>
				<strong>术语：</strong>
				<br /><a title="金蝶中间件" href="http://www.apusic.com" target="_blank">Apusic</a>：提供了完整的J2EE支持的商用服务器；<br />Spring：开源框架，是其他各种框架的粘合剂；<br />%APUSIC_HOME%：Apusic安装目录；<br />%JAVA_HOME%：JDK安装目录。</p>
		<p>
				<strong>准备：</strong>
				<br />在<a href="http://java.sun.com">http://java.sun.com</a>下载JDK V1.5以上的版本并安装，确认JAVA_HOME正确指向装好的JDK目录；<br />在<a href="http://www.apusic.com">http://www.apusic.com</a>下载Apusic V5.1以上的版本并安装；<br />在<a href="http://www.springframework.org/download">http://www.springframework.org/download</a>上下载spring-framework-2.0.6-with-dependencies.zip（不过很遗憾，最近国内用户好像无法从sourceforge.net上下载东西，大家通过Google找找其他镜像网站吧）。</p>
		<p>
				<strong>过程：</strong>
				<br />1. 执行%APUSIC_HOME%/domains/mydomain/bin/startapusic.cmd，访问主页：<a href="http://localhost:6888/">http://localhost:6888/</a>，确认Apusic已经成功安装，在窗口模式下按Ctrl+C停止服务器（记住因为是批处理还需要按Y确认）；<br />2. 解压缩spring的文件到%APUSIC_HOME%/temp目录下，然后找到samples/countries目录，执行warfile.bat生成dist/countries.war文件，将countries.war文件拷贝到%APUSIC_HOME%/domains/mydomain/applications/目录下，重新启动Apusic，稍等一会待Apusic自动部署，部署成功访问<a href="http://localhost:6888/countries/">http://localhost:6888/countries/</a>，一切成功。<br />3. “没有什么路途是一帆风顺的”。当点页面上Config时，系统报错:java.lang.NullPointerException，org.springframework.samples.countries.DefaultCountryService.getFilteredCountries(DefaultCountryService.java:59)读源代码，原来系统的的国家属性只支持EN、FR和DE，现在打开“工具→Internet选项→语言”，添加“英语[en]”，再访问现在好了。</p>
		<p>
				<br />
				<strong>备注：</strong>
				<br />1. 由于Apusic的ClassLoader需要将Spring框架载入，所以第一次启动时有点慢，请稍等一下。</p><img src ="http://www.blogjava.net/zhuyuanxiang/aggbug/214925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyuanxiang/" target="_blank">朱远翔-Apusic技术顾问</a> 2008-07-15 11:51 <a href="http://www.blogjava.net/zhuyuanxiang/archive/2008/07/15/214925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>经典框架在Apusic V5.1下部署文章撰写说明</title><link>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/10/214135.html</link><dc:creator>朱远翔-Apusic技术顾问</dc:creator><author>朱远翔-Apusic技术顾问</author><pubDate>Thu, 10 Jul 2008 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/10/214135.html</guid><wfw:comment>http://www.blogjava.net/zhuyuanxiang/comments/214135.html</wfw:comment><comments>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/10/214135.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyuanxiang/comments/commentRss/214135.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyuanxiang/services/trackbacks/214135.html</trackback:ping><description><![CDATA[为了帮助越来越多的Apusic爱好者和使用者更加顺利的使用Apusic应用服务器，作者准备将大量经典的、并且应用广泛的框架例子部署到Apusic V5.1的应用服务器上，现在计划中的有：<br />● Struts V2.0.9, V1.3.9<br />● Spring V2.0.6<br />● Hibernate<br />● iBatis<br />● Pluto<br />● Antlr<br />● Liferay<br />● MyFaces<br />如果大家有其他的需要，可以在后面跟帖说明，作者会根据需求情况调整优先级或者加入新的框架。或者有其他朋友有兴趣撰写或者已经写了相类似的文章，也欢迎一起来共享和转帖。<img src ="http://www.blogjava.net/zhuyuanxiang/aggbug/214135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyuanxiang/" target="_blank">朱远翔-Apusic技术顾问</a> 2008-07-10 23:00 <a href="http://www.blogjava.net/zhuyuanxiang/archive/2008/07/10/214135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts的例子在Apusic V5.1上的部署记录</title><link>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/10/214133.html</link><dc:creator>朱远翔-Apusic技术顾问</dc:creator><author>朱远翔-Apusic技术顾问</author><pubDate>Thu, 10 Jul 2008 14:55:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/10/214133.html</guid><wfw:comment>http://www.blogjava.net/zhuyuanxiang/comments/214133.html</wfw:comment><comments>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/10/214133.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyuanxiang/comments/commentRss/214133.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyuanxiang/services/trackbacks/214133.html</trackback:ping><description><![CDATA[<p>
				<strong>目标：<br /></strong>将Struts提供的例子部署到Apusic V5.1上，并且可以正确运行。<br />因为Struts 1.x与Struts 2.x有较大区别，因此本文对两个版本的例子都进行了部署。</p>
		<p>
				<strong>术语：</strong>
				<br />Struts：使用最为广泛的MVC框架。<br /><a title="金蝶中间件" href="http://www.apusic.com" target="_blank">Apusic</a>：完全支持J2EE规范的商业应用服务器产品，最新版本V5.1可以提供对Java EE 5.0的完整实现。<br />%APUSIC_HOME%：Apusic安装目录</p>
		<p>
				<strong>准备：<br /></strong>在<a href="http://archive.apache.org/dist/struts/binaries/struts-2.0.9-all.zip">http://archive.apache.org/dist/struts/binaries/struts-2.0.9-all.zip</a>下载Struts V2.0.9的压缩包；<br />在<a href="http://archive.apache.org/dist/struts/binaries/struts-1.3.9-all.zip">http://archive.apache.org/dist/struts/binaries/struts-1.3.9-all.zip</a>下载Struts V1.3.9的压缩包；<br />在<a href="http://java.sun.com/javase/downloads/index_jdk5.jsp">http://java.sun.com/javase/downloads/index_jdk5.jsp</a>下载JDK V1.5以上的版本并安装，确认JAVA_HOME正确指向装好的JDK目录；<br />在<a href="http://www.apusic.com/dist/apusicAS/v5.1/Apusic-5.1-OS-Independent.zip">http://www.apusic.com/dist/apusicAS/v5.1/Apusic-5.1-OS-Independent.zip</a>下载Apusic V5.1并解压；</p>
		<p>
				<strong>Struts 2.x的部署过程：<br /></strong>1. 执行%APUSIC_HOME%/domains/mydomain/bin/startapusic.cmd，访问主页：<a href="http://localhost:6888/">http://localhost:6888/</a>，确认Apusic已经成功安装；<br />2. 打开Struts V2.0.9的例子包，如果下载的是完整的Struts则在APP目录下；<br />3. 将struts2-blank-2.0.9.war拖入%APUSIC_HOME%/domains/mydomain/applications目录下（稍等一下），自动部署完成，用<a href="http://localhost:6888/struts2-blank-2.0.9/">http://localhost:6888/struts2-blank-2.0.9/</a>访问一下，已经OK了。（好棒好简单。。。）<br />4. 将struts2-mailreader-2.0.9.war拖入%APUSIC_HOME%/domains/mydomain/applications目录下（稍等一下），自动部署完成，用<br /><a href="http://localhost:6888/struts2-mailreader-2.0.9/">http://localhost:6888/struts2-mailreader-2.0.9/</a>访问一下，已经OK了。（好棒好简单。。。）<br />5. 将struts2-showcase-2.0.9.war拖入%APUSIC_HOME%/domains/mydomain/applications目录下（稍等一下），不会那么没创意吧，又成功啦？自动部署完成，但是后台部署过程报错：<br />javax.servlet.ServletException: java.lang.IllegalStateException: Application was not properly initialized at startup, co<br />uld not find Factory: javax.faces.context.FacesContextFactory<br />这个错误是跟JSF有关的，原因现在搞不懂，不管他。先用<a href="http://localhost:6888/struts2-showcase-2.0.9/">http://localhost:6888/struts2-showcase-2.0.9/</a>访问一下，好像没啥问题，进入主页一看例子提供了不少使用Struts的方法很值得学习，一一点过都很正常，而且还看到了JavaServer Faces，看样子Struts也在追赶潮流啦，点进去→再点List available Employees （<a href="http://localhost:6888/struts2-showcase-2.0.9/jsf/employee/list.action">http://localhost:6888/struts2-showcase-2.0.9/jsf/employee/list.action</a>）出错啦，去Apusic的后台看看。又有新的错误信息：<br />Unable to initialize jsf interceptors probably due missing JSF implementation libraries，说我没有提供实现库。不可能呀，Apusic已经提供了Operamasks的JSF实现呀，不过Struts肯定不会用Operamasks的，那是不是自带的JSF实现呢？打开WAR包进入WEB-INF/lib发现里面还有MyFaces的实现库。估计是两种JSF实现冲突了。看样子要动点脑筋了！<br />整个简单的办法，把Apusic的所有与JSF相关的JAR包都删除掉，让Apusic V5.1变成一个纯的WEB容器。与JSF相关的有三个文件：<br />● jsf-api.jar：%APUSIC_HOME%/common<br />● <a title="Operamasks" href="http://www.operamasks.org" target="_blank">Operamasks</a>-impl.jar：%APUSIC_HOME%/lib<br />● <a title="Operamasks" href="http://www.operamasks.org" target="_blank">Operamasks</a>-third-party.jar：%APUSIC_HOME%/lib/ext<br />停止应用服务器，把他们都删除掉，再重新启动后访问struts2-showcase-2.0.9.war的JSF例子，这下就行了。<br />7. 将struts2-portlet-2.0.9.war拖入%APUSIC_HOME%/domains/mydomain/applications目录下（稍等一下），自动部署也报错：<br />Could not load class org.apache.struts2.portlet.interceptor.PortletPreferencesInterceptor.看样子还需要加入Portal服务器才行，在网上搜了一下没有部署介绍，而且也说需要先部署好PortalServer支持，难度不小。尝试下了Pluto但是部署了没起作用，后来下了2.1.2版本，结果那个例子更成问题，只好先放弃。等到熟悉了Portal再回头补课。</p>
		<p>
				<strong>Struts 1.x的部署过程：</strong>
				<br />1. 执行%APUSIC_HOME%/domains/mydomain/bin/startapusic.cmd，访问主页：<a href="http://localhost:6888/">http://localhost:6888/</a>，确认Apusic已经成功安装；<br />2. 打开Struts V1.3.9的例子包，如果下载的是完整的Struts则在apps目录下；<br />3. 将struts-blank-1.3.9.war拖入%APUSIC_HOME%/domains/mydomain/applications目录下（稍等一下），自动部署完成，用<a href="http://localhost:6888/struts-blank-1.3.9/">http://localhost:6888/struts-blank-1.3.9/</a>访问一下，已经OK了；<br />4. 将struts-cookbook-1.3.9.war拖入%APUSIC_HOME%/domains/mydomain/applications目录下（稍等一下），自动部署完成，用<a href="http://localhost:6888/struts-cookbook-1.3.9/">http://localhost:6888/struts-cookbook-1.3.9/</a>访问一下，已经OK了，访问里面的内容也可以正确执行；<br />5. 将struts-el-example-1.3.9.war拖入%APUSIC_HOME%/domains/mydomain/applications目录下（稍等一下），自动部署完成，用<a href="http://localhost:6888/struts-el-example-1.3.9/">http://localhost:6888/struts-el-example-1.3.9/</a>访问一下，已经OK了，访问里面的内容也可以正确执行；<br />6. 将struts-examples-1.3.9.war拖入%APUSIC_HOME%/domains/mydomain/applications目录下（稍等一下），自动部署完成，用<a href="http://localhost:6888/struts-examples-1.3.9/">http://localhost:6888/struts-examples-1.3.9/</a>访问一下，已经OK了，访问里面的内容也可以正确执行（这个例子其实是上面三个例子的集成）；<br />7. 下面的两个例子都与myfaces有关，为了防止JSF实现冲突，先停止服务器，将Apusic的JSF实现删除（参考Struts 2.x中的6）；<br />8. 将struts-faces-example1-1.3.9.war拖入%APUSIC_HOME%/domains/mydomain/applications目录下（稍等一下），自动部署完成，用<a href="http://localhost:6888/struts-faces-example1-1.3.9/">http://localhost:6888/struts-faces-example1-1.3.9/</a>访问一下，已经OK了，访问里面的内容也可以正确执行；<br />9. 将struts-faces-example2-1.3.9.war拖入%APUSIC_HOME%/domains/mydomain/applications目录下（稍等一下），自动部署完成，用<a href="http://localhost:6888/struts-faces-example2-1.3.9/">http://localhost:6888/struts-faces-example2-1.3.9/</a>访问一下，已经OK了，访问里面的内容也可以正确执行；<br />10. 将struts-mailreader-1.3.9.war拖入%APUSIC_HOME%/domains/mydomain/applications目录下（稍等一下），自动部署完成，用<a href="http://localhost:6888/struts-mailreader-1.3.9/">http://localhost:6888/struts-mailreader-1.3.9/</a>访问一下，已经OK了(注意：我下载的这个例子图片无法正常显示，打开应用发现根本没有把图片文件打入WAR包)，访问里面的内容也可以正确执行；<br />11. 将struts-scripting-mailreader-1.3.9.war拖入%APUSIC_HOME%/domains/mydomain/applications目录下（稍等一下），自动部署完成，用<a href="http://localhost:6888/struts-scripting-mailreader-1.3.9/">http://localhost:6888/struts-scripting-mailreader-1.3.9/</a>访问一下，已经OK了(注意：我下载的这个例子图片无法正常显示，打开应用发现根本没有把图片文件打入WAR包)，访问里面的内容也可以正确执行。</p>
		<p>
				<strong>备注：<br /></strong>1. 删除了Operamasks的实现包，如果别的应用仍然想用Operamasks，最好的办法就是直接把这三个包加入到应用的WEB-INF/lib下面就可以了。</p><img src ="http://www.blogjava.net/zhuyuanxiang/aggbug/214133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyuanxiang/" target="_blank">朱远翔-Apusic技术顾问</a> 2008-07-10 22:55 <a href="http://www.blogjava.net/zhuyuanxiang/archive/2008/07/10/214133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat V6 Examples移植到Apusic V5.1</title><link>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/07/213073.html</link><dc:creator>朱远翔-Apusic技术顾问</dc:creator><author>朱远翔-Apusic技术顾问</author><pubDate>Mon, 07 Jul 2008 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/07/213073.html</guid><wfw:comment>http://www.blogjava.net/zhuyuanxiang/comments/213073.html</wfw:comment><comments>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/07/213073.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyuanxiang/comments/commentRss/213073.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyuanxiang/services/trackbacks/213073.html</trackback:ping><description><![CDATA[<p>
				<strong>目标：</strong>将Tomcat V6的的例子Examples移植到Apusic V5.1上<br /><br /><strong>术语：<br /></strong>Tomcat：只提供了WEB容器的开源服务器；<br /><a title="金蝶中间件" href="http://www.apusic.com" target="_blank">Apusic</a>：提供了完整的J2EE支持的商用服务器；<br />%TOMCAT_HOME%：Tomcat安装目录<br />%APUSIC_HOME%：Apusic安装目录<br /><br /><strong>准备：<br /></strong>在<a href="http://java.sun.com">http://java.sun.com</a>下载JDK V1.5以上的版本并安装，确认JAVA_HOME正确指向装好的JDK目录；<br />在<a href="http://tomcat.apache.org">http://tomcat.apache.org</a>下载Tomcat V6以上的版本并安装；<br />在<a href="http://www.apusic.com">http://www.apusic.com</a>下载Apusic V5.1以上的版本并安装；</p>
		<p>
				<strong>过程：</strong>
				<br />1. 执行%TOMCAT_HOME%/bin/startup.bat，访问例子Examples：<a href="http://localhost:8080/jsp">http://localhost:8080/jsp</a>，确认Tomcat和Examples成功安装，在窗口模式下按Ctrl+C停止服务器；<br />2. 执行%APUSIC_HOME%/domains/mydomain/bin/startapusic.cmd，访问主页：<a href="http://localhost:6888/">http://localhost:6888/</a>，确认Apusic已经成功安装，在窗口模式下按Ctrl+C停止服务器（记住因为是批处理还需要按Y确认）；<br />3. 找到%TOMCAT_HOME%/webapps/examples目录，将examples目录拷贝到%APUSIC_HOME%/domains/mydomain/applications/下，重新启动Apusic，稍等一会待Apusic自动部署，应用报错：java.lang.NoClassDefFoundError: org/apache/catalina/CometProcessor，这个错误是因为应用中使用了Tomcat内核的API（非J2EE规范），虽然编写这样的应用违背J2EE规范（JBoss和Resin也这样做过），但是既然应用已经这样使用必须想办法支持。<br />4. 一种方法是找出应用代码中的部分进行修改，很遗憾我没有找到；另一种就是把那个需要引用的类所在的catalina.jar文件拷贝到%APUSIC_HOME%/domains/mydomain/lib目录下，先停止Apusic应用服务器，然后重新启动。<br />5. 稍等一下，Apusic自动部署了examples应用，现在访问例子：<a href="http://localhost:6888/examples/">http://localhost:6888/examples/</a><br />6. 哇，成功了。就这么简单就可以完成Tomcat应用到Apusic应用的移植。<br />总结：Apusic是个符合J2EE规范的应用服务器，在Tomcat上开发的应用都可以非常简单的移植到Apusic上。并且Apusic同样支持WAR包（WEB模块）的直接部署。<br /><br /><strong>备注：<br /></strong>0. 访问<a href="http://localhost:6888/examples/jsp/jsp2/el/basic-arithmetic.jsp">http://localhost:6888/examples/jsp/jsp2/el/basic-arithmetic.jsp</a>出错了，为什么？<br /> 因为J2EE规范中除0是必须抛出错误，而Tomcat则没有遵守规范操作，请开发者注意。<br /> 当然，完美主义者还是希望看到正常显示的页面，那么请把这个文件中的3/0替换成3/4就可以了。<br />1. 打开examples应用的lib目录，会发现里面还有两个jar文件：jstl.jar和standard.jar，这是支持Standard Library用的，其实Apusic已经自带无须他们，现在停止Apusic服务器，再删除这两个JAR包，然后重新启动Apusic服务器，应用果然可以正常运行；<br />2. 移植时把catalina.jar全部拷过来了，里面包含了Tomcat对WEB容器的部分实现，那么肯定会疑虑系统到底在调用谁的实现呢？为了确认我们可以将Apusic服务器停止，用WINRAR打开catalina.jar文件，把里面与Comet无关的class全部删除，再重新启动Apusic服务器，应用仍然可以正常运行，现在没有疑虑了；<br />3. 为什么每次都需要停止服务器才能操作lib里面的JAR文件呢，难道Apusic不支持热部署？<br />Apusic当然支持热部署，将Examples直接拷贝到applications目录下其实就是热部署，你甚至可以在Apusic启动完成后再执行拷贝也可以。但是应用一旦被加载进应用服务器后，所有的jar文件全部会被锁定，以便保证应用的完整性，所以修改lib下的jar文件必须将应用服务器重新启动。<br />4. 建议不要部署压缩文件，而是部署将应用展开后的目录，因为对于压缩文件应用服务器启动时还需要一个解压过程，降低启动速度消耗系统资源；<br />5. 如何在Apusic上给WEB模块配置上下文呢？<br /> 现在打开%APUSIC_HOME%/domains/mydomain/config/server.xml可以看到新部署的examples的说明：  <br />&lt;application name="examples" base="applications/examples" start="auto"/&gt;，因为examples不是标准的J2EE应用，导致WEB模块中没有指定上下文，因此可以使用name来指定上下文，比如：<br />&lt;application name="<a title="金蝶中间件" href="http://www.apusic.com" target="_blank">Apusic</a>-examples" base="applications/examples" start="auto"/&gt;就把应用的上下文换成apusic-examples了，访问自然也变成了<a href="http://localhost:6888/apusic-examples">http://localhost:6888/apusic-examples</a>，简单吧！<br /></p><img src ="http://www.blogjava.net/zhuyuanxiang/aggbug/213073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyuanxiang/" target="_blank">朱远翔-Apusic技术顾问</a> 2008-07-07 17:14 <a href="http://www.blogjava.net/zhuyuanxiang/archive/2008/07/07/213073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HP-UX+JDK+Apusic+SQL-Server的调优记录</title><link>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/04/212659.html</link><dc:creator>朱远翔-Apusic技术顾问</dc:creator><author>朱远翔-Apusic技术顾问</author><pubDate>Fri, 04 Jul 2008 09:40:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/04/212659.html</guid><wfw:comment>http://www.blogjava.net/zhuyuanxiang/comments/212659.html</wfw:comment><comments>http://www.blogjava.net/zhuyuanxiang/archive/2008/07/04/212659.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyuanxiang/comments/commentRss/212659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyuanxiang/services/trackbacks/212659.html</trackback:ping><description><![CDATA[<p>最近的项目，面临情况如下：<br />1. 并发压力大。平时并发连接大约在3000左右，高峰期是8000人上线访问，预期未来会达到20,000人同时在线。<br />2. 受到网络攻击。系统是接在公网上致使网络爬虫和攻击工具都可能给系统带来未知压力，甚至突然增加的并发访问导致系统瘫痪。<br />3. 数据库压力大。有大量的数据库访问操作，并且SQL语句中含有COUNT(*)或者JOIN等消耗系统资源的代码。</p>
		<p>为了满足应用需要，特别对以下环境进行了调优。系统基本配置如下：<br />HP-UX V11.11　2CPU 4G<br />HP JDK V1.5<br /><a title="金蝶中间件" href="http://www.apusic.com" target="_blank">Apusic</a> V5.0<br />SQL Server 2005</p>
		<p>系统硬件条件已经确定，系统资源调用变化最频繁的就是应用服务器，因此应用服务器所在的操作系统、Java虚拟机(Java Virtual Machine, JVM)和Apusic AS都需要调优。而应用服务器对数据库的数据库连接池大小也必定会影响数据库服务器的相关压力，因此最后再根据稳定后的应用服务器调整数据库服务器配置。</p>
		<p>1. 先调整JVM。这个先根据JVM所在的应用服务器物理内存的大小和JDK所支持的大小决定，建议是将空闲内存的70%～80%分配给JVM使用。下面是Java启动时用的配置参数：<br />-server -Xms1024m -Xmx1024m -Xmn?m -XX:MaxPermSize=256m -XX:NewSize=128m -XX:MaxNewSize=128m -XX:SurvivorRatio=8 -Xincgc、</p>
		<p>注：1. 不同JDK在不同OS下所能使用的内存大小是不同<br /> 2. Heap的大小和分配现在设置的是经验值，是否调整最终还需要分析应用来定，一般经验值已经满足需要。<br /> 3. GC的机制对系统稳定也比较重要，尽可能参考JDK提供的最新GC参数。<br /> 4. 使用server版的JVM一般都会对应用系统提升带来帮助。</p>
		<p>2. 再调整Apusic应用服务器。因为并发压力大，也意味着系统对CPU和内存的资源消耗都会比较大，为保证应用服务器的稳定修改apusic.conf的配置如下（只保留了修改的部分）：<br />2.1. 线程池调整<br /> 为了平衡用户访问速度与并发支持的关系，必须调整Apusic的线程池。调整前依据以下原则：<br /> ● 每CPU50用户的原则（线程池的设置可参考《Apusic AS V5.1线程池配置和调优》）。<br /> ● HTTPHandler是MuxHandler的三倍。<br />&lt;SERVICE<br />    CLASS="com.apusic.util.ThreadPoolService"<br />    NAME="<a title="金蝶中间件" href="http://www.apusic.com" target="_blank">Apusic</a>:service=ThreadPool,name=MuxHandler"<br />    &gt;<br />    &lt;ATTRIBUTE NAME="MaxThreads" VALUE="100"/&gt;<br />    &lt;ATTRIBUTE NAME="MaxSpareThreads" VALUE="30"/&gt;<br />    &lt;ATTRIBUTE NAME="MinSpareThreads" VALUE="30"/&gt;<br />&lt;/SERVICE&gt;</p>
		<p>&lt;SERVICE<br />    CLASS="com.apusic.util.ThreadPoolService"<br />    NAME="<a title="金蝶中间件" href="http://www.apusic.com" target="_blank">Apusic</a>:service=ThreadPool,name=HTTPHandler"<br />    &gt;<br />    &lt;ATTRIBUTE NAME="MaxThreads" VALUE="300"/&gt;<br />    &lt;ATTRIBUTE NAME="MaxSpareThreads" VALUE="100"/&gt;<br />    &lt;ATTRIBUTE NAME="MinSpareThreads" VALUE="100"/&gt;<br />&lt;/SERVICE&gt;</p>
		<p>2.2. Mux（多路复用服务）调优。多路复用是将客户端的服务申请分发给相应的服务，如：HTTP服务、JMS服务等等。因此该服务对资源占用时间较短，不需要分配太多线程，只需要关注他的接收能力和申请排队，保证申请不会丢失。<br />&lt;SERVICE<br />    CLASS="com.apusic.net.Muxer"<br />    &gt;<br />    &lt;ATTRIBUTE NAME="NumberSelectors" VALUE="2"/&gt;<br /> &lt;!-- 系统CPU核数，多个CPU使用多个Selectors可以加快并发处理能力 --&gt;<br />    &lt;ATTRIBUTE NAME="Port" VALUE="80"/&gt; <br /> &lt;!-- 默认的服务端口 --&gt;<br />    &lt;ATTRIBUTE NAME="Backlog" VALUE="50"/&gt; <br /> &lt;!-- TCP/IP的队列大小，如果有大量客户端连接超时，而服务器又没有足够的CPU压力，可以调大这个值 --&gt;<br />&lt;/SERVICE&gt;</p>
		<p>2.3. WEB服务调优。<br />&lt;SERVICE<br />    CLASS="com.apusic.web.WebService"<br />    &gt;<br />    &lt;ATTRIBUTE NAME="NumberSelectors" VALUE="2"/&gt;<br /> &lt;!-- 系统CPU核数，多个CPU使用多个Selectors可以加快并发处理能力 --&gt;<br />    &lt;ATTRIBUTE NAME="MaxKeepAliveConnections" VALUE="300"/&gt;<br /> &lt;!-- 最大保持KeepAlive的连接数，与HTTPHandler保持一致 --&gt;<br />    &lt;ATTRIBUTE NAME="MaxKeepAliveRequests" VALUE="600"/&gt;<br /> &lt;!-- 最大保持KeepAlive的请求数，设HTTPHandler×2，大约一个连接支持两次请求，如果服务器硬件条件允许可以再开大些 --&gt;<br />    &lt;ATTRIBUTE NAME="WaitingClientTimeout" VALUE="15"/&gt;<br />    &lt;ATTRIBUTE NAME="MaxWaitingClients" VALUE="200"/&gt;<br /> &lt;!-- 等待队列满了后，将客户端请求抛弃的等待时间。如果关注系统反应的及时性，就把这个值调小，还可以把请求队列MaxWaitingClients调小；如果关注系统服务的有效性则要调大。--&gt;<br />    &lt;ATTRIBUTE NAME="KeepAlive" VALUE="True"/&gt;<br /> &lt;!-- 默认打开KeepAlive，了解这个参数配置需要参看HTTP 1.1协议 --&gt;<br />    &lt;ATTRIBUTE NAME="ServletReloadCheckInterval" VALUE="-1"/&gt;<br /> &lt;!-- 设为-1，意思就是不检查，因为这个功能是为开发阶段提供热部署的 --&gt;<br />    &lt;ATTRIBUTE NAME="KeepAliveTimeout" VALUE="15"/&gt;<br /> &lt;!-- 服务器关闭客户端连接前等待下一次请求的时间，如果系统压力较大可以将这个值设小，以便应对更多的请求。 --&gt;<br />&lt;/SERVICE&gt;</p>
		<p>2.3. Session服务<br />基本上采用默认值就可以了，如果需要配置集群才需要调整Session里面某些配置选项，具体可以参考Apusic集群配置。</p>
		<p>2.4. 数据库连接池服务<br />&lt;datasources&gt;<br />  &lt;datasource name="test"<br />     jndi-name="jdbc/test"<br />     driver-class="net.sourceforge.jtds.jdbc.Driver"<br />     url="Jdbc:jtds:sqlserver://192.168.0.1:1433/test"<br />     min-spare-connections="50"<br />     max-spare-connections="50"<br />     max-connections="150"<br />     initial-connections="50"<br />  &gt;<br />    &lt;property name="user" value="sa"/&gt;<br />    &lt;property name="test-before-reused" value="false"/&gt;<br />    &lt;property name="password" value="test"/&gt;<br />    &lt;property name="stmt-cache-size" value="50"/&gt;<br />    &lt;property name="pre-fetch-size" value="50"/&gt;<br />  &lt;/datasource&gt;<br />&lt;/datasources&gt;<br />min-spare-connections、max-spare-connections：在池中保留的空闲数据库连接数；<br />initial-connections：初始化的空闲数据库连接数；<br />三个值相同，保证在初始化时就有足够的数据库连接使用。<br />数据库连接数×2＝HTTP线程池数目<br />注：max-connections在现实中被调小。因为数据库服务器无法处理更多响应，因此原则是先保证拥有数据库连接的线程能够有效响应。</p>
		<p>3. 调整HP-UX操作系统。<br />3.1. 首先调整核心资源，使用ulimit -a查看核心参数，特别关注file和memory两部分的使用，有些时候操作系统限制了进程打开文件数和内存使用数，无法有效利用硬件资源也会限制应用服务器性能的发挥。</p>
		<p>3.2. 因为应用系统受到攻击，致使出现大量的CLOSE_WAIT、FIN_WAIT_2这样状态的连接，消耗大量系统资源。因此使用ndd进行网络参数配置，先用：ndd /dev/tcp，然后输入?，可以得到所有网络参数情况。使用：ndd -get /dev/tcp 参数名称，可以获得原参数的值。使用：ndd -set /dev/tcp 参数名称 参数值，可以设置新参数的值。例如：获得初始值：ndd -get /dev/tcp tcp_time_wait_interval，设置新值：ndd -set /dev/tcp tcp_time_wait_interval 30000，30000是毫秒单位=30秒。不能设置为0，0似乎是无限长的意思。需要关注的参数如下：<br />#与TIME_WAIT相关的参数，当系统出现大量此状态的连接时可以调小这个值<br />tcp_time_wait_interval   30000<br />tcp_tw_cleanup_interval  60000<br />#与FIN_WAIT相关的参数<br />tcp_fin_wait_2_timeout   1000<br />#与KeepAlive相关的参数，因为应用服务器不负责KeepAlive连接的管理，因此这里由操作系统负责<br />tcp_keepalive_interval   120000<br />tcp_keepalive_detached_interval 120000<br />tcp_keepalives_kill   1<br />tcp_ip_abort_interval   600000<br />#与TCP连接数相关的参数<br />tcp_conn_request_max   4096<br /><br />注：使用ndd重新启动后就无效了。可以修改/etc/rc.config.d/nddconf就可以在机器重新启动时有效。</p>
		<p>4. 调整SQL Server数据库的参数。这个是因为数据库压力较大，才关注到这个部分调优。<br />4.1. 内存调整。因为SQL Server内存管理默认无限大，结果把系统资源全部耗尽，因此将服务器内存按照70～80%原则分配给SQL Server使用。<br />4.2. 处理器设置。主要是选择提升SQL Server的优先级和使用Windows纤程，保证SQL Server在操作系统中的执行速度。<br />4.3. 连接设置。控制最大并发连接数，比数据库连接池所设的连接数稍大就可以了，防止过多连接导致系统切换线程带来的资源消耗。同时合理设置查询的超时时间，保证资源不会被某个访问占用。<br />4.4. 活动监视器。通过活动监视器查看系统中的活动进程，以及执行的SQL语句，并且在系统压力较大时观察是否有资源被锁。<br /> 不过这些其实都只是帮助系统更好的运行，实际上SQL Server资源消耗问题的解决仍然领先应用的调整，应用发现某些表关联有问题，重新调整后CPU压力立刻降低。</p>
		<p> 以上是整个调优的过程记录。</p><img src ="http://www.blogjava.net/zhuyuanxiang/aggbug/212659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyuanxiang/" target="_blank">朱远翔-Apusic技术顾问</a> 2008-07-04 17:40 <a href="http://www.blogjava.net/zhuyuanxiang/archive/2008/07/04/212659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apusic AS V5.1线程池配置和调优</title><link>http://www.blogjava.net/zhuyuanxiang/archive/2008/06/25/210484.html</link><dc:creator>朱远翔-Apusic技术顾问</dc:creator><author>朱远翔-Apusic技术顾问</author><pubDate>Wed, 25 Jun 2008 03:57:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyuanxiang/archive/2008/06/25/210484.html</guid><wfw:comment>http://www.blogjava.net/zhuyuanxiang/comments/210484.html</wfw:comment><comments>http://www.blogjava.net/zhuyuanxiang/archive/2008/06/25/210484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyuanxiang/comments/commentRss/210484.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyuanxiang/services/trackbacks/210484.html</trackback:ping><description><![CDATA[<p>“没有最优，只有平衡”。因此在配置与调优之前，我总喜欢先介绍理论基础。<br /><a title="金蝶中间件" href="http://www.apusic.com" target="_blank">Apusic</a> AS V5.1的线程池只是个池服务，池中没有具体的线程，池中管理的线程是与业务相关的服务启动后并加入的。线程池只负责管理池中线程的数量和生命周期，从而简化了Apusic应用服务器的池管理框架。验证线程池的方法有以下几种：<br />1. 在Windows下启动Apusic V5.1的mydomain域，里面不带任何自启动线程的应用，在命令行窗口下按Ctrl+Break结果见附一（各人机器可能有所不同），发现系统没有任何与线程池相关的线程启动。打开IE访问一个HTML页面，再Ctrl+Break结果见附二，发现多了两个线程：Running HTTPHandler-1（HTTP服务线程）和Idle MuxHandler-1（多路复用服务线程），Mux空闲是因为多路复用的分配工作已经完成，而HTTP忙是因为HTTP服务刚结束，KeepAlive仍然保持着。可见线程池启动时是空的，当有服务时才生成线程加入到池中，池主要负责线程的数量和生命周期。这样的设定可以避免受到攻击时无限制地创建线程而导致系统宕机；或者合理使用机器的性能，平衡分配不同线程池中的线程数量。</p>
		<p>2. 在apusic.conf文件中自定义一个线程池Test，然后可以在自己的代码中使用Apusic AS提供的池管理技术，当然如果没有使用这个池系统也仍然可以正常运行，因为这只是个池服务，只是没有线程加入到池中而已。<br />&lt;SERVICE<br />    CLASS="com.apusic.util.ThreadPoolService"<br />    NAME="<a title="金蝶中间件" href="http://www.apusic.com" target="_blank">Apusic</a>:service=ThreadPool,name=Test"<br />    &gt;<br />    &lt;ATTRIBUTE NAME="MaxThreads" VALUE="150"/&gt;<br />    &lt;ATTRIBUTE NAME="Priority" VALUE="5"/&gt;<br />    &lt;ATTRIBUTE NAME="ServicePriority" VALUE="H"/&gt;<br />    &lt;ATTRIBUTE NAME="IdleTimeout" VALUE="300"/&gt;<br />    &lt;ATTRIBUTE NAME="MaxSpareThreads" VALUE="30"/&gt;<br />    &lt;ATTRIBUTE NAME="MinSpareThreads" VALUE="5"/&gt;<br />    &lt;ATTRIBUTE NAME="MaxQueueSize" VALUE="500"/&gt;<br />&lt;/SERVICE&gt;</p>
		<p>3. 只提供default池，其他池都注释掉，系统依然能够正常运行，也是因为池与服务之间不是紧耦合，没有的相关的池，所有的线程统一使用default池，如果有自己的池就通过自定义池处理。<br />注意：如果有了自定义池，池中线程数达到最大值后，系统不会使用defalut池来处理的，从而充分保证相应服务池的控制。<br />例如：定义了HTTPHandler池，当HTTPHandler线程达到最大值后，其他只能在Queue中排队，如果Queue也满了，则其他请求将会被拒绝。</p>
		<p>
				<a title="金蝶中间件" href="http://www.apusic.com" target="_blank">Apusic</a> AS自己使用了五种池：<br />default：Apusic AS系统默认的线程池<br />MuxHandler：多路复用的线程池，主要是将请求向不同的服务，如：HTTP、JMS、ORB等服务上分配<br />HTTPHandler：HTTP服务的线程池<br />JMSHandler：JMS服务的线程池<br />ORBHandler：ORB服务的线程池<br />了解了线程池的基本概念，就可以知道在线程池配置中default池最为重要，其他池可以根据需要增加或者注释，所有线程池的配置参数都是相同的，具体的配置参数解释如下：<br />MaxThreads：线程池中能够运行的最大线程数，也就是提供服务的线程数，-1代表无限制<br />MinSpareThreads，MaxSpareThreads：线程池中最小／最大空闲的线程数，当线程数符合这个区间时无论空闲多久都不会被销毁<br />IdelTimeout：空闲线程超时的时间，超时后会如果运行的线程总数大于MaxSpareThreads则被销毁<br />Priority（1～10）：受Java线程优先级管理<br />ServicePriority：服务启动的优先级，五种（H &gt; A &gt; N &gt; B &gt; L）<br />MaxQueueSize：当所有线程都忙时，为无法获得线程的请求提供队列进行排队，Size代表队列长度，队列满时请求被抛弃</p>
		<p>
				<a title="金蝶中间件" href="http://www.apusic.com" target="_blank">Apusic</a> AS的线程池优化：<br />● 一般的WEB应用部署在Apusic上时，不会用到JMS和ORB服务，因此可以将这两个池注释掉，减少资源消耗。<br />● 如果应用现阶段使用人数不多，但是伴随着发展应用人数会不断增长，可以将MinSpareThreads调整为符合现阶段情况的值，将MaxSpareThreads调整为符合将来的值，这样系统无须再变动就可以有效支持很长一段时间；<br />● 如果应用一段时间内访问量变化不大，但是系统偶尔会遇到高峰访问，那么可以设置MinSpareThreads=MaxSpareThreads；<br />● MaxThreads的值依据CPU数量来定，参考值50×CPU核数，具体值还需要根据应用执行过程中对CPU的压力决定。<br />● 关于Apusic AS V5.1服务的配置，下篇文章会单独介绍。</p>
		<p>
				<br />附一、<br />Full thread dump Java HotSpot(TM) Client VM (1.5.0_14-b03 mixed mode, sharing):</p>
		<p>"AutoDeployer" prio=6 tid=0x030f2970 nid=0x9e0 in Object.wait() [0x03cef000..0x03cefc6c]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x23460458&gt; (a com.apusic.deploy.runtime.AutoDeployer)<br />        at com.apusic.deploy.runtime.AutoDeployer.run(Unknown Source)<br />        - locked &lt;0x23460458&gt; (a com.apusic.deploy.runtime.AutoDeployer)<br />        at java.lang.Thread.run(Thread.java:595)</p>
		<p>"Thread-4" prio=6 tid=0x031ca7f0 nid=0x21c in Object.wait() [0x0349f000..0x0349fd6c]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x2321c188&gt; (a com.sun.corba.se.impl.javax.rmi.CORBA.KeepAlive)<br />        at java.lang.Object.wait(Object.java:474)<br />        at com.sun.corba.se.impl.javax.rmi.CORBA.KeepAlive.run(Util.java:736)<br />        - locked &lt;0x2321c188&gt; (a com.sun.corba.se.impl.javax.rmi.CORBA.KeepAlive)</p>
		<p>"HTTPSessionSwapper" prio=6 tid=0x031d8168 nid=0xb98 in Object.wait() [0x0345f000..0x0345fa6c]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x2318ba58&gt; (a java.lang.Object)<br />        at com.apusic.web.session.SessionManager$HouseKeeper.run(Unknown Source)<br />        - locked &lt;0x2318ba58&gt; (a java.lang.Object)</p>
		<p>"HttpLogger" prio=2 tid=0x031be630 nid=0xfe8 in Object.wait() [0x0341f000..0x0341f9ec]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x2317d2b8&gt; (a com.apusic.web.http.HttpLogger)<br />        at java.lang.Object.wait(Object.java:474)<br />        at com.apusic.web.http.HttpLogger.getNextRecord(Unknown Source)<br />        - locked &lt;0x2317d2b8&gt; (a com.apusic.web.http.HttpLogger)<br />        at com.apusic.web.http.HttpLogger.run(Unknown Source)</p>
		<p>"MuxListener" prio=6 tid=0x031a8be8 nid=0x7dc runnable [0x033df000..0x033dfaec]<br />        at java.net.PlainSocketImpl.socketAccept(Native Method)<br />        at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)<br />        - locked &lt;0x23177890&gt; (a java.net.SocksSocketImpl)<br />        at java.net.ServerSocket.implAccept(ServerSocket.java:450)<br />        at java.net.ServerSocket.accept(ServerSocket.java:421)<br />        at com.apusic.net.BlockingListenerThread.run(Unknown Source)</p>
		<p>"Timer-0" prio=6 tid=0x031c3b08 nid=0xc98 in Object.wait() [0x0339f000..0x0339fb6c]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x23133120&gt; (a java.util.TaskQueue)<br />        at java.util.TimerThread.mainLoop(Timer.java:509)<br />        - locked &lt;0x23133120&gt; (a java.util.TaskQueue)<br />        at java.util.TimerThread.run(Timer.java:462)</p>
		<p>"LogManager" prio=2 tid=0x02e2c680 nid=0xb20 waiting on condition [0x0335f000..0x0335fbec]<br />        at sun.misc.Unsafe.park(Native Method)<br />        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:118)<br />        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:<br />841)<br />        at com.apusic.util.concurrent.LinkedBlockingQueue.take(Unknown Source)<br />        at com.apusic.logging.manager.ServerLogManager$PushThread.dequeue(Unknown Source)<br />        at com.apusic.logging.manager.ServerLogManager$PushThread.run(Unknown Source)</p>
		<p>"Low Memory Detector" daemon prio=6 tid=0x00a83bf0 nid=0xa6c runnable [0x00000000..0x00000000]</p>
		<p>"CompilerThread0" daemon prio=10 tid=0x00a537b8 nid=0xdc4 waiting on condition [0x00000000..0x02c2f6cc]</p>
		<p>"Signal Dispatcher" daemon prio=10 tid=0x00a95a58 nid=0xeb0 waiting on condition [0x00000000..0x00000000]</p>
		<p>"Finalizer" daemon prio=8 tid=0x00a50870 nid=0xbd0 in Object.wait() [0x02baf000..0x02bafa6c]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x230d25c8&gt; (a java.lang.ref.ReferenceQueue$Lock)<br />        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:120)<br />        - locked &lt;0x230d25c8&gt; (a java.lang.ref.ReferenceQueue$Lock)<br />        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:136)<br />        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)</p>
		<p>"Reference Handler" daemon prio=10 tid=0x00a4f3e8 nid=0xf94 in Object.wait() [0x02b6f000..0x02b6faec]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x230d2650&gt; (a java.lang.ref.Reference$Lock)<br />        at java.lang.Object.wait(Object.java:474)<br />        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)<br />        - locked &lt;0x230d2650&gt; (a java.lang.ref.Reference$Lock)</p>
		<p>"main" prio=6 tid=0x00038c00 nid=0x718 in Object.wait() [0x0007f000..0x0007fc3c]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x230e0ed8&gt; (a com.apusic.server.J2EEServer)<br />        at java.lang.Object.wait(Object.java:474)<br />        at com.apusic.server.J2EEServer.startup(Unknown Source)<br />        - locked &lt;0x230e0ed8&gt; (a com.apusic.server.J2EEServer)<br />        at com.apusic.server.Main.main(Unknown Source)</p>
		<p>"VM Thread" prio=10 tid=0x00a80190 nid=0x490 runnable</p>
		<p>"VM Periodic Task Thread" prio=10 tid=0x00a8e780 nid=0xcec waiting on condition</p>
		<p>附二、<br />Full thread dump Java HotSpot(TM) Client VM (1.5.0_14-b03 mixed mode, sharing):</p>
		<p>"Running HTTPHandler-1" prio=6 tid=0x02febe58 nid=0xbd8 runnable [0x03d6f000..0x03d6fb6c]<br />        at java.net.SocketInputStream.socketRead0(Native Method)<br />        at java.net.SocketInputStream.read(SocketInputStream.java:129)<br />        at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)<br />        at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)<br />        at java.io.BufferedInputStream.read(BufferedInputStream.java:313)<br />        - locked &lt;0x234dd378&gt; (a java.io.BufferedInputStream)<br />        at com.apusic.web.http.tcp.TCP_BIOProtocol.readLine(Unknown Source)<br />        at com.apusic.web.http.tcp.TCP_BIOProtocol.readRequestLine(Unknown Source)<br />        at com.apusic.web.http.tcp.TCP_BIOProtocol.read(Unknown Source)<br />        at com.apusic.web.http.tcp.TCP_BIOConnection.getNextRequest(Unknown Source)<br />        at com.apusic.web.http.ConnectionHandler.processConnection(Unknown Source)<br />        at com.apusic.web.http.ConnectionHandler.run(Unknown Source)<br />        at com.apusic.util.ThreadPoolImpl$WorkerThread.run(Unknown Source)</p>
		<p>"Idle MuxHandler-1" prio=6 tid=0x02cc0d90 nid=0x54c in Object.wait() [0x03d2f000..0x03d2fbec]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x23147df0&gt; (a java.lang.Object)<br />        at com.apusic.util.ThreadPoolImpl.getWork(Unknown Source)<br />        - locked &lt;0x23147df0&gt; (a java.lang.Object)<br />        at com.apusic.util.ThreadPoolImpl$WorkerThread.run(Unknown Source)</p>
		<p>"AutoDeployer" prio=6 tid=0x03146980 nid=0x7bc in Object.wait() [0x03cef000..0x03cefc6c]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x2344f8c0&gt; (a com.apusic.deploy.runtime.AutoDeployer)<br />        at com.apusic.deploy.runtime.AutoDeployer.run(Unknown Source)<br />        - locked &lt;0x2344f8c0&gt; (a com.apusic.deploy.runtime.AutoDeployer)<br />        at java.lang.Thread.run(Thread.java:595)</p>
		<p>"Thread-4" prio=6 tid=0x031e3868 nid=0xdc8 in Object.wait() [0x0349f000..0x0349fd6c]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x2321c188&gt; (a com.sun.corba.se.impl.javax.rmi.CORBA.KeepAlive)<br />        at java.lang.Object.wait(Object.java:474)<br />        at com.sun.corba.se.impl.javax.rmi.CORBA.KeepAlive.run(Util.java:736)<br />        - locked &lt;0x2321c188&gt; (a com.sun.corba.se.impl.javax.rmi.CORBA.KeepAlive)</p>
		<p>"HTTPSessionSwapper" prio=6 tid=0x031c1948 nid=0x9f4 in Object.wait() [0x0345f000..0x0345fa6c]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x2318ba58&gt; (a java.lang.Object)<br />        at com.apusic.web.session.SessionManager$HouseKeeper.run(Unknown Source)<br />        - locked &lt;0x2318ba58&gt; (a java.lang.Object)</p>
		<p>"HttpLogger" prio=2 tid=0x031b8830 nid=0xb2c in Object.wait() [0x0341f000..0x0341f9ec]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x2317d2b8&gt; (a com.apusic.web.http.HttpLogger)<br />        at java.lang.Object.wait(Object.java:474)<br />        at com.apusic.web.http.HttpLogger.getNextRecord(Unknown Source)<br />        - locked &lt;0x2317d2b8&gt; (a com.apusic.web.http.HttpLogger)<br />        at com.apusic.web.http.HttpLogger.run(Unknown Source)</p>
		<p>"MuxListener" prio=6 tid=0x02e654a8 nid=0xa28 runnable [0x033df000..0x033dfaec]<br />        at java.net.PlainSocketImpl.socketAccept(Native Method)<br />        at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)<br />        - locked &lt;0x23177890&gt; (a java.net.SocksSocketImpl)<br />        at java.net.ServerSocket.implAccept(ServerSocket.java:450)<br />        at java.net.ServerSocket.accept(ServerSocket.java:421)<br />        at com.apusic.net.BlockingListenerThread.run(Unknown Source)</p>
		<p>"Timer-0" prio=6 tid=0x02e65c08 nid=0xdf0 in Object.wait() [0x0339f000..0x0339fb6c]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x23133120&gt; (a java.util.TaskQueue)<br />        at java.util.TimerThread.mainLoop(Timer.java:509)<br />        - locked &lt;0x23133120&gt; (a java.util.TaskQueue)<br />        at java.util.TimerThread.run(Timer.java:462)</p>
		<p>"LogManager" prio=2 tid=0x02e2d488 nid=0xbfc waiting on condition [0x0335f000..0x0335fbec]<br />        at sun.misc.Unsafe.park(Native Method)<br />        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:118)<br />        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1<br />841)<br />        at com.apusic.util.concurrent.LinkedBlockingQueue.take(Unknown Source)<br />        at com.apusic.logging.manager.ServerLogManager$PushThread.dequeue(Unknown Source)<br />        at com.apusic.logging.manager.ServerLogManager$PushThread.run(Unknown Source)</p>
		<p>"Low Memory Detector" daemon prio=6 tid=0x00a83c78 nid=0xc5c runnable [0x00000000..0x00000000]</p>
		<p>"CompilerThread0" daemon prio=10 tid=0x00a53910 nid=0x780 waiting on condition [0x00000000..0x02c2f6cc]</p>
		<p>"Signal Dispatcher" daemon prio=10 tid=0x00a95ae8 nid=0xc8c waiting on condition [0x00000000..0x00000000]</p>
		<p>"Finalizer" daemon prio=8 tid=0x00a50870 nid=0xd10 in Object.wait() [0x02baf000..0x02bafa6c]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x230d25c8&gt; (a java.lang.ref.ReferenceQueue$Lock)<br />        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:120)<br />        - locked &lt;0x230d25c8&gt; (a java.lang.ref.ReferenceQueue$Lock)<br />        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:136)<br />        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)</p>
		<p>"Reference Handler" daemon prio=10 tid=0x00a4f3e8 nid=0x1d0 in Object.wait() [0x02b6f000..0x02b6faec]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x230d2650&gt; (a java.lang.ref.Reference$Lock)<br />        at java.lang.Object.wait(Object.java:474)<br />        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)<br />        - locked &lt;0x230d2650&gt; (a java.lang.ref.Reference$Lock)</p>
		<p>"main" prio=6 tid=0x00038c00 nid=0x7fc in Object.wait() [0x0007f000..0x0007fc3c]<br />        at java.lang.Object.wait(Native Method)<br />        - waiting on &lt;0x230e0ed8&gt; (a com.apusic.server.J2EEServer)<br />        at java.lang.Object.wait(Object.java:474)<br />        at com.apusic.server.J2EEServer.startup(Unknown Source)<br />        - locked &lt;0x230e0ed8&gt; (a com.apusic.server.J2EEServer)<br />        at com.apusic.server.Main.main(Unknown Source)</p>
		<p>"VM Thread" prio=10 tid=0x00a80190 nid=0xab4 runnable</p>
		<p>"VM Periodic Task Thread" prio=10 tid=0x00a8e808 nid=0x684 waiting on condition</p>
		<p>参考：<br /><a href="http://infocenter.apusic.com/help/index.jsp?topic=/com.apusic.studio.doc.server/output/eclipse/threadpool.html">http://infocenter.apusic.com/help/index.jsp?topic=/com.apusic.studio.doc.server/output/eclipse/threadpool.html</a></p><img src ="http://www.blogjava.net/zhuyuanxiang/aggbug/210484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyuanxiang/" target="_blank">朱远翔-Apusic技术顾问</a> 2008-06-25 11:57 <a href="http://www.blogjava.net/zhuyuanxiang/archive/2008/06/25/210484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>