1、所需的jar包(jsp2.1):
- servlet-api-2.5-6.x.jar
- jetty-util-6.x.jar
- jetty-6.x.jar
- ant-1.6.5.jar
- core-3.1.1.jar
- jsp-2.1.jar
- jsp-api-2.1.jar
2、示例代码片段:
//设置web根目录
String rootDirectory = System.getProperty("user.dir");
Context context = new WebAppContext(contexts, rootDirectory+"/webapp","/");
context.setWelcomeFiles(new String[]{"index.jsp"});
//端口监听
int port = 80;
Server server = new Server();
Connector httpConnector = new SelectChannelConnector();
httpConnector.setHost(null);
httpConnector.setPort(port);
server.addConnector(httpConnector);
//设置Handler
server.setHandlers(new Handler[] { contexts, new DefaultHandler() });
ServletHandler handler = new ServletHandler();
handler.addServletWithMapping(HttpDemoServlet.class, "/");
ContextHandler contextHandler = new ContextHandler(contexts, "/httpdemo");
contextHandler.setHandler(handler);
try {
//启动服务.
server.start();
}
catch (Exception e) {
e.printStackTrace();
}
posted @
2008-01-03 14:03 josson 阅读(361) |
评论 (0) |
编辑 收藏
Jetty 当前版本为6.1.x,支持servlet2.5、jsp 2.1/2.0。(http://docs.codehaus.org/display/JETTY)
jetty主要的jar为jetty-6.1.1.jar,servlet-api-2.5-6.1.1.jar,jetty-util-
6.1.1.jar。启动的jar
为start.jar。还有jsp规范的jar。jsp2.1,好像已经减了不少的jar了,只有4个文件core-3.1.1.jar,ant-
1.6.5.jar,jsp-2.1.jar,jsp-api-2.1.jar。core是使用eclipse的jdt,进行jsp编译。
jetty的主要配置文件为etc/jetty.xml,当然你可以自己指定别的文件。在start.jar中有个start.config文件是默认的环境配置,以及指定默认的配置文件。可以手工替换。
启动jetty很简单,在命令行下面
java -jar start.jar;如果需要指定start.config,使用java -DSTART=
start.config -jar start.jart;配置web 应用也非常的简单:更改jetty.xml就行了,增加web应用的方式包括,直接放置应用在webapps下面,或者配置以下的context
配置Virtual hosts:
<New class="org.mortbay.jetty.webapp.WebAppContext">
<Arg><Ref id="contexts"/></Arg>
<Arg><SystemProperty name="jetty.home">/webapps/xxx.war</Arg>
<Arg>/xxx</Arg>
<Set name="defaultsDescriptor"><SystemProperty name="jetty.home" default="."/>/etc/webdefault.xml</Set>
<Set name="VirtualHosts">
<Array type="java.lang.String">
<Item>127.0.0.1</Item>
<Item>www.sample.com</Item>
<Item>www.sample.net</Item>
<Item>www.sample.org</Item>
</Array>
</Set>
</New>
context配置($JETTY-HOME/contexts/javadoc.xml):
<Configure class="org.mortbay.jetty.servlet.Context">
<Set name="contextPath">/javadoc</Set>
<Set name="resourceBase"><SystemProperty name="jetty.home" default="."/>/javadoc/</Set>
<Call name="addServlet">
<Arg>org.mortbay.jetty.servlet.DefaultServlet</Arg>
<Arg>/</Arg>
</Call>
</Configure>
默认webapp目录配置:
<Call name="addLifeCycle">
<Arg>
<New class="org.mortbay.jetty.deployer.WebAppDeployer">
<Set name="contexts"><Ref id="Contexts"/></Set>
<Set name="webAppDir"><SystemProperty name="jetty.home" default="."/>/webapps</Set>
<Set name="parentLoaderPriority">false</Set>
<Set name="extract">true</Set>
<Set name="allowDuplicates">false</Set>
<Set name="defaultsDescriptor"><SystemProperty name="jetty.home" default="."/>/etc/webdefault.xml</Set>
</New>
</Arg>
</Call>
默认的web.xml配置文件为webdefault.xml,如果想配置相应的web参数,可以更改其应用。默认的端口为8080,如果想修改,更改:jetty.port属性
<Call name="addConnector">
<Arg>
<New class="org.mortbay.jetty.nio.SelectChannelConnector">
<Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>
<Set name="maxIdleTime">30000</Set>
<Set name="Acceptors">2</Set>
<Set name="confidentialPort">8443</Set>
</New>
</Arg>
</Call>
更详细的配置信息可查询官网。
posted @
2008-01-03 13:51 josson 阅读(1878) |
评论 (0) |
编辑 收藏
http://wiki.forum.nokia.com/index.php/%E4%B8%AD%E6%96%87_J2ME%E4%B8%AD%E6%96%87%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98
posted @
2007-12-28 17:37 josson 阅读(309) |
评论 (0) |
编辑 收藏
该文展示如何结合使用 Jetty servlet 引擎和 DWR 简捷有效地实现一个 Comet Web 应用程序,以及其中的一些细节及原理。
文章地址:
http://www.ibm.com/developerworks/cn/java/j-jettydwr/
一些问题:
1、web.xml配配置,DWR使用2.0RC3以下版本时须全用选项:pollAndCometEnabled代替
activeReverseAjaxEnabled,如下:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<!-- 2.0 RC3以上版本使用.
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
-->
<init-param>
<param-name>pollAndCometEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>initApplicationScopeCreatorsAtStartup</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
选项说明(http://getahead.org/dwr/server/servlet 可查询更多参数的说明):
1)、
activeReverseAjaxEnabled
true 表示激活轮询和 Comet 功能。2.0 RC3以前版本,参数名为:
pollAndCometEnabled。
2)、initApplicationScopeCreatorsAtStartup 通知 DWR 在应用程序启动时初始化
ReverseAjaxTracker
。这将在对 bean 生成第一个请求时改写延迟初始化(lazy initialization)的常规行为 —— 在本例中这是必须的,因为客户机不会主动对
ReverseAjaxTracker
调用方法。
posted @
2007-12-24 10:19 josson 阅读(999) |
评论 (0) |
编辑 收藏
里面有很多DWR使用的经验技巧,有一定的参考价值:
http://www.javatang.com/archives/tag/dwr
posted @
2007-12-24 10:06 josson 阅读(347) |
评论 (0) |
编辑 收藏
1、实现DWR跨域支持
a.配置web.xml文件,dwr定义时加入以下参数设置:
<init-param>
<param-name>allowGetForSafariButMakeForgeryEasier</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>crossDomainSessionSecurity</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>allowScriptTagRemoting</param-name>
<param-value>true</param-value>
</init-param>
b.客户端调用:
//客户端调用时,须指定调用路径,否则默认调用的是当前页面所在服务端的/dwr,而不是实际的/dwr服务。
//故未设置Remote._path时,很可能提示你"dwr/call/plaincall/XXX.ZZZ.dwr"的信息。
//Remote 为dwr.xml中定义的java类对应的jascript名称
Remote._path = 'http://otherdomain.com/webapp/dwr';
//或:dwr.engine._defaultPath = 'http://otherdomain.com/webapp/dwr';
Remote.someFunction();
更详细的说明可参见官网
Remoting Options 章节(http://getahead.org/dwr/browser/engine/options)。
2、DWR的Session支持
DWR通过
WebContext /
WebContextFactory 来取得
HttpServletRequest、
HttpServletResponse、HttpSession、
ServletContext、 ServletConfig等对象。(DWR2.0)实现可参见DWR内部脚本,engine.js文件"
dwr.engine._getJSessionId"部份代码。
更多详细信息见官网API:http://getahead.org/dwr/server/javaapi。
所以SESSION根据jsessionid来确定的,jsessionid存放在cookie中,若客户端禁止cookie的话,jsessionid每次都新生成,所以无法确保在服务端的SESSION唯一。跨域调用DWR时,浏览器默认禁止第三方cookie,所以会有正常使用SESSION功能。设置Internet选项,"隐私","高级",开始对第三方cookie的支持,即可解决这个问题。
posted @
2007-12-24 09:53 josson 阅读(4755) |
评论 (3) |
编辑 收藏
http://luoyuzj911.javaeye.com/blog/148817
posted @
2007-12-20 09:25 josson 阅读(442) |
评论 (0) |
编辑 收藏
http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/protocol-support.html
posted @
2007-12-18 13:18 josson 阅读(274) |
评论 (0) |
编辑 收藏
(来源测试时代,http://www.testage.net)
多数人对怎样去分析工具收集到的测试结果感到无从下手,下面我就把个人工作中的体会和收集到的有关资料整理出来,希望能对大家分析测试结果有所帮助。
分析原则:
• 具体问题具体分析(这是由于不同的应用系统,不同的测试目的,不同的性能关注点)
• 查找瓶颈时按以下顺序,由易到难。
服务器硬件瓶颈-〉网络瓶颈(对局域网,可以不考虑)-〉服务器操作系统瓶颈(参数配置)-〉
中间件瓶颈(参数配置,数据库,
web服务器等)-〉应用瓶颈(SQL语句、数据库设计、业务逻辑、算法等)
注:以上过程并不是每个分析中都需要的,要根据测试目的和要求来确定分析的深度。对一些要求低的,我们分析到应用系统在将来大的负载压力(并发用户数、数据量)下,系统的硬件瓶颈在哪儿就够了。
• 分段排除法 很有效
分析的信息来源:
•1 根据场景运行过程中的错误提示信息
•2 根据测试结果收集到的监控指标数据
一.错误提示分析
分析实例:
1 •Error: Failed to connect to server "10.10.10.30:8080": [10060] Connection
•Error: timed out Error: Server "10.10.10.30" has shut down the connection prematurely
分析:
•A、应用服务死掉。
(小用户时:程序上的问题。程序上处理数据库的问题)
•B、应用服务没有死
(应用服务参数设置问题)
例:在许多客户端连接Weblogic应用服务器被拒绝,而在服务器端没有错误显示,则有可能是Weblogic中的server元素的
AcceptBacklog属性值设得过低。如果连接时收到connection refused消息,说明应提高该值,每次增加25%
•C、数据库的连接
(1、在应用服务的性能参数可能太小了 2、数据库启动的最大连接数(跟硬件的内存有关))
2 Error: Page download timeout (120 seconds) has expired
分析:可能是以下原因造成
•A、应用服务参数设置太大导致服务器的瓶颈
•B、页面中图片太多
•C、在程序处理表的时候检查字段太大多
二.监控指标数据分析
1.最大并发用户数:
应用系统在当前环境(硬件环境、网络环境、软件环境(参数配置))下能承受的最大并发用户数。
在方案运行中,如果出现了大于3个用户的业务操作失败,或出现了服务器shutdown的情况,则说明在当前环境下,系统承受不了当前并发用户的负载压力,那么最大并发用户数就是前一个没有出现这种现象的并发用户数。
如果测得的最大并发用户数到达了性能要求,且各服务器资源情况良好,业务操作响应时间也达到了用户要求,那么OK。否则,再根据各服务器的资源情况和业务操作响应时间进一步分析原因所在。
2.业务操作响应时间:
• 分析方案运行情况应从平均事务响应时间图和事务性能摘要图开始。使用“事务性能摘要”图,可以确定在方案执行期间响应时间过长的事务。
• 细分事务并分析每个页面组件的性能。查看过长的事务响应时间是由哪些页面组件引起的?问题是否与网络或服务器有关?
• 如果服务器耗时过长,请使用相应的服务器图确定有问题的服务器度量并查明服务器性能下降的原因。如果网络耗时过长,请使用“网络监视器”图确定导致性能瓶颈的网络问题
3.服务器资源监控指标:
内存:
1 UNIX资源监控中指标内存页交换速率(Paging rate),如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。也可能是内存访问命中率低。
2 Windows资源监控中,如果Process\Private Bytes计数器和Process\Working
Set计数器的值在长时间内持续升高,同时Memory\Available bytes计数器的值持续降低,则很可能存在内存泄漏。
内存资源成为系统性能的瓶颈的征兆:
很高的换页率(high pageout rate);
进程进入不活动状态;
交换区所有磁盘的活动次数可高;
可高的全局系统CPU利用率;
内存不够出错(out of memory errors)
处理器:
1 UNIX资源监控(Windows操作系统同理)中指标CPU占用率(CPU
utilization),如果该值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于SQL
Server,可接受的最大上限是80-85%
合理使用的范围在60%至70%。
2 Windows资源监控中,如果System\Processor Queue Length大于2,而处理器利用率(Processor Time)一直很低,则存在着处理器阻塞。
CPU资源成为系统性能的瓶颈的征兆:
很慢的响应时间(slow response time)
CPU空闲时间为零(zero percent idle CPU)
过高的用户占用CPU时间(high percent user CPU)
过高的系统占用CPU时间(high percent system CPU)
长时间的有很长的运行进程队列(large run queue size sustained over time)
磁盘I/O:
1 UNIX资源监控(Windows操作系统同理)中指标磁盘交换率(Disk rate),如果该参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。
2 Windows资源监控中,如果 Disk Time和Avg.Disk Queue Length的值很高,而Page Reads/sec页面读取操作速率很低,则可能存在磁盘瓶径。
I/O资源成为系统性能的瓶颈的征兆 :
过高的磁盘利用率(high disk utilization)
太长的磁盘等待队列(large disk queue length)
等待磁盘I/O的时间所占的百分率太高(large percentage of time waiting for disk I/O)
太高的物理I/O速率:large physical I/O rate(not sufficient in itself)
过低的缓存命中率(low buffer cache hit ratio(not sufficient in itself))
太长的运行进程队列,但CPU却空闲(large run queue with idle CPU)
4.数据库服务器:
SQL Server数据库:
1 SQLServer资源监控中指标缓存点击率(Cache Hit Ratio),该值越高越好。如果持续低于80%,应考虑增加内存。
2 如果Full Scans/sec(全表扫描/秒)计数器显示的值比1或2高,则应分析你的查询以确定是否确实需要全表扫描,以及SQL查询是否可以被优化。
3 Number of Deadlocks/sec(死锁的数量/秒):死锁对应用程序的可伸缩性非常有害,并且会导致恶劣的用户体验。该计数器的值必须为0。
4 Lock Requests/sec(锁请求/秒),通过优化查询来减少读取次数,可以减少该计数器的值。
Oracle数据库:
1 如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.90,那么需要增加SHARED_POOL_SIZE的大小。
快存(共享SQL区)和数据字典快存的命中率:
select(sum(pins-reloads))/sum(pins) from v$librarycache;
select(sum(gets-getmisses))/sum(gets) from v$rowcache;
自由内存: select * from v$sgastat where name=’free memory’;
2 如果数据的缓存命中率小于0.90,那么需要加大DB_BLOCK_BUFFERS参数的值(单位:块)。
缓冲区高速缓存命中率:
select name,value from v$sysstat where name in ('db block gets’,
'consistent gets','physical reads') ;
Hit Ratio = 1-(physical reads / ( db block gets + consistent gets))
3 如果日志缓冲区申请的值较大,则应加大LOG_BUFFER参数的值。
日志缓冲区的申请情况 :
select name,value from v$sysstat where name = 'redo log space requests' ;
4 如果内存排序命中率小于0.95,则应加大SORT_AREA_SIZE以避免磁盘排序 。
内存排序命中率 :
select round((100*b.value)/decode((a.value+b.value), 0, 1,
(a.value+b.value)), 2)from v$sysstat a, v$sysstat b where a.name='sorts
(disk)' and b.name='sorts (memory)'
注:上述SQL Server和Oracle数据库分析,只是一些简单、基本的分析,特别是Oracle数据库的分析和优化,是一门专门的技术,进一步的分析可查相关资料。
posted @
2007-12-18 13:16 josson 阅读(593) |
评论 (0) |
编辑 收藏
问题描述:
原来一直运行正常的Mysql,突然无法运法连接,查询。启动Mysql后,虽然进程建立,但
/tmp/mysql.socket没有生成,客户端无法连接到数据库,也不能正常停止数据库,只能通过杀进程来停止服务。
解决方法:
查询数据库日志,data/pc-name.err,发现“/usr/local/mysql/bin/mysqld: Disk is full writing './mysql-bin.000124' (Errcode: 28). Waiting for someone to free space... Retry in 60 secs”,查看硬盘空间(df),果然/usr分区已经满了,清理分区后,重启Mysql,一切正常。
另:/data/目录下,有若干
mysql-bin.000***的文件,从mysql-bin.000001开始一直排列下来,而且有的占用了大量硬盘空间。网上搜了一下,得知此乃
MySQL的事务日志,logbin主要是用来做回滚和增量备份的。
删除复制服务器已经拿走的binlog是安全的,一般来说网络状况好的时候,保留最新的那一个足以。(缺点是将无法使数据库恢复先前的状态)
posted @
2007-12-12 10:44 josson 阅读(1835) |
评论 (0) |
编辑 收藏