存档

‘resin’ 分类的存档

xml类型的配置文件包含特殊字符的处理

2010年4月22日 2 条评论

resin的配置文件类似xml,语法规范也遵循xml的写法,今天遇到了特殊字符的问题,数据库密码包含了特殊字符。
<init-param driver-name=”oracle.jdbc.driver.OracleDriver”/>
  <init-param url=”jdbc:oracle:thin:@localhost:1521:Test”/>
  <init-param user=”username”/>
  <init-param password=”123&(45aq”/>

</resource-ref>

#sh start_server.sh
Starting Resin on Thu, 22 Apr 2010 18:39:48 +0800 (CST)
com.caucho.xml.XmlParseException: /home/resin/conf/resin.conf:8: malformed entity ref at `(‘
        at com.caucho.xml.XmlParser.error(XmlParser.java:2769)
        at com.caucho.xml.XmlParser.parseCharacterReference(XmlParser.java:1002)
        at com.caucho.xml.XmlParser.parseValue(XmlParser.java:1192)
        at com.caucho.xml.XmlParser.parseAttributes(XmlParser.java:702)
        at com.caucho.xml.XmlParser.parseElement(XmlParser.java:603)
        at com.caucho.xml.XmlParser.parseNode(XmlParser.java:377)
        at com.caucho.xml.XmlParser.parseInt(XmlParser.java:248)
        at com.caucho.xml.AbstractParser.parse(AbstractParser.java:645)
        at com.caucho.util.Registry.parse(Registry.java:199)
        at com.caucho.util.Registry.parse(Registry.java:174)
        at com.caucho.server.http.ResinServer.init(ResinServer.java:311)
        at com.caucho.server.http.ResinServer.main(ResinServer.java:1176)

其原因并不是“(”引起的,罪魁祸首是“&”

解决办法是使用&amp;替换&
如:
  <init-param password=”123&amp;(45aq”/>

xml文件中其他的几个特殊字符做同样处理即可:
    * &amp; = & (ampersand)
    * &lt; = < (left angle bracket, less-than sign)
    * &gt; = > (right angle bracket, greater-than sign)
    * &quot; = ” (quotation mark)
    * &apos; = ‘ (apostrophe)

分类: resin 标签:

resin使用了struts/spring等框架与apache整合时需要注意事项

2010年2月6日 评论已被关闭

resin使用了struts/spring等框架与apache整合时需要注意以下:

默认情况resin ResinConfigServer配置不支持除了jsp和servlet之外的其他不规则映射,apache对此类URL会返回404,或者无效的servlet,这就用到了resin的plugin_match配置。
如:
<servlet-mapping url-pattern=”*.do” servlet-name=”plugin_match”/>

几种常见的resin解析方式:
<servlet-mapping url-pattern=”*.jsp” servlet-name=”jsp”/>                  #jsp文件
<servlet-mapping url-pattern=”/servlet/*” servlet-name=”invoker”/>    #标准的servlet
<servlet-mapping url-pattern=”*.xtp” servlet-name=”xtp”/>                  #resin自定义的一种格式
<servlet-mapping url-pattern=”*.do” servlet-name=”plugin_match”/>   #扩展匹配,如struts

分类: resin 标签:

apache+resin集群配置,将指定接口的请求(servlet)转到特定resin的配置

2009年5月6日 评论已被关闭

apache+resin集群配置,将指定接口的请求(servlet)转到特定resin的配置。
需求如下:将某个特定url的请求转到特定的后台resin服务器上,其余的请求仍然保持cluster状态

resin2的配置
httpd.conf
<IfModule mod_caucho.c>
  <Location /MyServlet*>
    CauchoConfigFile conf/resin-test.conf
  </Location>
  CauchoConfigFile conf/resin-all.conf
</IfModule>

resin-test.conf
<caucho.com>
  <http-server>
    <srun host=’192.168.1.100′ port=’6800’/>
    <servlet-mapping url-pattern=’/MyServlet/*’ servlet-name=’invoker’/>
  </http-server>
</caucho.com>

resin-all.conf
<caucho.com>
  <http-server>
    <srun host=’192.168.1.100′ port=’6800’/>
    <srun host=’192.168.1.101′ port=’6800’/>
    <servlet-mapping url-pattern=’/servlet/*’ servlet-name=’invoker’/>
    <servlet-mapping url-pattern=’*.jsp’ servlet-name=’com.caucho.jsp.JspServlet’/>
  </http-server>
</caucho.com>

resin3的配置,相对resin2简单一些,只要在apache中做如下配置:
httpd.conf
<Location /MyServlet* >
  ResinConfigServer 192.168.1.100 6800
</Location>

ResinConfigServer 192.168.1.100 6800
ResinConfigServer 192.168.1.101 6800

分类: resin 标签:

resin容器下获取web-app的绝对路径

2009年2月14日 评论已被关闭

为了获得web-app目录中的.properties文件,需要先取得web-app的WEB-INF目录,网上有很多的方法,大致描述如下:

1、java程序中中获得
System.out.println(“1″+Thread.currentThread().getContextClassLoader().getResource(“”));
System.out.println(“2″+TestPath.class.getResource(“”));
System.out.println(“3″+TestPath.class.getResource(“/”));
System.out.println(“4″+TestPath.class.getClassLoader().getResource(“”));
System.out.println(“5″+ClassLoader.getSystemResource(“”));
System.out.println(“6″+TestPath.class.getClassLoader().getResource(“src.com.2hei.net.util”));
System.out.println(“7″+new File(“”).getAbsolutePath());


2、在jsp中获得web-app目录

根目录:request.getRequestURI()
文件的绝对路径  :application.getRealPath(request.getRequestURI());
当前web应用的绝对路径 :application.getRealPath(“/”);

3、Servlet中获得当前应用的相对路径和绝对路径
根目录:request.getServletPath();
文件的绝对路径 :
javax.servlet.http.HttpSession.getServletContext()
request.getSession().getServletContext().getRealPath
当前web应用的绝对路径 :servletConfig.getServletContext().getRealPath(“/”);

但是我遇到的问题是使用java来获得web-app目录始终得到的是容器的root目录,比如我使用的是resin3.1.6,使用java程序获得的目录始终都是/home/resin-3.1.6。
想尽了办法,把caucho.com的文档翻了个遍,也尝试了class-loader等resource等配置,始终无法配置好,我又不想使用jsp或者servlet来获取,于是想到了如下的土办法。

resin.conf 或者resin.xml中配置(详见resin-doc)
  <env-entry>
    <env-entry-name>greeting</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>I‘m 2hei</env-entry-value>
  </env-entry>

调用方法:
  public void init()
    throws ServletException
  {
    try {
      Context env =
        (Context) new InitialContext().lookup(“java:comp/env”);
      greeting = (String) env.lookup(“greeting”);
    } catch (NamingException e) {
      throw new ServletException(e);
    }
  }
然而,见证奇迹的时刻终于到来了!
现有java文件编译后是给打成了jar包来进行发布,放到了WEB-INF/lib目录中,这样使用java获得的web-app位置就是resin的home目录
我尝试不打jar包,将class放到WEB-INF/classes中,使用java来获取应用程序的绝对路径居然可以了,真不知道resin是如何加载jar包的。汗ing。。。

不过既然问题解决了,就此记录下来,以作备忘。

再者,今天是2.14 情人节,就祝愿天下有情人终成眷属!

分类: java, resin 标签:

resin3 resin-admin管理后台的配置

2008年12月4日 评论已被关闭

resin3自带caucho-status页面,不过页面显示内容不是很详细,其提供的admin页面更能够详细的记录resin的运行状况。
在resin.conf中添加如下配置:

  <management path=”/home/resin3/php/admin”>
    <user name=”admin” password=””/>
  </management>

另外添加  
    <web-app id=”/resin-admin” root-directory=”/home/resin3/php/admin”>
     <prologue>
        <resin:set var=”resin_admin_user” value=”admin”/>  
        <resin:set var=”resin_admin_password” value=””/>  
        <resin:set var=”resin_admin_external” value=”true”/>  

     </prologue>
  </web-app>
注意<resin:set var=”resin_admin_external” value=”true”/>  的设置是允许外部进行管理,可以添加ip访问限制,否则可能存在安全隐患。
配置好以后使用 https://ip/resin-admin/login.php登陆
2008-12-04_140732.png
  

这里可以输入用户名、密码来生成你需要的md5加密后的口令,然后添加到resin.conf中。
2008-12-04_140836.png

登陆以后的页面如下:
2008-12-04_140443.png

可以看到summary、config、threads等,可惜的是heap、cache、cluster等功能都是professional版本才可以。
2008-12-04_140530.png

可以看到数据库连接池、TCP连接数及使用的内存等数据,还是比较直观的一个工具哟!

分类: resin 标签:

resin3的优化配置

2008年11月23日 1 条评论

说明:
本文是在apache2+resin3(开源版)环境下的配置,主要是对resin3配置进行了分析,详细调试请见caucho-doc ,apache2的调优见apache的man文档。实践总结,如转载请注明出处–2hei.net 谢谢.

  Using Resin(R)  under the GNU Public License (GPL).
  See
http://www.caucho.com for information on Resin Professional,
  including caching, clustering, JNI acceleration, and OpenSSL integration.

resin配置文件:  resin.conf

1、dependency-check-interval 参数调整
resin检查系统配置及java、jsp、resin.conf等文件的时间间隔。
默认值为2秒,适合开发及调试环境,如果是正式环境尽量把参数调大或者直接改为-1,不允许检查,也就是禁止了热部署。
<dependency-check-interval>-1s</dependency-check-interval>

2、缓存
改变cache-mapping的值:
      <cache-mapping url-pattern=”/” expires=”5s”/>
      <cache-mapping url-pattern=”*.gif” expires=”60s”/>
      <cache-mapping url-pattern=”*.jpg” expires=”60s”/>
      <cache-mapping url-pattern=”*.png” expires=”60s”/>
3、jvm优化
jvm需要根据你的系统配置及应用来调整。

JVM OPTION PASSED TO RESIN     MEANING
-Xms                           initial java heap size
-Xmx                           maximum java heap size
-Xmn                           the size of the heap for the young generation

将-Xms和-Xmx设置为一样大小是不错的选择。
如: bin/httpd.sh -Xms500M -Xmx500M -Xmn100M

更多的关于jvm优化参数如:young generation、Eden generation、older generation可见
Sun documentation on garbage collection

jvm的监控,google一下有很多的工具,如:jconsole jstat jstack

jconsole的使用见我的另外一篇文章 《使用Jconsole对java的内存使用情况(JVM)进行监控

$jps
1229 Jps
1003 Resin
973 resin.jar

$jmap 973
Attaching to process ID 973, please wait…
Debugger attached successfully.
Server compiler detected.
JVM version is 1.5.0_16-b02
0x0000000040000000      64K     /home/jdk1.5.0_16/bin/java
0x00000030b2a00000      127K    /lib64/ld-2.5.so
0x00000030b2e00000      1647K   /lib64/libc-2.5.so
0x00000030b3200000      22K     /lib64/libdl-2.5.so
0x00000030b3600000      600K    /lib64/libm-2.5.so
0x00000030b3a00000      138K    /lib64/libpthread-2.5.so
0x00000030b5a00000      111K    /lib64/libnsl-2.5.so
0x00002aaab46ad000      26K     /home/jdk1.5.0_16/jre/lib/amd64/libmanagement.so
0x00002aaab49de000      79K     /home/jdk1.5.0_16/jre/lib/amd64/libnet.so
0x00002aeeac3c1000      9933K   /home/jdk1.5.0_16/jre/lib/amd64/server/libjvm.so
0x00002aeeacd46000      43K     /home/jdk1.5.0_16/jre/lib/amd64/native_threads/libhpi.so
0x00002aeeace61000      52K     /lib64/libnss_files-2.5.so
0x00002aeead06c000      58K     /home/jdk1.5.0_16/jre/lib/amd64/libverify.so
0x00002aeead17b000      171K    /home/jdk1.5.0_16/jre/lib/amd64/libjava.so
0x00002aeead2a5000      78K     /home/jdk1.5.0_16/jre/lib/amd64/libzip.so

jstat -gc 1489 1000 3
 S0C    S1C    S0U    S1U      EC       EU        OC         OU         PC     PU        YGC     YGCT  FGC     FGCT     GCT  
43648.0 43648.0  0.0    0.0   262208.0 101390.5  699072.0   18545.6   28032.0 15756.6      1    0.055   1      0.115    0.170
43648.0 43648.0  0.0    0.0   262208.0 101390.5  699072.0   18545.6   28032.0 15756.6      1    0.055   1      0.115    0.170
43648.0 43648.0  0.0    0.0   262208.0 101390.5  699072.0   18545.6   28032.0 15756.6      1    0.055   1      0.115    0.170

jstack 1489
Thread 1495: (state = BLOCKED)
 – java.lang.Object.wait(long) @bci=0 (Interpreted frame)
 – java.lang.Object.wait() @bci=2, line=474 (Interpreted frame)
 – java.lang.ref.Reference$ReferenceHandler.run() @bci=46, line=116 (Interpreted frame)

Thread 1489: (state = IN_NATIVE)
 – java.net.SocketInputStream.socketRead0(java.io.FileDescriptor, byte[], int, int, int) @bci=0 (Interpreted frame)
 – java.net.SocketInputStream.read(byte[], int, int) @bci=84, line=129 (Interpreted frame)
 – java.net.SocketInputStream.read() @bci=23, line=182 (Interpreted frame)
 – com.caucho.server.resin.Resin.waitForExit() @bci=304, line=1265 (Interpreted frame)
 – com.caucho.server.resin.Resin.main(java.lang.String[]) @bci=42, line=1367 (Interpreted frame)
 

4、JNI加速
resin不使用NIO而是使用了JNI的方式使用本地码的方式来提升效率,经验证,resin使用JNI的效率要高于使用NIO,
使用JNI是需要对resin进行编译,在./configure时把jni编译进去,

./configure –enable-jni      美中不足的是Resin Professional版本才提供此项功能。

下面是resin-doc的说明:
Resin does not use NIO – it uses JNI to handle low-level I/O calls with native code. The performance using this method was found to be much better than nio.

5、jsp第一次编译的处理
一般来讲,第一次访问jsp会自动进行编译,如果更新了过多的jsp、且系统访问很大的话,重启resin容易造成负载过高。

下面配置是启动app-server时,对所有的jsp进行编译,编译完毕后启动监听,这样启动时间会长一些,但是可以防止第一次访问编译造成系统负载大。
      <listener>
        <listener-class>com.caucho.jsp.JspPrecompileListener</listener-class>
        <init>
          <extension>jsp</extension>
          <extension>jspx</extension>
        </init>
      </listener>
6、resin 与apache 性能的比较
resin3单独使用时性能也是不错,当然也可以跟apache配合使用。下面是resin-doc中的说法:
For JSP and Servlets, Resin standalone is certainly faster than Resin/Apache. Because of the extra overhead of the Resin/Apache connection, the Resin/Apache configuration is necessarily slower than Resin standalone.
可以看出各有优劣,
apache对于静态页面来说比较快。如果使用了SSL,apache+resin要比resin单独使用快一些,更为重要的是resin3的开源版本不支持ssl。

7resin-server TIME_WAIT 过多的处理
thread-max指定了最大连接数,socket-timeout是socket超时时间
keepalive-max指定了长连接的数量,这是可以重复使用的连接,netstat -an时系统可以看到响应数量的ESTABLISHED状态
设定keepalive-max和把keepalive-timeout调小可以减少TIME_WAIT的数量。
      <thread-max>256</thread-max>
      <socket-timeout>65s</socket-timeout>
      <keepalive-max>128</keepalive-max>
      <keepalive-timeout>120s</keepalive-timeout>
一般来讲如果是Resin standalone方式,调整timeout并不是很重要,如果是apache+resin的方式,而且apache压力很大的情况下,需要调小timeout的值。
load-balance-idle-time是用来设置load-balance和分布式session的关闭时间,默认时间为keepalive-timeout – 1s
<load-balance-idle-time>100s</load-balance-idle-time>

8、关于watchdog
resin3启动是多了一个watchdog的进程。可以单独启动也可以跟随resin.jar一起启动,主要是用来监控resin jvm实例,在必要的时候重启。

<watchdog-jvm-arg>-Dcom.sun.management.jmxremote</watchdog-jvm-arg>
<watchdog-port>6600</watchdog-port>

查看  watchdog  状态   
java -jar lib/resin.jar status
Resin/3.1.6 status for watchdog at 127.0.0.1:6600

server ” : active
  password: missing
  user: root
  root: /home/resin/
  conf: /home/resin/conf/resin.conf

分类: resin 标签:

resin jsp auto-compile

2008年8月5日 评论已被关闭

因为resin的自动编译及热部署的特性颇受大家的欢喜,这里总结一下resin2.x下关于自动编译的问题

Resin中 “resin.conf” 自动编译的设置:

1.class-update-interval
  检测servlet更新的时间间隔,默认值2秒
  使用:在  <http-server>标签下:
  <class-update-interval>2s</class-update-interval>
 
2.config-update-interval
  检测配置文件configuration更新的时间间隔,默认值为class-update-interval指定的值 
  使用:在  <http-server>标签下:
  <config-update-interval>2s</config-update-interval> 
 
3.jsp-update-interval
  检测jsp文件的更新时间:默认值为class-update-interval指定的值 
  使用:
  <jsp jsp-update-interval=’300s’ precompile=’true’ static-encoding=’true’ recompile-on-error=’true’/>
  其中: precompile 预编译
         static-encoding  允许静态字符编码,默认为true

一般来讲生产环境还是要加大resin对class文件的变化检测的时间间隔,或者干脆不允许扫描。
如果以上方法都无效的话,只能使出俺的必杀技–在jsp标签中添加这句话 auto-compile=’false’ ,意为不允许编译!

具体请见resin的官网相关介绍!
http://caucho.com/resin-2.1/ref/app-config.xtp#config-update-interval
 
<class-update-interval>s</class-update-interval>

jsp-update-interval
auto-compile

<jsp auto-compile=’false’ jsp-update-interval=’300s’ precompile=’true’ static-encoding=’true’ recompile-on-error=’true’/>

class-update-interval
    Resin 1.1
Interval in seconds between checking for servlet updates. For development, this can be set to 0 or to a small number to pick up new servlet versions quickly. For deployment, class-update-interval can be large to avoid the overhead of checking for updates.
The default value is 2 seconds.

config-update-interval
    Resin 2.0

Interval in seconds between checking for configuration updates. For development, this can be set to 0 or to a small number to pick up new configuration file versions quickly. For deployment, config-update-interval can be large to avoid the overhead of checking for updates.

The default value is the value of class-update-interval.

分类: resin 标签:

apache 与resin2或者resin3 的整合配置

2008年6月28日 评论已被关闭

apached的下载及编译:
http://www.apache.org/
这里选择动态加载模块,如果需要其他模块的可以自行添加。

./configure –prefix=/home/2hei/apache2 –enable-module=so
make
make install

resin的下载及编译:
http://www.caucho.com/download  下载resin2的版本或者resin3的版本
./configure
make
make install

修改apache的配置:默认安装resin后会给httpd.conf写入一些东西,
但是对于resin2不好用,网上的一些配置也没有找到真正能用得,google了许久,下面的终于可以使用了。

#httpd.conf for resin2.1.*

#
# mod_caucho Resin Configuration
#

LoadModule caucho_module /home/2hei/apache2/modules/mod_caucho.so
#CauchoConfigFile /home/2hei/soft/resin/conf/resin.conf
#CauchoServerRoot /home/2hei/apache2
CauchoHost localhost 6802
AddHandler caucho-request jsp
<Location /servlet/*>
   SetHandler caucho-request
</Location>

对于resin3,安装后的配置基本上可以使用。

httpd.conf   for resin3.1.6
#
# mod_caucho Resin Configuration
#

LoadModule caucho_module /home/2hei/apache2/modules/mod_caucho.so

ResinConfigServer localhost 6800
CauchoConfigCacheDirectory /tmp
CauchoStatus yes

也可以配置resin多台主机的负载,或者一台resin上多个srun端口。
如:
<caucho.com>
<http-server>
  <http id=’a’ port=’80’/>
  <srun id=’a’ port=’6802′ host=’192.168.0.1′ srun-index=’1’/>

  <http id=’b’ port=’80’/>
  <srun id=’b’ port=’6802′ host=’192.168.0.2′ srun-index=’2’/>

  <http id=’c’ port=’80’/>
  <srun id=’c’ port=’6802′ host=’192.168.0.3′ srun-index=’3’/>

  <!– enable tcp-store for all hosts/web-apps –>
  <session-config>
    <tcp-store/>
    <save-on-shutdown/>
  </session-config>
  …
</http-server>
</caucho.com>
或者:
<caucho.com>
<http-server>

  <srun id=”a” host=’2hei.net’ port=’6802′ srun-index=’1’/>
  <srun id=”b” host=’2hei.net’ port=’6803′ srun-index=’2’/>
 
</http-server>
</caucho.com>

可以把resin的web-app的doc指向apache的发布目录,如htodoc下面:

接着自己可以写一个jsp页面测试一下:
新建test.jsp 添加如下: 1+1=<%=1+1%>
http://testiP:8080/test.jsp
http://testiP/test.jsp
如果起作用表示整合成功。
http://testiP/caucho_status看看jvm状态。
 

分类: OpenSource, resin 标签: ,

Unsupported major.minor version 49.0

2008年6月26日 评论已被关闭

resin更新到3.1.6了,下了一个玩玩

启动的时候
java -jar lib/resin.jar  报错。
Exception in thread “main” java.lang.UnsupportedClassVersionError: com/caucho/boot/ResinBoot (Unsupported major.minor version 49.0)
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
       
以前在反编译java代码的时候也遇到过类似的问题,应该是java版本出现了问题。
原来的class或者jar的编译版本比较高。
想起来现有的java版本是j2sdk1.4,升级到jdk1.6.0_06后再启动resin,问题解决。

分类: java, resin 标签:

resin jvm 性能调试

2008年4月7日 评论已被关闭

resin3.1.3+jdk1.6+hibernate+struts

配置了多个域名上去,服务器内存2G,jvm -Xmx使用1536m (1.5G)
每每重新上传了程序后必须要重新启动resin服务,虽然非常确定了类已经编译过去了,
但是hibernate还要重新初始化一下,只要2-3次,服务便会报outOfMemoryError错误。
不知道是java程序写的不好,资源没有释放,还是hibernate占用了太多的内存
如果没有上传新类,则没有outOfMemoryError的情况发生。

郁闷之中,恰好手边来了新的伙计,Dell 2950服务器,四核,4G内存,正好可以测试一下。

配置了一下Java的 Web服务。
我想新机器内存大,今儿个哥们高兴,给丫配个3G看看,谁知Resin居然不给面子,没有起来。
 
以下启动是加载的内存:

      <jvm-arg>-Xmx3072m</jvm-arg>
      <jvm-arg>-Xss1m</jvm-arg>
      <jvm-arg>-Xdebug</jvm-arg>
      <jvm-arg>-Dcom.sun.management.jmxremote</jvm-arg>

网上相关文档有介绍 Max Heap 为内存的70%的。

[2hei.net]# java -Xmx3072m -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

[2hei.net]# java -Xmx2560m -version
java version “1.6.0_03”
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode)

经过几番测试后,感觉4G内存加载的最大内存为2560m,也就是2.5G,再大的话,resin无法启动。

分类: resin 标签: ,