<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dariusz Ludera Homepage &#187; richfaces</title>
	<atom:link href="http://ludera.info/tag/richfaces/feed" rel="self" type="application/rss+xml" />
	<link>http://ludera.info</link>
	<description>Dariusz Ludera oficjalna strona. Programista Java i JEE. Dariusz Ludera Homepage. Java and JEE developer.</description>
	<lastBuildDate>Sun, 27 Feb 2011 01:18:11 +0000</lastBuildDate>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>Monitoring podstawowych parametrów JVM z poziomu web aplikacji</title>
		<link>http://ludera.info/java/monitoring-podstawowych-parametrow-jvm-z-poziomu-web-aplikacji</link>
		<comments>http://ludera.info/java/monitoring-podstawowych-parametrow-jvm-z-poziomu-web-aplikacji#comments</comments>
		<pubDate>Sun, 06 Jun 2010 19:05:52 +0000</pubDate>
		<dc:creator>Dariusz Ludera</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[richfaces]]></category>

		<guid isPermaLink="false">http://ludera.info/?p=552</guid>
		<description><![CDATA[Problem Monitoring podstawowych parametrów JVM z poziomu web aplikacji &#8211; przydatne zwłaszcza wtedy, gdy nasz serwer aplikacji/kontener serwletów nie pokazuje takich informacji w swojej webowej konsoli i nie mamy możliwości szybkiego podpięcia się VisualVM albo JConsole (brak aktywowanego jmxremote, firewalle, czy cokolwiek innego uniemożliwiającego połączenie), a podejrzewamy że coś niedobrego może dziać się z naszą [...]]]></description>
			<content:encoded><![CDATA[<h2>Problem</h2>
<p>Monitoring podstawowych parametrów JVM z poziomu web aplikacji &#8211; przydatne zwłaszcza wtedy, gdy nasz serwer aplikacji/kontener serwletów nie pokazuje takich informacji w swojej webowej konsoli i nie mamy możliwości szybkiego podpięcia się <a title="VisualVM" href="https://visualvm.dev.java.net/" onclick="pageTracker._trackPageview('/outgoing/visualvm.dev.java.net/?referer=');">VisualVM</a> albo <a href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html" onclick="pageTracker._trackPageview('/outgoing/java.sun.com/developer/technicalArticles/J2SE/jconsole.html?referer=');">JConsole</a> (brak aktywowanego jmxremote, firewalle, czy cokolwiek innego uniemożliwiającego połączenie), a podejrzewamy że coś niedobrego może dziać się z naszą aplikacją.</p>
<h2>Rozwiązanie</h2>
<p>Wrzucenie prostej stronki JSP, która nam takie parametry wyświetli.</p>
<p>Poniżej listing (po moich drobnych modyfikacjach) zapożyczony z <a href="http://www.freshblurbs.com/explaining-java-lang-outofmemoryerror-permgen-space" onclick="pageTracker._trackPageview('/outgoing/www.freshblurbs.com/explaining-java-lang-outofmemoryerror-permgen-space?referer=');">http://www.freshblurbs.com/explaining-java-lang-outofmemoryerror-permgen-space</a></p>
<p>Skryptlet (tak wiem, śmierdzi) użyty na tej stronie pozwala wrzucać ją do aplikacji bez potrzeby restartu serwera/redeploy aplikacji.</p>
<pre class="brush: java;">
&lt;%@page contentType=&quot;text/html&quot; pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;%@ page import=&quot;java.util.*, java.lang.management.*&quot; %&gt;
&lt;%@ taglib uri=&quot;http://java.sun.com/jstl/core_rt&quot; prefix=&quot;c&quot; %&gt;
&lt;%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&gt;
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;
    	               &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;

&lt;html&gt;
  &lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
    &lt;title&gt;JVM Memory Monitor&lt;/title&gt;
    &lt;style type=&quot;text/css&quot;&gt;
      td {
        text-align: right;
      }
    &lt;/style&gt;
  &lt;/head&gt;
&lt;body&gt;
  &lt;jsp:scriptlet&gt;
    MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
    pageContext.setAttribute(&quot;memoryBean&quot;, memoryBean, PageContext.PAGE_SCOPE);

    List poolBeans = ManagementFactory.getMemoryPoolMXBeans();
    pageContext.setAttribute(&quot;poolBeans&quot;, poolBeans, PageContext.PAGE_SCOPE);
  &lt;/jsp:scriptlet&gt;

  &lt;h3&gt;Total Memory&lt;/h3&gt;
  &lt;table border=&quot;1&quot; width=&quot;100%&quot;&gt;
    &lt;tr&gt;
      &lt;th&gt;usage&lt;/th&gt;
      &lt;th&gt;init&lt;/th&gt;
      &lt;th&gt;used&lt;/th&gt;
      &lt;th&gt;committed&lt;/th&gt;
      &lt;th&gt;max&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Heap Memory Usage&lt;/td&gt;
      &lt;td&gt;&lt;fmt:formatNumber value=&quot;${pageScope.memoryBean.heapMemoryUsage.init / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
      &lt;td&gt;&lt;fmt:formatNumber value=&quot;${pageScope.memoryBean.heapMemoryUsage.used / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
      &lt;td&gt;&lt;fmt:formatNumber value=&quot;${pageScope.memoryBean.heapMemoryUsage.committed / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
      &lt;td&gt;&lt;fmt:formatNumber value=&quot;${pageScope.memoryBean.heapMemoryUsage.max / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Non-heap Memory Usage&lt;/td&gt;
      &lt;td&gt;&lt;fmt:formatNumber value=&quot;${pageScope.memoryBean.nonHeapMemoryUsage.init / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
      &lt;td&gt;&lt;fmt:formatNumber value=&quot;${pageScope.memoryBean.nonHeapMemoryUsage.used / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
      &lt;td&gt;&lt;fmt:formatNumber value=&quot;${pageScope.memoryBean.nonHeapMemoryUsage.committed / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
      &lt;td&gt;&lt;fmt:formatNumber value=&quot;${pageScope.memoryBean.nonHeapMemoryUsage.max / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;

  &lt;h3&gt;Memory Pools&lt;/h3&gt;
  &lt;table border=&quot;1&quot; width=&quot;100%&quot;&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Usage&lt;/th&gt;
      &lt;th&gt;Init&lt;/th&gt;
      &lt;th&gt;Used&lt;/th&gt;
      &lt;th&gt;Committed&lt;/th&gt;
      &lt;th&gt;Max&lt;/th&gt;
    &lt;/tr&gt;
    &lt;c:forEach var=&quot;bean&quot; items=&quot;${pageScope.poolBeans}&quot;&gt;
      &lt;tr&gt;
        &lt;td style=&quot;text-align: left&quot;&gt;&lt;c:out value=&quot;${bean.name}&quot; /&gt;&lt;/td&gt;
        &lt;td style=&quot;text-align: left&quot;&gt;Memory Usage&lt;/td&gt;
        &lt;td&gt;&lt;fmt:formatNumber value=&quot;${bean.usage.init / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
        &lt;td&gt;&lt;fmt:formatNumber value=&quot;${bean.usage.used / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
        &lt;td&gt;&lt;fmt:formatNumber value=&quot;${bean.usage.committed / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
        &lt;td&gt;&lt;fmt:formatNumber value=&quot;${bean.usage.max / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;/td&gt;
        &lt;td style=&quot;text-align: left&quot;&gt;Peak Usage&lt;/td&gt;
        &lt;td&gt;&lt;fmt:formatNumber value=&quot;${bean.peakUsage.init / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
        &lt;td&gt;&lt;fmt:formatNumber value=&quot;${bean.peakUsage.used / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
        &lt;td&gt;&lt;fmt:formatNumber value=&quot;${bean.peakUsage.committed / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
        &lt;td&gt;&lt;fmt:formatNumber value=&quot;${bean.peakUsage.max / (1024 * 1024)}&quot; maxFractionDigits=&quot;1&quot;/&gt; MB&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/c:forEach&gt;
  &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Efekt poniżej:</p>
<p><a href="http://ludera.info/wp-content/uploads/2010/06/jvmMemoryMonitorWithJstl1.png"><img class="aligncenter size-full wp-image-561" title="jvmMemoryMonitorWithJstl" src="http://ludera.info/wp-content/uploads/2010/06/jvmMemoryMonitorWithJstl1.png" alt="" width="396" height="391" /></a></p>
<p>To rozwiązanie tak mi się spodobało, że z rozpędu napisałem sobie to samo w Richfaces. Strona odświeża się automatycznie co zadany przedział czasu (w ms). Wykorzystanie Ajax Push/Poll nie powala na pewno z punktu widzenia wydajności, jest natomiast rozwiązaniem banalnym do zaimplementowania:</p>
<pre class="brush: java;">
&lt;html xmlns:ui=&quot;http://java.sun.com/jsf/facelets&quot;
    xmlns:h=&quot;http://java.sun.com/jsf/html&quot;
    xmlns:f=&quot;http://java.sun.com/jsf/core&quot;
    xmlns:a4j=&quot;http://richfaces.org/a4j&quot;
    xmlns:rich=&quot;http://richfaces.org/rich&quot;&gt;

&lt;head&gt;
    &lt;title&gt;JVM Memory Monitor&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;a4j:region&gt;
        &lt;h:form&gt;
            &lt;a4j:poll id=&quot;poll&quot; interval=&quot;#{jvmPerformanceManager.interval}&quot; enabled=&quot;#{jvmPerformanceManager.pollEnabled}&quot; reRender=&quot;polledPanel, poll&quot;/&gt;
        &lt;/h:form&gt;
    &lt;/a4j:region&gt;
    &lt;h:form prependId=&quot;false&quot;&gt;
        &lt;h:panelGrid id=&quot;polledPanel&quot; columns=&quot;1&quot;&gt;
            &lt;h3&gt;Total Memory&lt;/h3&gt;
            &lt;rich:dataTable value=&quot;2&quot; style=&quot;text-align: right&quot;&gt;
                &lt;f:facet name=&quot;header&quot;&gt;
                    &lt;rich:columnGroup&gt;
                        &lt;rich:column&gt;
                            &lt;h:outputText value=&quot;Name&quot; /&gt;
                        &lt;/rich:column&gt;
                        &lt;rich:column&gt;
                            &lt;h:outputText value=&quot;Init&quot; /&gt;
                        &lt;/rich:column&gt;
                        &lt;rich:column&gt;
                            &lt;h:outputText value=&quot;Used&quot; /&gt;
                        &lt;/rich:column&gt;
                        &lt;rich:column&gt;
                            &lt;h:outputText value=&quot;Committed&quot; /&gt;
                        &lt;/rich:column&gt;
                        &lt;rich:column&gt;
                            &lt;h:outputText value=&quot;Max&quot; /&gt;
                        &lt;/rich:column&gt;
                    &lt;/rich:columnGroup&gt;
                &lt;/f:facet&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText value=&quot;Heap Memory Usage&quot; /&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText
                        value=&quot;#{jvmPerformanceManager.memoryBean.heapMemoryUsage.init / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText
                        value=&quot;#{jvmPerformanceManager.memoryBean.heapMemoryUsage.used / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText
                        value=&quot;#{jvmPerformanceManager.memoryBean.heapMemoryUsage.committed / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText
                        value=&quot;#{jvmPerformanceManager.memoryBean.heapMemoryUsage.max / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;
                &lt;rich:column breakBefore=&quot;true&quot;&gt;
                    &lt;h:outputText value=&quot;Non-heap Memory Usage&quot; /&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText
                        value=&quot;#{jvmPerformanceManager.memoryBean.nonHeapMemoryUsage.init / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText
                        value=&quot;#{jvmPerformanceManager.memoryBean.nonHeapMemoryUsage.used / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText
                        value=&quot;#{jvmPerformanceManager.memoryBean.nonHeapMemoryUsage.committed / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText
                        value=&quot;#{jvmPerformanceManager.memoryBean.nonHeapMemoryUsage.max / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;

                &lt;f:facet name=&quot;footer&quot;&gt;
                    &lt;rich:columnGroup&gt;
                        &lt;rich:column&gt;Last actualization date&lt;/rich:column&gt;
                        &lt;rich:column colspan=&quot;4&quot;&gt;
                            &lt;h:outputText value=&quot;#{jvmPerformanceManager.lastActualization}&quot;&gt;
                                &lt;f:convertDateTime pattern=&quot;yyyy-MM-dd HH:mm:ss&quot; timeZone=&quot;#{jvmPerformanceManager.timeZone}&quot;/&gt;
                            &lt;/h:outputText&gt;
                        &lt;/rich:column&gt;
                    &lt;/rich:columnGroup&gt;
                &lt;/f:facet&gt;
            &lt;/rich:dataTable&gt;

            &lt;h3&gt;Memory Pools&lt;/h3&gt;
            &lt;rich:dataTable var=&quot;poolBean&quot; value=&quot;#{jvmPerformanceManager.poolList}&quot;
                style=&quot;text-align: right&quot;&gt;
                &lt;f:facet name=&quot;header&quot;&gt;
                    &lt;rich:columnGroup&gt;
                        &lt;rich:column&gt;
                            &lt;h:outputText value=&quot;Name&quot; /&gt;
                        &lt;/rich:column&gt;
                        &lt;rich:column&gt;
                            &lt;h:outputText value=&quot;Usage&quot; /&gt;
                        &lt;/rich:column&gt;
                        &lt;rich:column&gt;
                            &lt;h:outputText value=&quot;Init&quot; /&gt;
                        &lt;/rich:column&gt;
                        &lt;rich:column&gt;
                            &lt;h:outputText value=&quot;Used&quot; /&gt;
                        &lt;/rich:column&gt;
                        &lt;rich:column&gt;
                            &lt;h:outputText value=&quot;Committed&quot; /&gt;
                        &lt;/rich:column&gt;
                        &lt;rich:column&gt;
                            &lt;h:outputText value=&quot;Max&quot; /&gt;
                        &lt;/rich:column&gt;
                    &lt;/rich:columnGroup&gt;
                &lt;/f:facet&gt;
                &lt;rich:column rowspan=&quot;2&quot;&gt;
                    &lt;h:outputText value=&quot;#{poolBean.name}&quot; /&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText value=&quot;Memory&quot; /&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText value=&quot;#{poolBean.usage.init / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText value=&quot;#{poolBean.usage.used / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText value=&quot;#{poolBean.usage.committed / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText value=&quot;#{poolBean.usage.max / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;
                &lt;rich:column breakBefore=&quot;true&quot;&gt;
                    &lt;h:outputText value=&quot;Peak&quot; /&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText value=&quot;#{poolBean.peakUsage.init / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText value=&quot;#{poolBean.peakUsage.used / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText
                        value=&quot;#{poolBean.peakUsage.committed / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;
                &lt;rich:column&gt;
                    &lt;h:outputText value=&quot;#{poolBean.peakUsage.max / (1024 * 1024)}&quot;&gt;
                        &lt;f:convertNumber pattern=&quot;#,##0.0 MB&quot; locale=&quot;US&quot; /&gt;
                    &lt;/h:outputText&gt;
                &lt;/rich:column&gt;
            &lt;/rich:dataTable&gt;

            &lt;h:panelGrid columns=&quot;2&quot;&gt;
                &lt;h:column&gt;
                    &lt;a4j:commandButton id=&quot;controlBtn&quot;
                        value=&quot;#{jvmPerformanceManager.pollEnabled?'Stop':'Start'}&quot; reRender=&quot;polledPanel, poll&quot;&gt;
                    &lt;a4j:actionparam name=&quot;polling&quot; value=&quot;#{!jvmPerformanceManager.pollEnabled}&quot;
                        assignTo=&quot;#{jvmPerformanceManager.pollEnabled}&quot; /&gt;
                    &lt;/a4j:commandButton&gt;
                &lt;/h:column&gt;
                &lt;h:column&gt;
                    &lt;a4j:outputPanel style=&quot;display: inline&quot; rendered=&quot;#{!jvmPerformanceManager.pollEnabled}&quot;&gt;
                        &lt;h:outputText value=&quot; with &quot; /&gt;
                        &lt;h:inputText value=&quot;#{jvmPerformanceManager.interval}&quot;&gt;
                            &lt;f:validateLongRange minimum=&quot;500&quot; /&gt;
                        &lt;/h:inputText&gt;
                        &lt;h:outputText value=&quot; ms interval.&quot; /&gt;
                    &lt;/a4j:outputPanel&gt;
                &lt;/h:column&gt;
            &lt;/h:panelGrid&gt;
        &lt;/h:panelGrid&gt;
    &lt;/h:form&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<pre class="brush: java;">
package info.ludera.helper;

import java.io.Serializable;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryPoolMXBean;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;

@ManagedBean(name=&quot;jvmPerformanceManager&quot;)
@SessionScoped
public class JvmPerformanceManager implements Serializable {

    private MemoryMXBean memoryBean;

    private List&lt;MemoryPoolMXBean&gt; poolList;

    private Boolean pollEnabled = true;

    /**
     * Interval in milliseconds. Default 10s.
     */
    private Long interval = 10*1000l;

    private String timeZone;

    public JvmPerformanceManager() {
        getActualMemoryInfo(null);
        timeZone = readDefaultHostTimeZone();
    }

    private String readDefaultHostTimeZone() {
        return TimeZone.getDefault().getID();
    }

    public void getActualMemoryInfo(ActionEvent actionEvent) {
        memoryBean = ManagementFactory.getMemoryMXBean();
        poolList = ManagementFactory.getMemoryPoolMXBeans();
    }

    public MemoryMXBean getMemoryBean() {
        return memoryBean;
    }

    public List&lt;MemoryPoolMXBean&gt; getPoolList() {
        return poolList;
    }

    public Boolean getPollEnabled() {
        return pollEnabled;
    }

    public void setPollEnabled(Boolean pollEnabled) {
        this.pollEnabled = pollEnabled;
    }

    public Long getInterval() {
        return interval;
    }

    public void setInterval(Long interval) {
        this.interval = interval;
    }

    public Date getLastActualization() {
        return Calendar.getInstance().getTime();
    }

    public String getTimeZone() {
        return timeZone;
    }
}
</pre>
<p>Efekt:</p>
<p><a href="http://ludera.info/wp-content/uploads/2010/06/jvmMemoryMonitorWithRichfaces.png"><img class="aligncenter size-full wp-image-557" title="jvmMemoryMonitorWithRichfaces" src="http://ludera.info/wp-content/uploads/2010/06/jvmMemoryMonitorWithRichfaces.png" alt="" width="360" height="473" /></a></p>
<p>Jestem obecnie, jak pewnie wielu, na etapie rozpoznawania nowości w Java EE 6. Treningowo, postanowiłem zatem napisać ten sam JVM Monitor z wykorzystaniem <a title="Asynchronous processing support in Servlet 3.0" href="http://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html" onclick="pageTracker._trackPageview('/outgoing/www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html?referer=');">Asynchronious Processing Support z Servlets 3.0</a> &#8211; także wkrótce rozwinięcie tematu.</p>
]]></content:encoded>
			<wfw:commentRss>http://ludera.info/java/monitoring-podstawowych-parametrow-jvm-z-poziomu-web-aplikacji/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Vaadin vs Richfaces i o tym co z tego wyszło [Java EE 6, Maven, Glassfish, Oracle]</title>
		<link>http://ludera.info/java/vaadin-vs-richfaces-i-o-tym-co-z-tego-wyszlo-java-ee-6-maven-glassfish-oracle</link>
		<comments>http://ludera.info/java/vaadin-vs-richfaces-i-o-tym-co-z-tego-wyszlo-java-ee-6-maven-glassfish-oracle#comments</comments>
		<pubDate>Tue, 13 Apr 2010 22:40:51 +0000</pubDate>
		<dc:creator>Dariusz Ludera</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[addressbook]]></category>
		<category><![CDATA[glassfish]]></category>
		<category><![CDATA[java ee 6]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[richfaces]]></category>
		<category><![CDATA[vaadin]]></category>

		<guid isPermaLink="false">http://ludera.info/?p=529</guid>
		<description><![CDATA[Głośno ostatnio na DWorld i DZone zrobiło się o nowej odsłonie Vaadina &#8211; frameworku opartego na GWT. Nigdy wcześniej nie miałem styczności z GWT (prócz kilku tutoriali i paru hellowordów). Pracuję natomiast na codzień z JSF &#8211; najczęściej w implementacji Richfaces. Chciałem więc sprawdzić co potrafi ten rozchwalany na lewo i prawo Vaadin oraz jak [...]]]></description>
			<content:encoded><![CDATA[<p>Głośno ostatnio na<a title="Developers World" href="http://www.dworld.pl/" onclick="pageTracker._trackPageview('/outgoing/www.dworld.pl/?referer=');"> DWorld</a> i <a title="DZone" href="http://www.dzone.com/links/index.html" onclick="pageTracker._trackPageview('/outgoing/www.dzone.com/links/index.html?referer=');">DZone</a> zrobiło się o nowej odsłonie <a title="Vaadin" href="http://vaadin.com/home" onclick="pageTracker._trackPageview('/outgoing/vaadin.com/home?referer=');">Vaadina</a> &#8211; frameworku <strong>opartego </strong>na GWT. Nigdy wcześniej nie miałem styczności z GWT (prócz kilku tutoriali i paru hellowordów). Pracuję natomiast na codzień z JSF &#8211; najczęściej w implementacji <a title="JBoss Richfaces" href="http://www.jboss.org/richfaces" onclick="pageTracker._trackPageview('/outgoing/www.jboss.org/richfaces?referer=');">Richfaces</a>. Chciałem więc sprawdzić co potrafi ten rozchwalany na lewo i prawo Vaadin oraz jak jego zestaw gotowych komponentów ma się do Richfaces w kontekście budowania interfejsu użytkownika dla aplikacji &#8216;biznesowych&#8217; (tabele, modalpanele, itp, itd) w konwencji podbierania gotowych komponentów ze stron frameworków (odpowiednio <a title="Komponenty Vaadin" href="http://demo.vaadin.com/sampler/" onclick="pageTracker._trackPageview('/outgoing/demo.vaadin.com/sampler/?referer=');">tej</a> i <a title="Komponenty Richfaces" href="http://livedemo.exadel.com/richfaces-demo/index.jsp" onclick="pageTracker._trackPageview('/outgoing/livedemo.exadel.com/richfaces-demo/index.jsp?referer=');">tej</a>). Mam świadomość tego, że porównywanie Vaadina do Richfaces to jak zestawianie arbuzów z dyniami &#8211; za jedyne kryterium porównawcze chciałem zatem przyjąć ogólną prostotę danego rozwiązania. Chodziło o to żeby zrobić (CRUDa, a jakże) a się nie narobić <img src='http://ludera.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Najprostszą metodą stworzenia działającego projektu Vaadin, jest <a title="Vaadin tutorial" href="http://vaadin.com/tutorial/-/page/project-setup.html" onclick="pageTracker._trackPageview('/outgoing/vaadin.com/tutorial/-/page/project-setup.html?referer=');">wyklikanie</a> go z poziomu Eclipse (kreatory i edytor WYSIWYG). Najłatwiejszą, jaką znam, metodą zbudowania projektu opartego o Richfaces jest <a title="Richfaces Livedemo sources" href="http://anonsvn.jboss.org/repos/richfaces/branches/community/3.3.X/samples/richfaces-demo/" onclick="pageTracker._trackPageview('/outgoing/anonsvn.jboss.org/repos/richfaces/branches/community/3.3.X/samples/richfaces-demo/?referer=');">pobranie przykładowej aplikacji</a> i wyrzucenie niepotrzebnych plików albo&#8230; wygenerowanie Seamowego projektu seam-gen&#8217;em. Można również oczywiście w obu przypadkach bawić się w Mavena.</p>
<p>Poznawanie Vaadina rozpocząłem właśnie od napisania sobie <a title="Vaadin tutorial" href="http://vaadin.com/tutorial/-/page/project-setup.html" onclick="pageTracker._trackPageview('/outgoing/vaadin.com/tutorial/-/page/project-setup.html?referer=');">AddressBook</a>&#8216;a &#8211; nic innego jak CRUD, który chciałem stworzyć samemu&#8230; Stwierdziłem więc, że może chociaż samemu dorzucę ORM (JPA) i zobaczę czy nadal wszystko będzie tak gładko chodzić, to też już ktoś wcześniej <a title="Vaadin AddressBook z JPA" href="http://vaadin.com/wiki/-/wiki/Main/Adding%20JPA%20to%20the%20Address%20Book%20Demo" onclick="pageTracker._trackPageview('/outgoing/vaadin.com/wiki/-/wiki/Main/Adding_20JPA_20to_20the_20Address_20Book_20Demo?referer=');">zrobił</a> <img src='http://ludera.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Pomyślałem więc, że zbiorę chociaż wszystko to do kupy i sprawdzę czy się nie &#8216;gryzie&#8217;. Napisałem zatem mavenowy AddressBook z JPA, pracujący na Glassfish 3.1 z Oracle 10g Express Edition w tle &#8211; zadziałało. Poniżej listing jak wygenerować szablon <a title="Integracja Vaadin z Maven" href="http://vaadin.com/wiki/-/wiki/Main/Using%20Vaadin%20with%20Maven" onclick="pageTracker._trackPageview('/outgoing/vaadin.com/wiki/-/wiki/Main/Using_20Vaadin_20with_20Maven?referer=');">projektu Vaadina w mavenie</a>, oraz gotowy projekt do pobrania plus kilka podpowiedzi jak coś takiego uruchomić tudzież &#8216;napisać&#8217; samemu.</p>
<p>0) instalujemy i konfigurujemy Oracle 10g Express Edition</p>
<p>1) pobieramy najnowszego <a title="Latest NB Glassfish 3.1" href="http://download.java.net/glassfish/v3.1/nightly/latest-glassfish.zip" onclick="pageTracker._trackPageview('/outgoing/download.java.net/glassfish/v3.1/nightly/latest-glassfish.zip?referer=');">glassfisha 3.1</a> (wersja 3 zawiera bug niepozwalający na swobodne korzystanie z Vaadin &#8211; chodzi o ładowanie klas)</p>
<p>2) do $GLASSFISH_HOME/glassfish/lib dorzucamy sterownik ojdbc14.jar</p>
<p>3) z $GLASSFISH_HOME/bin uruchamiamy asadmin start domain &#8211; startujemy domyślną (domain1) domenę serwera wszystkorobiącym skryptem asadmin</p>
<p>4) otwieramy konsolę administracyjną Glassfisha (http://localhost:4848) i wybieramy z menu Resources-&gt;JDBC-&gt;JDBC Connection Pools</p>
<p>5) dodajemy pulę połączeń do naszej bazy</p>
<p style="text-align: center;"><a href="http://ludera.info/wp-content/uploads/2010/04/1.png"><img class="aligncenter size-full wp-image-534" title="Konfiguracja puli połączeń 1" src="http://ludera.info/wp-content/uploads/2010/04/1.png" alt="" width="337" height="113" /></a><a href="http://ludera.info/wp-content/uploads/2010/04/2.png"></a></p>
<p style="text-align: center;">
<p style="text-align: center;"><a href="../wp-content/uploads/2010/04/2.png"><img class="aligncenter" title="Konfiguracja puli połączeń 2" src="../wp-content/uploads/2010/04/2.png" alt="" width="367" height="95" /></a></p>
<p style="text-align: center;">
<p>6) dodajemy JDBC Recource (o nazwie jdbc/sample) dla skonfigurowanej przed chwilą puli połączeń &#8211; będziemy się do tego źródła danych odwoływać z poziomu aplikacji (w persistance.xml)</p>
<p>7) restartujemy serwer (asadmin stop-domain; asadmin start-domain)</p>
<p>8 ) generujemy projekt skryptem mvnAddressBook.sh:</p>
<pre class="brush: xml;">
#!/bin/bash
if [ &quot;$#&quot; -gt 2 ]
then
	groupId=$1
	artifactId=$2
else
	artifactId=AddressBook
	groupId=com.vaadin.demo.tutorial.addressbook
fi
mvn archetype:generate -DarchetypeGroupId=com.vaadin -DarchetypeArtifactId=vaadin-archetype-clean -DarchetypeVersion=LATEST -DgroupId=&quot;$groupId&quot; -DartifactId=&quot;$artifactId&quot; -Dversion=1.0 -Dpackaging=war
cd $artifactId; mvn eclipse:eclipse
</pre>
<p>9) importujemy projekt do Eclipse z zainstalowanym pluginem do Vaadina (dzięki temu będziemy mieć edytor WYSIWYG do składania GUI z klocków)</p>
<p>10) rozwiązanie zależności z Glassfish w pom.xml (po pobraniu projektu dołączonego do tego wpisu ustaw własną ścieżkę!)</p>
<p>11) teraz najważniejsze. według uznania, przechodzimy przez tutorial AddressBook i AddressBook+JPA pamiętając o hierarchii projektu narzuconej przez Maven lub <a title="Vaadin AddressBook z JPA - źródła" href="http://vaadin.com/c/wiki/get_page_attachment?p_l_id=35405&amp;nodeId=10674&amp;title=Adding+JPA+to+the+Address+Book+Demo&amp;fileName=Adding+JPA+to+the+Address+Book+Demo%2Faddressbook.tar.gz" onclick="pageTracker._trackPageview('/outgoing/vaadin.com/c/wiki/get_page_attachment?p_l_id=35405_amp_nodeId=10674_amp_title=Adding+JPA+to+the+Address+Book+Demo_amp_fileName=Adding+JPA+to+the+Address+Book+Demo_2Faddressbook.tar.gz&amp;referer=');">ściągamy</a> gotowy projekt i przerzucamy kod do naszego. Dodajemy również web.xml z pustą deklaracją &#8211; korzystamy z Java EE6, więc konfigurujemy serwlety adnotacjami &#8211; patrz AddressBookApplication (jak widać konfiguracja Vaadina jest właściwie zerowa,w odróżnieniu od JSF gdzie skazani jesteśmy na klepanie kilometrowych plików typu faces-config.xml)</p>
<p>12) dorzucamy katalogi src/test/resources i implementujemy testy jednostkowe! <img src='http://ludera.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>13) mvn compile war:war</p>
<p>14) delpoy aplikacji z poziomu konsoli administracyjnej Glassfish (pozycja menu Applications), z Eclipsa lub <a href="https://maven-glassfish-plugin.dev.java.net/" onclick="pageTracker._trackPageview('/outgoing/maven-glassfish-plugin.dev.java.net/?referer=');">Mavenem</a>.</p>
<p style="text-align: center;"><a href="http://ludera.info/wp-content/uploads/2010/04/3.png"><img class="aligncenter size-full wp-image-536" title="AddressBook [Vaadin, Java EE6 (Servlets, EJB 3, JPA), Glassfish, Oracle DB]" src="http://ludera.info/wp-content/uploads/2010/04/3.png" alt="" width="380" height="552" /></a></p>
<p>Podsumowanie.</p>
<p>Nie pisałem ostatecznie analogicznej aplikacji w Seam (z Richfaces). Wiem bowiem jak coś takiego zrobić i jak świetnym narzędziem do generowania CRUDów jest seam-gen. Jeśli chodzi o Vaadin to muszę powiedzieć, że ten framework przegania pod względem prostoty JSF (nawet z tak świetnym zestawem komponentów jak Richfaces). Pisząc w Vaadin ani razu nie musimy zaglądać do web.xml, czy innych charakterystycznych dla frameworku xmli &#8211; i to jest świetne. Kuleje mocno edytor WYSIWYG &#8211; obecnie w fazie testów. Jak widać Vaadin da się zaprząc całokowicie bezboleśnie do współpracy z Java EE. Ciekaw natomiast jestem, czy da się (i czy jest sens) pożenić Vaadina z Seamem &#8211; ktoś próbował?</p>
<p>Wnioski.</p>
<p>Koniecznie zmienić skórkę dla bloga, bo się nie mieszczę!</p>
<p>PS. Jeszcze taka jedna obserwacja. Dzięki temu, że JSF podzielony jest na widok (jsp lub facelets) i kontroler (managed beans), ciężej niż w Vaadin jest napisać śmietnik zamiast kodu. Jedyne ryzyko, to to że nasze beany zamiast obiektowych będą kodem proceduralnym. Vaadin jest badzo podobny do Swinga, wypada więc <a href="http://en.wikipedia.org/wiki/Strategy_pattern" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Strategy_pattern?referer=');">strategicznie</a> <a href="http://en.wikipedia.org/wiki/Object_composition" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Object_composition?referer=');">komponować</a> kod zamiast uwailić całe GUI w metodzie init() <img src='http://ludera.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Sugestie jak pisać czysty kod w Vaadin znaleźć można w samej aplikacji AddressBook oraz w Book of Vaadin (<a rel="nofollow" href="http://en.wikipedia.org/wiki/Book_of_Mormon" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Book_of_Mormon?referer=');">nie mylić z tym</a>) <img src='http://ludera.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>PS2. Zapowiada się świetna okazja, by już <a href="http://groups.google.com/group/warszawa-jug/web/harmonogram-spotka-i-ich-tematy" onclick="pageTracker._trackPageview('/outgoing/groups.google.com/group/warszawa-jug/web/harmonogram-spotka-i-ich-tematy?referer=');">20.04.2010</a> posłuchać paru <a title="KoziołekWeb" href="http://koziolekweb.pl/2010/03/28/songs-of-vaadin/" onclick="pageTracker._trackPageview('/outgoing/koziolekweb.pl/2010/03/28/songs-of-vaadin/?referer=');">mądrych</a> słów o Vaadin. Ja z przyczyn obiektywnych niestety nie będę mógł skorzystać, niemniej jednak zapraszam bo na pewno warto!</p>
<p>Kompletny projekt do <a title="VaadinAddressbookWithJpaAndMaven.zip" href="http://ludera.info/files/VaadinAddressbookWithJpaAndMaven.zip">pobrania</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ludera.info/java/vaadin-vs-richfaces-i-o-tym-co-z-tego-wyszlo-java-ee-6-maven-glassfish-oracle/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

