javamelody对Java Application进行监控
前面写过对于webapp,用javamelody来监控、分析性能是挺方便的;那要对普通的java应用进行监控,只需要在应用上启动一个嵌入式web容器就可以了。
javamelody里面的war包就用了winstone 作为Servlet容器,可以直接启动;本文是以Jetty为例,在应用中嵌入一个jetty:

import java.util.EventListener;
import java.util.HashMap;
import java.util.Map; import javax.servlet.Filter; import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Handler;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.bio.SocketConnector;
import org.mortbay.jetty.handler.ContextHandlerCollection;
import org.mortbay.jetty.handler.ResourceHandler;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.DefaultServlet;
import org.mortbay.jetty.servlet.FilterHolder;
import org.mortbay.thread.QueuedThreadPool;
import org.springframework.web.context.ContextLoaderListener; /**
* 启动一个jetty容器,结合javamelody用于监控应用性能
* @author langke
* 2012-12-21
*/
public class JavaMelodyMonitorServer {
private ESLogger log = Loggers.getLogger(JavaMelodyMonitorServer.class);
Server webServer;
/**
*
* @param serverName 应用名称
* @param host 绑定的IP地址
* @param serverPort 应用端口,jetty启动的端口默认会在此基础上加1000,如果配置文件有配置jetty.listen.port则配置优先
*/
public JavaMelodyMonitorServer(String serverName,String host,int serverPort) {
init(serverName, host, serverPort);
start();
final JavaMelodyMonitorServer server = this;
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
try {
log.info("shutdown mointorServer:{}", server);
server.stop();
} catch (Exception e) {
log.error("run main stop error!", e);
}
} });
} private void init(String serverName,String host,int serverPort){
int defaultValue = serverPort+1000;
int port = Config.get().getInt("jetty.listen.port", defaultValue);
Connector connector = new SocketConnector();
webServer = new Server();
QueuedThreadPool pool = new QueuedThreadPool();
pool.setMinThreads(Config.get().getInt("jetty.pool.MinThread", 3));
pool.setMaxThreads(Config.get().getInt("jetty.pool.MaxThread", 32));
String server = host;
pool.setName(serverName+"-monitor");
pool.setDaemon(true);
webServer.setThreadPool(pool);
connector = new SocketConnector(); connector.setPort(port);
connector.setHost(server);
connector.setMaxIdleTime(60000); // 1 min
webServer.addConnector(connector); ContextHandlerCollection col = new ContextHandlerCollection();
Context context = new Context(col, "/", Context.SESSIONS);
ResourceHandler resourceHandler = new ResourceHandler();
webServer.setHandlers(new Handler[] {col,resourceHandler });
webServer.addHandler(context);
// Set Java Melody storage Directory
System.setProperty("javamelody.storage-directory", "javamelody-"+pool.getName()); //add filter
Filter monitoringFilter = new net.bull.javamelody.MonitoringFilter();
context.addFilter(new FilterHolder(monitoringFilter), "/monitoring", Handler.REQUEST); Map<String,String> initParams = new HashMap<String,String>();
initParams.put("contextConfigLocation", "classpath:net/bull/javamelody/monitoring-spring.xml");
context.setInitParams(initParams); //add listener
EventListener listener = new ContextLoaderListener();
context.addEventListener(listener); context.addServlet(DefaultServlet.class, "/*"); } private void start(){
try{
webServer.join();
webServer.start();
}catch (Exception e){
log.error("Error starting httpserver", e);
}
} private void stop(){
try{
webServer.stop();
webServer.destroy();
}catch (Exception e){
log.error("Error stop httpserver", e);
} }
}

这个jetty加了shutdown hook,应用关闭的时候会自己关闭容器。
然后在你的Application里实例化这个类就行了;
需要的jar依赖名如下:
servlet-api-3.0.jar
org.springframework.web-3.1.0.RELEASE.jar
jrobin-1.5.9.1.jar
jetty-util-6.1.26.jar
jetty-6.1.26.jar
javamelody.jar
com.springsource.net.sf.cglib-2.2.0.jar
如果使用spring框架,监控配置就比较简单,可以对某个包所有类进行监控:

<bean id="facadeMonitoringAdvisor" class="net.bull.javamelody.MonitoringSpringAdvisor">
<property name="pointcut">
<bean class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="pattern" value="org.langke.core.service.*" />
</bean>
</property>
</bean>

监控数据源:
<bean id="springDataSourceBeanPostProcessor" class="net.bull.javamelody.SpringDataSourceBeanPostProcessor">
</bean> <bean id="wrappedDataSource" class="net.bull.javamelody.SpringDataSourceFactoryBean">
<property name="targetName" value="dataSource" />
</bean>
还有一种方式:注解
只需添加注解@net.bull.javamelody.MonitoredWithGuice在你的实现类或者你要监控的方法:使用net.bull.javamelody.MonitoringProxy类代理
详见:http://code.google.com/p/javamelody/wiki/UserGuide#10._Business_facades_(if_Guice)
如果不用Spring也不用Guice还有一种简单的方法实现监控
具体的集成方式,稍后会在我的github发布出来
https://github.com/langke93/rest-nettyserver
javamelody对Java Application进行监控的更多相关文章
- Java 服务端监控方案(四. Java 篇)
http://jerrypeng.me/2014/08/08/server-side-java-monitoring-java/ 这个漫长的系列文章今天要迎来最后一篇了,也是真正与 Java 有关的部 ...
- Java微服务监控及与普罗米集成
一. 背景说明 Java服务级监控用于对每个应用占用的内存.线程池的线程数量.restful调用数量和响应时间.JVM状态.GC信息等进行监控,并可将指标信息同步至普罗米修斯中集中展示和报警.网 ...
- velocity模板引擎学习(4)-在standalone的java application中使用velocity及velocity-tools
通常velocity是配合spring mvc之类的框架在web中使用,但velocity本身其实对运行环境没有过多的限制,在单独的java application中也可以独立使用,下面演示了利用ve ...
- maven: 打包可运行的jar包(java application)及依赖项处理
IDE环境中,可以直接用exec-maven-plugin插件来运行java application,类似下面这样: <plugin> <groupId>org.codehau ...
- How to run a (Tomcat)Java application server on a Azure virtual machine
http://www.windowsazure.com/en-us/documentation/articles/virtual-machines-java-run-tomcat-applicatio ...
- The differences between Java application and Java applet
在Java语言中,能够独立运行的程序称为Java应用程序(Application).Java语言还有另外一种程序--Applet程序.Applet程序(也称Java小程序)是运行于各种网页文件中,用于 ...
- Java Applet与Java Application的区别
转自:http://www.educity.cn/java/500609.html 在Java语言中,能够独立运行的程序称为Java应用程序(Application).Java语言还有另外一种程序-- ...
- How to deploy JAVA Application on Azure Service Fabric
At this moment, Azure Service Fabric does not support JAVA application natively (but it's on the sup ...
- Java Applet与Java Application的特点
java application是应用程序,用于桌面开发,java applet是小应用程序,一般嵌入到网页里运行.applet一般用于B/S页面上作为插件式的开发,而application主要是桌面 ...
随机推荐
- 【Linux】CentOS7安装tomcat8.5.45,这方法也太简单了吧!
1.下载tomcat https://tomcat.apache.org/download-80.cgi 选择tar.gz.下载完大概9495kb大小的压缩包 2.将文件从Windows复制到Cent ...
- java方法句柄-----1.方法句柄类型、调用
目录 方法句柄 1.方法句柄的类型 1.1MethodType类的对象实例的创建 1.1.1 通过指定参数和返回值的类型来创建MethodType.[显式地指定返回值和参数的类型] 1.1.2 通过静 ...
- Java实现 LeetCode 718 最长重复子数组(动态规划)
718. 最长重复子数组 给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度. 示例 1: 输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释 ...
- Java实现 LeetCode 435 无重叠区间
435. 无重叠区间 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠. 注意: 可以认为区间的终点总是大于它的起点. 区间 [1,2] 和 [2,3] 的边界相互"接触& ...
- Java实现 蓝桥杯VIP 算法提高 复数求和
算法提高 复数求和 时间限制:1.0s 内存限制:512.0MB 从键盘读入n个复数(实部和虚部都为整数)用链表存储,遍历链表求出n个复数的和并输出. 样例输入: 3 3 4 5 2 1 3 样例输出 ...
- Java实现背包问题
1 问题描述 给定n个重量为w1,w2,w3,-,wn,价值为v1,v2,-,vn的物品和一个承重为W的背包,求这些物品中最有价值的子集(PS:每一个物品要么选一次,要么不选),并且要能够装到背包. ...
- 一个Redis查询案例
1.远程登陆进服务器 使用ssh连接至Linux服务器中 2.接入redis集群 redis-cli -h 10.1.8.12 -p 29000 3.执行查询命令 根据userid查询用户的最近在线时 ...
- 微信小程序 简单获取屏幕视口高度
由于小程序的宽度是固定的 750rpx,我们可以先用wx.getSystemInfo 来获取可使用窗口的宽高(并非rpx),结合750rpx的宽度算出比例,再用比例来算出高度 let that = t ...
- Vue-websocket使用
Vue中使用websocket 1.介绍:websocket是一个双向通行工具,解决了原来的http单向通信的弊端,可以让服务器主动向客户端推送数据 // 安装客户端的socket npm i soc ...
- Mybatis详解(二) sqlsession的创建过程
我们处于的位置 我们要清楚现在的情况. 现在我们已经调用了SqlSessionFactoryBuilder的build方法生成了SqlSessionFactory 对象. 但是如标题所说,要想生成sq ...