<?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; java</title>
	<atom:link href="http://ludera.info/category/java/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>Java 7 w akcji</title>
		<link>http://ludera.info/java/java-7-w-akcji</link>
		<comments>http://ludera.info/java/java-7-w-akcji#comments</comments>
		<pubDate>Sun, 27 Feb 2011 01:18:11 +0000</pubDate>
		<dc:creator>Dariusz Ludera</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[java 7]]></category>
		<category><![CDATA[project coin]]></category>

		<guid isPermaLink="false">http://ludera.info/?p=567</guid>
		<description><![CDATA[Wreszcie znalazłem wolną chwilę by wypróbować w praktyce nowe ficzery Java 7. Zabawy z wersją beta najnowszego jdk ułatwia NetBeans IDE 7.0 Beta 2. Do testów na pierwszy ogień poszły usprawnienia w samej składni języka. Jak widać na załączonym obrazku &#8216;Project Coin is alive&#8217;: Po więcej informacji odsyłam do: - http://openjdk.java.net/projects/jdk7/features/ - http://www.java7developer.com/ Wracam do [...]]]></description>
			<content:encoded><![CDATA[<p>Wreszcie znalazłem wolną chwilę by wypróbować w praktyce nowe ficzery Java 7.</p>
<p>Zabawy z wersją beta najnowszego <a href="http://dlc.sun.com.edgesuite.net/jdk7/binaries/index.html" onclick="pageTracker._trackPageview('/outgoing/dlc.sun.com.edgesuite.net/jdk7/binaries/index.html?referer=');">jdk</a> ułatwia <a href="http://dlc.sun.com.edgesuite.net/netbeans/7.0/beta2/" onclick="pageTracker._trackPageview('/outgoing/dlc.sun.com.edgesuite.net/netbeans/7.0/beta2/?referer=');">NetBeans IDE 7.0 Beta 2</a>. Do testów na pierwszy ogień poszły usprawnienia w samej składni języka.</p>
<p>Jak widać na załączonym obrazku &#8216;Project Coin is alive&#8217;:</p>
<p style="text-align: center;"><a href="http://ludera.info/wp-content/uploads/2011/02/coinProjectTest1.png"><img class="aligncenter size-full wp-image-576" title="coinProjectTest" src="http://ludera.info/wp-content/uploads/2011/02/coinProjectTest1.png" alt="" width="629" height="744" /></a></p>
<p>Po więcej informacji odsyłam do:<br />
- <a href="http://openjdk.java.net/projects/jdk7/features/" onclick="pageTracker._trackPageview('/outgoing/openjdk.java.net/projects/jdk7/features/?referer=');">http://openjdk.java.net/projects/jdk7/features/</a><br />
- <a href="http://www.java7developer.com/" onclick="pageTracker._trackPageview('/outgoing/www.java7developer.com/?referer=');">http://www.java7developer.com/</a></p>
<p>Wracam do dalszego rozpoznawania nowych zabawek <img src='http://ludera.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://ludera.info/java/java-7-w-akcji/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>
		<item>
		<title>Singleton z double-checked locking oraz problem z wielowątkowością w TestNG</title>
		<link>http://ludera.info/java/singleton-z-double-checked-locking-oraz-problem-z-wielowatkowoscia-w-testng</link>
		<comments>http://ludera.info/java/singleton-z-double-checked-locking-oraz-problem-z-wielowatkowoscia-w-testng#comments</comments>
		<pubDate>Mon, 15 Mar 2010 21:39:00 +0000</pubDate>
		<dc:creator>Dariusz Ludera</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[double-checked locking]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[singleton]]></category>
		<category><![CDATA[testng]]></category>

		<guid isPermaLink="false">http://ludera.info/?p=438</guid>
		<description><![CDATA[Wyczytałem ostatnio w mądrych książkach (tej i tej), że synchronizacja singletonów na poziomie całej metody getInstance może w środowisku wielowątkowym znacznie (25%) spowolnić pobieranie instancji obiektu przechowywanego przez owy singleton. W polskiej wikipedii ktoś napisał, że synchronizacja ta może obniżyć wydajność (w stosunku do metody niesynchronizowanej) o czynnik 100 lub więcej &#8211; szczerze, nie rozumiem [...]]]></description>
			<content:encoded><![CDATA[<p>Wyczytałem ostatnio w mądrych książkach (<a title="Effective Java Second Edition" href="http://java.sun.com/docs/books/effective/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/java.sun.com/docs/books/effective/?referer=');">tej</a> i <a title="Head First Design Patterns" href="http://helion.pl/ksiazki/hfdepa.htm" target="_blank" onclick="pageTracker._trackPageview('/outgoing/helion.pl/ksiazki/hfdepa.htm?referer=');">tej</a>), że synchronizacja singletonów na poziomie całej metody getInstance może w środowisku wielowątkowym znacznie (25%) spowolnić pobieranie instancji obiektu przechowywanego przez owy singleton. W polskiej <a href="http://pl.wikipedia.org/wiki/Blokada_z_podw%C3%B3jnym_zatwierdzeniem_%28wzorzec_projektowy%29" target="_blank" onclick="pageTracker._trackPageview('/outgoing/pl.wikipedia.org/wiki/Blokada_z_podw_C3_B3jnym_zatwierdzeniem_28wzorzec_projektowy_29?referer=');">wikipedii</a> ktoś napisał, że synchronizacja ta może obniżyć wydajność (w stosunku do metody niesynchronizowanej) o czynnik 100 lub więcej &#8211; szczerze, nie rozumiem co oznacza rzeczony &#8216;czynnik 100&#8242;&#8230;</p>
<p>W przypadku, gdy wydajność ma dla nas kluczowe znaczenie, do tworzenia singletonów zalecano stosowanie wzorca double-checked locking (blokada z podwójnym zatwierdzaniem). Postanowiłem więc sprawdzić doświadczalnie jak w rzeczywistości wygląda spadek wydajności metod synchronizowanych. Napisałem więc trzy singletony:</p>
<p>tradycyjny</p>
<pre class="brush: java;">package info.ludera.SingletonPerformance.action.impl;

import info.ludera.SingletonPerformance.action.TestSingleton;

/**
 * Singleton z ZAWSZE synchronizowaną metodą {@link SimpleSingleton#getInstance()}
 * @author darekl
 *
 */
public class SimpleSingleton extends TestSingleton {

	/**
	 * Jedyna instancja obiektu {@link SimpleSingleton}
	 */
	private static SimpleSingleton instance;

	/**
	 * Konstruktor domyślny
	 */
	private SimpleSingleton() {
		super();
	}

	/**
	 * Zwraca instancję obiektu  {@link SimpleSingleton}
	 * @return
	 */
	public static synchronized SimpleSingleton getInstance() {

		if (instance == null) {
			instance = new SimpleSingleton();
		}
		return instance;
	}
}
</pre>
<p>i dwie różne implementacje double-checked locking:</p>
<p>&#8220;podstawowa&#8221;</p>
<pre class="brush: java;">package info.ludera.SingletonPerformance.action.impl;

import info.ludera.SingletonPerformance.action.TestSingleton;

/**
 * Singleton z synchronizowaną metodą {@link SimpleSingleton#getInstance()}. Synchronizacja aktywna jest tylko przy pierwszym uruchomieniu tej metody.
 * @author darekl
 *
 */
public class ThreadSaveSingleton extends TestSingleton {

	/**
	 * Jedyna instancja obiektu {@link SimpleSingleton}
	 */
	private volatile static ThreadSaveSingleton instance = null;

	/**
	 * Konstruktor domyślny
	 */
	private ThreadSaveSingleton() {
		super();
	}

	/**
	 * Zwraca instancję obiektu  {@link SimpleSingleton}
	 * @return
	 */
	public static ThreadSaveSingleton getInstance() {

		if (instance == null) {
			synchronized (ThreadSaveSingleton.class) {
				if (instance == null) {
					instance = new ThreadSaveSingleton();
				}
			}
		}
		return instance;
	}
}
</pre>
<p>i &#8220;<a href="http://technology.amis.nl/blog/4384/the-double-checked-locking-confusion" target="_blank" onclick="pageTracker._trackPageview('/outgoing/technology.amis.nl/blog/4384/the-double-checked-locking-confusion?referer=');">rozszerzona</a>&#8221;</p>
<pre class="brush: java;">package info.ludera.SingletonPerformance.action.impl;

import info.ludera.SingletonPerformance.action.TestSingleton;

/**
 * Singleton z synchronizowaną metodą {@link SimpleSingleton#getInstance()}. Synchronizacja aktywna jest tylko przy pierwszym uruchomieniu tej metody.
 * @author darekl
 *
 */
public class AdvancedThreadSaveSingleton extends TestSingleton {

	/**
	 * Jedyna instancja obiektu {@link SimpleSingleton}
	 */
	private volatile static AdvancedThreadSaveSingleton instance = null;

	/**
	 * Konstruktor domyślny
	 */
	private AdvancedThreadSaveSingleton() {
		super();
	}

	/**
	 * Zwraca instancję obiektu  {@link SimpleSingleton}
	 * @return
	 */
	public static AdvancedThreadSaveSingleton getInstance() {

		AdvancedThreadSaveSingleton result = instance;
		if (result == null) {
			synchronized (AdvancedThreadSaveSingleton.class) {
				result = instance;
				if (result == null) {
					instance = result = new AdvancedThreadSaveSingleton();
				}
			}
		}
		return result;
	}
}
</pre>
<p>Przetestowałem ich działanie poniższym testem dla różnej ilości wątków (100-100000):</p>
<pre class="brush: java;">package info.ludera.SingletonPerformance.test;

...

public class FabricMultiThreadSingletonTest extends AbstractSingletonTest {

	@DataProvider
	public Object[][] ValidJavaVersion() {

		return new Object[][]{
				{ 5 }
		};
	}

	/**
	 * Ilość iteracji
	 */
	protected static Long testCounter;

	/**
	 * Prefix nazwy wątku
	 */
	protected static String threadNamePrefix = &quot;Thread_&quot;;

	@BeforeClass
	@Parameters(value=&quot;repetitionQuantity&quot;)
	public void setTestCounter(long repetitionQuantity) {
		testCounter = repetitionQuantity;
	}

	@Test
	public void getSimpleSingletonNTimes() {

		for (long i=0; i&lt;testCounter; i++) {
			SingletonFactory simpleSingletonFactory = new SimpleSingletonFactory(threadNamePrefix + i);
			simpleSingletonFactory.start();
		}
	}

	@Test(dataProvider = &quot;ValidJavaVersion&quot;)
	public void getThreadSaveSingletonNTimes(final int javaVersion) {

		//Assert.assertTrue((Integer.parseInt(&quot;&quot; + System.getProperty(&quot;java.version&quot;).charAt(2)) &gt;= javaVersion), &quot;This test is avialable only with Java 5 or above!&quot;);

		for (long i=0; i&lt;testCounter; i++) {
			SingletonFactory threadSaveSingletonFactory = new ThreadSaveSingletonFactory(threadNamePrefix + i);
			threadSaveSingletonFactory.start();
		}
	}

	@Test(dataProvider = &quot;ValidJavaVersion&quot;)
	public void getAdvencedThreadSaveSingletonNTimes(final int javaVersion) {

		//Assert.assertTrue((Integer.parseInt(&quot;&quot; + System.getProperty(&quot;java.version&quot;).charAt(2)) &gt;= javaVersion), &quot;This test is avialable only with Java 5 or above!&quot;);

		for (long i=0; i&lt;testCounter; i++) {
			SingletonFactory advancedThreadSaveSingletonFactory = new AdvancedThreadSaveSingletonFactory(threadNamePrefix + i);
			advancedThreadSaveSingletonFactory.start();
		}
	}
}
</pre>
<p>I rzeczywiście. Czasowe wyniki działania tych testów, dla różnej ilości iteracji, rozchodziły się w słuszną stronę. Wraz ze wzrostem iteracji, SimpleSingleton działał coraz wolniej w stosunku do wersji z double-checked locking. Testy przeprowadzałem na JDK 1.6.0_16 oraz JDK 1.5.0_22. Nie testowałem wydajności na Java 1.4. Istnieje bowiem prawdopodobieństwo wystąpienia problemu błędnej implementacji volatile. Oto przykładowe wyniki dla 10000 iteracji na JDK 1.6:</p>
<pre>getSimpleSingletonNTimes - 1624ms
getThreadSaveSingletonNTimes - 1209ms
getAdvencedThreadSaveSingletonNTimes - 1153ms</pre>
<p>To nie wszystko. Po zastanowieniu, doszedłem do wniosku, że użycie wzorca fabryki do  takich teścików to przerost formy nad treścią. Stwierdziłem więc, że wykorzystam wielowątkowości z TestNG.</p>
<p>oto test:</p>
<pre class="brush: java;">package info.ludera.SingletonPerformance.test;

...

import org.testng.annotations.Test;

/**
 * Test wydajności synchronizacji singletonów {@link info.ludera.SingletonPerformance.test.helper.SimpleSingletonFactory} i {@link info.ludera.SingletonPerformance.test.helper.ThreadSaveSingletonFactory}
 * @author darekl
 *
 */
public class MultiThreadSingletonTest extends AbstractSingletonTest {

	@Test(threadPoolSize=1000, invocationCount = 1000)
	public void getSimpleSingleton() {

		SimpleSingleton.getInstance();
	}

	@Test(dataProvider = &quot;ValidJavaVersion&quot;, threadPoolSize=1000, invocationCount = 1000)
	public void getThreadSaveSingleton(final int javaVersion) {

		//Assert.assertTrue((Integer.parseInt(&quot;&quot; + System.getProperty(&quot;java.version&quot;).charAt(2)) &gt;= javaVersion), &quot;This test is avialable only with Java 5 or above!&quot;);

		ThreadSaveSingleton.getInstance();
	}

	@Test(dataProvider = &quot;ValidJavaVersion&quot;, threadPoolSize=1000, invocationCount = 1000)
	public void getAdvencedThreadSaveSingleton(final int javaVersion) {

		//Assert.assertTrue((Integer.parseInt(&quot;&quot; + System.getProperty(&quot;java.version&quot;).charAt(2)) &gt;= javaVersion), &quot;This test is avialable only with Java 5 or above!&quot;);

		AdvancedThreadSaveSingleton.getInstance();
	}
}
</pre>
<p>i wyniki (tym razem dla 1000 wątków):</p>
<pre>getSimpleSingletonNTimes - 110ms
getThreadSaveSingletonNTimes - 97ms
getAdvencedThreadSaveSingletonNTimes - 100ms
getSimpleSingleton - 716ms
getThreadSaveSingleton - 2050ms
getAdvencedThreadSaveSingleton - 2079ms</pre>
<p>Zastanawiające. Dlaczego trzy ostatnie testy (te dopisane powyżej) nie układają się tak jak te poprzednie, gdzie wielowątkowość napisałem ręcznie? Dlaczego widać tak duże różnice w wydajności? Przyznam szczerze, że z wielowątkowości w TestNG korzystam po praz pierwszy, czy ktoś bardziej doświadczony w tym temacie, mógłby mi wyjaśnić w czym tkwi problem na który się natknąłem i co robię źle?</p>
<p><a title="SingletonPerformance.zip" href="http://ludera.info/files/SingletonPerformance.zip">Pobierz</a> projekt eclipse (wymagania: Maven2 lub Eclipse z pluginami: <a title="m2eclipse" href="http://m2eclipse.sonatype.org/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/m2eclipse.sonatype.org/?referer=');">m2eclipse</a> i <a title="TestNG Eclipse Plugin" href="http://testng.org/doc/index.html#locations-projects" target="_blank" onclick="pageTracker._trackPageview('/outgoing/testng.org/doc/index.html_locations-projects?referer=');">TestNG</a>)</p>
<p>PS. Apropos optymalizacji kodu pod względem jego wydajności, polecam <a title="Dlaczego moje optymalizacje nie optymalizują? " href="http://www.devblogi.pl/2010/03/dlaczego-moje-optymalizacje-nie.html" onclick="pageTracker._trackPageview('/outgoing/www.devblogi.pl/2010/03/dlaczego-moje-optymalizacje-nie.html?referer=');">ten</a> artykuł. Po jego przeczytaniu nasunęła mi się analogia dotycząca RDBMS i hintów oraz przesiadki z optymalizatorów regułowych na kosztowe <img src='http://ludera.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">
<p>package info.ludera.SingletonPerformance.action.impl;</p>
<p>import info.ludera.SingletonPerformance.action.TestSingleton;</p>
<p>/**<br />
* Singleton z ZAWSZE synchronizowaną metodą {@link SimpleSingleton#getInstance()}<br />
* @author darekl<br />
*<br />
*/<br />
public class SimpleSingleton extends TestSingleton {</p>
<p>/**<br />
* Jedyna instancja obiektu {@link SimpleSingleton}<br />
*/<br />
private static SimpleSingleton instance;</p>
<p>/**<br />
* Konstruktor domyślny<br />
*/<br />
private SimpleSingleton() {<br />
super();<br />
}</p>
<p>/**<br />
* Zwraca instancję obiektu  {@link SimpleSingleton}<br />
* @return<br />
*/<br />
public static synchronized SimpleSingleton getInstance() {</p>
<p>//System.out.println(&#8220;SimpleSingleton.getInstance start for &#8221; + Thread.currentThread().getName());<br />
if (instance == null) {<br />
instance = new SimpleSingleton();<br />
}<br />
//System.out.println(&#8220;SimpleSingleton.getInstance stop  for &#8221; + Thread.currentThread().getName());<br />
return instance;<br />
}<br />
}</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://ludera.info/java/singleton-z-double-checked-locking-oraz-problem-z-wielowatkowoscia-w-testng/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JSF &#8211; automatyczna zamiana null na 0 lub pusty string</title>
		<link>http://ludera.info/java/jsf-automatyczna-zamiana-null-na-0-lub-pusty-string</link>
		<comments>http://ludera.info/java/jsf-automatyczna-zamiana-null-na-0-lub-pusty-string#comments</comments>
		<pubDate>Tue, 19 Jan 2010 12:09:50 +0000</pubDate>
		<dc:creator>Dariusz Ludera</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[coerce to zero]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://ludera.info/?p=416</guid>
		<description><![CDATA[Myślalem, że JSF nie ma już przede mną większych tajemnic, gdy w projekcie objawił się nam następujący błąd: JSF domyślnie z automatu zamienia formularzowe puste inputy na odpowiadające im 0 lub puste stringi. Inaczej mówiąc jeśli użytkownik do takiego inputTextu nic nie wpisze to referencja age zamiast być pusta (null) wskazywać będzie na 0. &#60;h:inputText [...]]]></description>
			<content:encoded><![CDATA[<p>Myślalem, że JSF nie ma już przede mną większych tajemnic, gdy w projekcie objawił się nam następujący błąd:</p>
<p>JSF domyślnie z automatu zamienia formularzowe puste inputy na odpowiadające im 0 lub puste stringi. Inaczej mówiąc jeśli użytkownik do takiego inputTextu nic nie wpisze to referencja age zamiast być pusta (null) wskazywać będzie na 0.</p>
<p><code>&lt;h:inputText id="age"<br />
value="#{exampleManager.age}" converter="IntegerConverter" /&gt;</code></p>
<p>Gdyby age było Stringiem, wówczas JSF przypisałby pod niego &#8220;&#8221;.</p>
<p>Rozwiązanie tego &#8216;problemu&#8217; okazało się trywialne choć dziwne (stąd ta notka). Należało zmienić domyślną wartość <a href="http://tomcat.apache.org/tomcat-6.0-doc/config/systemprops.html" onclick="pageTracker._trackPageview('/outgoing/tomcat.apache.org/tomcat-6.0-doc/config/systemprops.html?referer=');">flagi Tomcata COERCE_TO_ZERO</a> poprzez ustawienie odpowiedniego parametru uruchomieniowego:</p>
<p><code>-Dorg.apache.el.parser.COERCE_TO_ZERO=false</code></p>
<p>Domyślna wartość COERCE_TO_ZERO ustawiona jest na true. Oczywiście można tego dokonać również z poziomu kodu aplikacji &#8211; jak dla mnie rozwiązanie takie jest dużo bardziej elastyczne i eleganckie:</p>
<p><code>System.getProperties().<br />
put("org.apache.el.parser.COERCE_TO_ZERO", "false");</code></p>
<p>Projekt w którym objawił się ten problem pracuje na JBossie (posiadającym w sobie Tomcata), jak aplikacja ta zachowała by się na innych serwerach aplikacyjnych i jak wówczas poradzić sobie z opisywanym &#8216;wymuszaniem&#8217; &#8211; kiedyś może się dowiem&#8230; </p>
]]></content:encoded>
			<wfw:commentRss>http://ludera.info/java/jsf-automatyczna-zamiana-null-na-0-lub-pusty-string/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WSDL2JAVA w Ant</title>
		<link>http://ludera.info/java/wsdl2java-w-ant</link>
		<comments>http://ludera.info/java/wsdl2java-w-ant#comments</comments>
		<pubDate>Fri, 22 May 2009 14:09:37 +0000</pubDate>
		<dc:creator>Dariusz Ludera</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[axis2]]></category>
		<category><![CDATA[wsdl2java]]></category>

		<guid isPermaLink="false">http://ludera.info/?p=268</guid>
		<description><![CDATA[Poniżej przykład uruchomienia generatora kodu Java dla zadanego WSDL (Axis2 WSDL2JAVA): Z kosoli: $PROJEKT/scr&#62; WSDL2Java -uri http://localhost:8080/axis2/services/WebServiceExample?wsdl -d adb -s -S . Ant: &#60;project name="WsExampleClient" default="dist" basedir="."&#62; &#60;property name="location.dir.src" value="."/&#62; &#60;path id="axis2.classpath"&#62; &#60;fileset dir="D:\libs\axis2-1.4.1\lib"&#62; &#60;include name="**/*.jar" /&#62; &#60;/fileset&#62; &#60;/path&#62; &#60;target name="codegen"&#62; &#60;taskdef name="axis2-wsdl2java" classname="org.apache.axis2.tool.ant.AntCodegenTask" classpathref="axis2.classpath" /&#62; &#60;axis2-wsdl2java wsdlfilename="http://localhost:8080/axis2/services/WebServiceExample?wsdl" output="${location.dir.src}" /&#62; &#60;/target&#62; &#60;/project&#62; Parametry axis2.classpath i [...]]]></description>
			<content:encoded><![CDATA[<p>Poniżej przykład uruchomienia generatora kodu Java dla zadanego WSDL (Axis2 WSDL2JAVA):</p>
<p>Z kosoli:</p>
<p><code>$PROJEKT/scr&gt; WSDL2Java -uri http://localhost:8080/axis2/services/WebServiceExample?wsdl -d adb -s -S .</code></p>
<p>Ant:</p>
<p><code><br />
&lt;project name="WsExampleClient" default="dist" basedir="."&gt;<br />
	&lt;property name="location.dir.src" value="."/&gt;<br />
	&lt;path id="axis2.classpath"&gt;<br />
		&lt;fileset dir="D:\libs\axis2-1.4.1\lib"&gt;<br />
			&lt;include name="**/*.jar" /&gt;<br />
		&lt;/fileset&gt;<br />
	&lt;/path&gt;<br />
	&lt;target name="codegen"&gt;<br />
		&lt;taskdef name="axis2-wsdl2java" classname="org.apache.axis2.tool.ant.AntCodegenTask"<br />
			classpathref="axis2.classpath" /&gt;<br />
		&lt;axis2-wsdl2java<br />
			wsdlfilename="http://localhost:8080/axis2/services/WebServiceExample?wsdl"<br />
			output="${location.dir.src}" /&gt;<br />
	&lt;/target&gt;<br />
&lt;/project&gt;<br />
</code></p>
<p>Parametry axis2.classpath i wsdlfilename ustawiamy swoje. Sorkiewicz za brak wcięć <img src='http://ludera.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://ludera.info/java/wsdl2java-w-ant/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java &#8211; wyrażenia regularne &#8211; vademecum</title>
		<link>http://ludera.info/java/java-wyrazenia-regularne-vademecum</link>
		<comments>http://ludera.info/java/java-wyrazenia-regularne-vademecum#comments</comments>
		<pubDate>Thu, 21 May 2009 12:37:06 +0000</pubDate>
		<dc:creator>Dariusz Ludera</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[regexp]]></category>
		<category><![CDATA[regular expressions]]></category>
		<category><![CDATA[wyrażenia regularne]]></category>

		<guid isPermaLink="false">http://ludera.info/?p=260</guid>
		<description><![CDATA[Ile razy piszę jakiegoś bardziej skomplikowanego regexpa w Javie, tyle razy muszę posiłkować się Google, bo nie mogę zapamiętać wszystkich składniowych fanaberii twórców wyrażeń regularnych. Wygląda na to że ta stronka zawiera wszystko w jednym miejscu, nic tylko wydrukować i położyć na biurku albo powiesić na wewnętrznej stronie drzwi firmowej toalety http://mindprod.com/jgloss/regex.html PS. Jeśli trafiłeś [...]]]></description>
			<content:encoded><![CDATA[<p>Ile razy piszę jakiegoś bardziej skomplikowanego regexpa w Javie, tyle razy muszę posiłkować się Google, bo nie mogę zapamiętać wszystkich składniowych fanaberii twórców wyrażeń regularnych.</p>
<p>Wygląda na to że ta stronka zawiera wszystko w jednym miejscu, nic tylko wydrukować i położyć na biurku albo powiesić na wewnętrznej stronie drzwi firmowej toalety <img src='http://ludera.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a title="Wyrażenia regularne w Javie" href="http://mindprod.com/jgloss/regex.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/mindprod.com/jgloss/regex.html?referer=');">http://mindprod.com/jgloss/regex.html</a></p>
<p>PS. Jeśli trafiłeś tutaj z wyszukiwarki z chęcią nauczenia się wyrażeń regularnych, zacznij od <a title="Wyrażenia regularne w Javie" href="http://www.javaworld.com/javaworld/jw-07-2001/jw-0713-regex.html?page=1" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.javaworld.com/javaworld/jw-07-2001/jw-0713-regex.html?page=1&amp;referer=');">tego artykułu</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://ludera.info/java/java-wyrazenia-regularne-vademecum/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aplikacja JEE &#8211; problem z kodowaniem w UTF-8</title>
		<link>http://ludera.info/java/aplikacja-jee-problem-z-kodowaniem-w-utf-8</link>
		<comments>http://ludera.info/java/aplikacja-jee-problem-z-kodowaniem-w-utf-8#comments</comments>
		<pubDate>Tue, 17 Mar 2009 15:04:25 +0000</pubDate>
		<dc:creator>Dariusz Ludera</dc:creator>
				<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://ludera.info/?p=241</guid>
		<description><![CDATA[Ostatnio w projekcie pojawił się tajemniczy bug, którego genezy jak dotąd nie udało się ustalić &#8211; wstęp rodem z Archiwum X . Problem polegał na złym wyświetlaniu polskich ogonków, pomimo ustawienia dobrych charsetów w plikach JSP, odpowiedniego kodowania plików i innych cudów na kiju standardowo robionych przy problemie z wyświetlaniem krzaczków zamiast polskich znaków diakrytycznych. [...]]]></description>
			<content:encoded><![CDATA[<p>Ostatnio w projekcie pojawił się tajemniczy bug, którego genezy jak dotąd nie udało się ustalić &#8211; wstęp rodem z Archiwum X <img src='http://ludera.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Problem polegał na złym wyświetlaniu polskich ogonków, pomimo ustawienia dobrych charsetów w plikach JSP, odpowiedniego kodowania plików i innych cudów na kiju standardowo robionych przy problemie z wyświetlaniem krzaczków zamiast polskich znaków diakrytycznych. Co ciekawsze kiedyś działało i nagle przestało &#8211; standard.</p>
<p>Wg ustaleń problem ten związany mógł być z przekazaniem autentykacji do ról JBossa (chodzi o napisanie własnego <a title="Apache realm" href="http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/tomcat.apache.org/tomcat-6.0-doc/realm-howto.html?referer=');">Realma</a>, który zaczął coś mieszać) albo dziwnym zachowaniem niektórych komponentów <a title="RichFaces live demo" href="http://livedemo.exadel.com/richfaces-demo/richfaces/tabPanel.jsf" target="_blank" onclick="pageTracker._trackPageview('/outgoing/livedemo.exadel.com/richfaces-demo/richfaces/tabPanel.jsf?referer=');">RichFaces</a>. Na sto procent nie udało się znaleźć w czym on tkwił, szybko jednak znalazło się rozwiązanie (niestety nie mojego autorstwa &#8211; pozdrawiam z tego miejsca mojego kierownika <img src='http://ludera.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
<p>Od tego czasu, każda aplikacja webowa w Javie w której będę maczał swoje paluszki posiadać będzie Filter, który ustawi charset requestu na UTF-8, wg wzoru:</p>
<p><code><br />
public void doFilter(ServletRequest req,<br />
ServletResponse resp,<br />
FilterChain chain) {<br />
if (req.getCharacterEncoding() == null)<br />
req.setCharacterEncoding("UTF-8");<br />
}</code></p>
<p>Podpowiedzią do rozwiązania tego problemu, był taki oto wpis w web.xml viewera z pakietu do tworzenia raportów <a title="Eclipse Birt" href="http://www.eclipse.org/birt/phoenix/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.eclipse.org/birt/phoenix/?referer=');">Birt</a>:</p>
<pre>&lt;filter&gt;
    &lt;description&gt;
        Filter to handle request object.
        Currently, set request
	character encoding to UTF-8.
    &lt;/description&gt;
    &lt;filter-name&gt;ViewerFilter&lt;/filter-name&gt;
    &lt;filter-class&gt;
        org.eclipse.birt.report.filter.ViewerFilter
    &lt;/filter-class&gt;
  &lt;/filter&gt;</pre>
<p>Także ta buła dotknęła nie pierwszy i nie ostatni projekt w JEE:)</p>
<p>Edit: Po fakcie znalazłem <a title="utf-8 problem in java fix" href="http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-tomcat-jsp-etc.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/cagan327.blogspot.com/2006/05/utf-8-encoding-fix-tomcat-jsp-etc.html?referer=');">dobrą notkę</a> dla opornych na ten temat.</p>
]]></content:encoded>
			<wfw:commentRss>http://ludera.info/java/aplikacja-jee-problem-z-kodowaniem-w-utf-8/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jak pobrać ilość wierszy z Result Set</title>
		<link>http://ludera.info/java/jak-pobrac-ilosc-wierszy-z-result-set</link>
		<comments>http://ludera.info/java/jak-pobrac-ilosc-wierszy-z-result-set#comments</comments>
		<pubDate>Fri, 30 Jan 2009 13:58:33 +0000</pubDate>
		<dc:creator>Dariusz Ludera</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[jdbc]]></category>
		<category><![CDATA[ResultSet]]></category>

		<guid isPermaLink="false">http://ludera.info/?p=216</guid>
		<description><![CDATA[Wydawało by się, że będzie to banalne i ograniczy się do wywołania na rzecz naszego ResultSeta metody getRowsCount() lub podobnej. Niestety nie jest to takie oczywiste. ResultSetMetaData, czyli obiekt zawierające przeróżne informacje na temat samego ResultSeta, również nie posiada odpowiedniej metody. Wymyśliłem więc takie cuś. Wygląda pokracznie, żeby nie powiedzieć paskudnie&#8230; ale działa i dobrze [...]]]></description>
			<content:encoded><![CDATA[<p>Wydawało by się, że będzie to banalne i ograniczy się do wywołania na rzecz naszego ResultSeta metody getRowsCount() lub podobnej.</p>
<p>Niestety nie jest to takie oczywiste. ResultSetMetaData, czyli obiekt zawierające przeróżne informacje na temat samego ResultSeta, również nie posiada odpowiedniej metody.</p>
<p>Wymyśliłem więc takie cuś. Wygląda pokracznie, żeby nie powiedzieć paskudnie&#8230; ale działa i dobrze się ma <img src='http://ludera.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre>
try {
    // scrollowalny ResultSet
    Statement stmt =
        connection.createStatement(
        ResultSet.TYPE_SCROLL_INSENSITIVE,
        ResultSet.CONCUR_READ_ONLY);
    ResultSet resultSet =
        stmt.executeQuery("SELECT * FROM t_t1");

    resultSet.last();
    int rowCount = resultSet.getRow();
    resultSet.beforeFirst();

    // teraz mozna dalej uzywac
    // do woli ResultSeta
    ...
} catch(SQLException e) {
    e.printStackTrace();
    // lub jakies bardziej eleganckie:
    log.error(e.getMessage());
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://ludera.info/java/jak-pobrac-ilosc-wierszy-z-result-set/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sun Certified Java Programmer (SCJP) &#8211; jak zdać</title>
		<link>http://ludera.info/cv/sun-certified-java-programmer-scjp-jak-zdac</link>
		<comments>http://ludera.info/cv/sun-certified-java-programmer-scjp-jak-zdac#comments</comments>
		<pubDate>Wed, 31 Dec 2008 13:28:25 +0000</pubDate>
		<dc:creator>Dariusz Ludera</dc:creator>
				<category><![CDATA[Cv]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[ludera]]></category>
		<category><![CDATA[scjp]]></category>

		<guid isPermaLink="false">http://ludera.info/?p=171</guid>
		<description><![CDATA[Szczęśliwie jestem już Sun Certified Java Programmer (SCJP), więc postanowiłem podzielić się z innym jak go zdać, a wbrew pozorom nie jest to takie hopaj siup, nawet dla osób które kodują w Javie od jej początków. Egzamin bowiem polega na zamienieniu się osoby egzaminowanej w kompilator i udzielaniu odpowiedzi na pytania typu: czy dany kod [...]]]></description>
			<content:encoded><![CDATA[<p>Szczęśliwie jestem już <a title="Sun Certified Java Programmer (SCJP) " href="http://www.sun.com/training/certification/java/scjp.xml" target="_self" onclick="pageTracker._trackPageview('/outgoing/www.sun.com/training/certification/java/scjp.xml?referer=');">Sun Certified Java Programmer</a> (<a title="Sun Certified Java Programmer (SCJP) " href="http://www.sun.com/training/certification/java/scjp.xml" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.sun.com/training/certification/java/scjp.xml?referer=');">SCJP</a>), więc postanowiłem podzielić się z innym jak go zdać, a wbrew pozorom nie jest to takie hopaj siup, nawet dla osób które kodują w Javie od jej początków.</p>
<p>Egzamin bowiem polega na zamienieniu się osoby egzaminowanej w kompilator i udzielaniu odpowiedzi na pytania typu: czy dany kod się skompiluje (jeżeli nie to dlaczego) a jeśli tak to co będzie wynikiem jego działania. Jednym słowem podchwytliwy test wielokrotnego wyboru.</p>
<p>Po pierwsze sugestia: dobrze zastanów się i oceń swoje możliwości dotyczące czasu jaki przeznaczysz na naukę oraz swoich dotychczasowych umiejętności z zakresu Javy. Jeśli Twój voucher traci już termin ważności a Ty z nauką jesteś w lesie, zastanów się z jakiej edycji Javy chcesz być egzaminowany. Moja sytuacja była właśnie taka, że od poinformowania mnie o tym że mam zostać SCJP do terminu upłynięcia ważności vouchera miałem około miesiąca na przygotowanie się. Zdecydowałem się więc pójść na łatwiznę i zdawać Javę 1.4. Egzaminy różnią się tematyką, zakresem materiału, ilością pytań oraz wymaganą do zdania ilością udzielenia pozytywnych odpowiedzi. Java 1.4 jest obiektywnie patrząc prostsza do nauczenia się i zdania.</p>
<p>Poniżej linki do wymagań egzaminacyjnych:</p>
<p>- <a href="http://www.sun.com/training/catalog/courses/CX-310-065.xml" onclick="pageTracker._trackPageview('/outgoing/www.sun.com/training/catalog/courses/CX-310-065.xml?referer=');">Sun Certified Programmer for the Java Platform, Standard Edition 6 (CX-310-065)  &#8211; NEW!</a></p>
<p>- <a href="http://www.sun.com/training/catalog/courses/CX-310-066.xml" onclick="pageTracker._trackPageview('/outgoing/www.sun.com/training/catalog/courses/CX-310-066.xml?referer=');">Upgrade Exam: Sun Certified Programmer for the Java Platform, Standard Edition 6 (CX-310-066) &#8211; NEW!</a></p>
<p>- <a href="http://www.sun.com/training/catalog/courses/CX-310-055.xml" onclick="pageTracker._trackPageview('/outgoing/www.sun.com/training/catalog/courses/CX-310-055.xml?referer=');">Sun Certified Programmer for the Java Platform, Standard Edition 5.0 (CX-310-055) </a></p>
<p>- <a href="http://www.sun.com/training/catalog/courses/CX-310-056.xml" onclick="pageTracker._trackPageview('/outgoing/www.sun.com/training/catalog/courses/CX-310-056.xml?referer=');">Upgrade Exam: Sun Certified Programmer for the Java Platform, Standard Edition 5.0 (CX-310-056) </a></p>
<p>Materiały do nauki:</p>
<ul>
<li>obowiązkowo: <a title="SCJP Sun Certified Programmer for Java 5 Study Guide (Exam 310-055) Katherine Sierra" href="http://www.amazon.com/Certified-Programmer-310-055-Certification-Guides/dp/0072253606" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.amazon.com/Certified-Programmer-310-055-Certification-Guides/dp/0072253606?referer=');">SCJP Sun Certified Programmer for Java 5 Study Guide (Exam 310-055) by Katherine Sierra and Bert Bates</a> (można znaleźć również darmowy eBook)</li>
</ul>
<ul>
<li>jako powtórka: <a title="SCJP tutorial" href="http://www.mariuszlipinski.pl/search/label/SCJP" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.mariuszlipinski.pl/search/label/SCJP?referer=');">http://www.mariuszlipinski.pl/search/label/SCJP</a></li>
</ul>
<ul>
<li>tuż przed egzaminem: <a title="Whizlabs" href="http://www.whizlabs.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.whizlabs.com/?referer=');">Egzaminy Whizlabs</a> &#8211; bez przerobienia tego do egzaminu nie podchodź!</li>
</ul>
<p>Swój egzamin zdawałem w Krakowie, w ośrodku <a title="ABC Data" href="http://edukacja.abcdata.pl/" onclick="pageTracker._trackPageview('/outgoing/edukacja.abcdata.pl/?referer=');">ABC Data</a> przy Długiej 48 i bardzo go polecam. Co najważniejsze są stosunkowo krótkie kolejki, radzę jednak umówić się telefonicznie na ponad miesiąc przed, by nie stresować się, że voucher przepadnie albo będziemy zmuszeni podróżować po Polsce w poszukiwaniu inszego ośrodka z wolnymi miejscami (przeegzaminuje cię każdy ośrodek który chwali się <a title="Prometric" href="http://www.prometric.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.prometric.com/?referer=');">Prometric</a>, cokolwiek by to było <img src='http://ludera.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).</p>
<p>Przebieg egzaminu jest nagrywany, mamy do dyspozycji tabliczkę formatu A4 i marker, co zwłaszcza przy egzaminie w edycji 1.4 może być kłopotliwe (rozpisywanie kolejności operatorów itp). Wynik egzaminu znany jest zaraz po jego zakończeniu, na okoliczność czego otrzymujemy papierowy raport z przebiegu egzaminu, z wyszczególnionymi ocenami z poszczególnych jego części &#8211; rozdziałów. Właściwy certyfikat, z gadżetami które prezentuję poniżej i zgodą na używanie logo SCJP otrzymamy na wskazany adres.</p>

<a href="http://ludera.info/wp-content/gallery/mecv/ludera_dariusz_scjp.jpg" title="Zasadność wysłania tej karty a'la kredytowa jeszcze jestem w stanie zrozumieć, ale tej plakietki hmm... idealna żeby sobie w klapę marynarki wpiąć na rozmowę kwalifikacyjną :D" class="shutterset_singlepic29" >
	<img class="ngg-singlepic ngg-center" src="http://ludera.info/wp-content/gallery/cache/29__320x240_ludera_dariusz_scjp.jpg" alt="ludera_dariusz_scjp.jpg" title="ludera_dariusz_scjp.jpg" />
</a>

<p>Aha, bardzo ważna sprawa: Przed rozpoczęciem egzaminu jesteśmy przepytywani jak oceniamy swoje przygotowanie z poszczególnych zagadnień do egzaminu. Ma to chyba wpływ na rodzaj losowanych pytań, ja zachowawczo przy wszystkich zagadnieniach postawiłem ocenę Good i tematykę pytań miałem raczej równo zbalansowaną. Kolega z którym zdawalem egzamin, kiepsko ocenił się z wątków i mial właśnie więcej z nich pytań &#8211; szczęśliwie i tak dobrze zdał. Także nie wiem jaki dokładny wpływ na pytania ma ta ankieta, sugeruję uważać:)</p>
<p>Jeśli nie dostaliście od swojego pracodawcy vouchera na zdawanie egzaminu, bądź jesteście studentami poszukajcie kontaktu do <a title="Sun Campus Ambassador AGH" href="http://home.agh.edu.pl/~bachara/joomla/" onclick="pageTracker._trackPageview('/outgoing/home.agh.edu.pl/_bachara/joomla/?referer=');">Uczelnianych Ambasadorów Firmy Sun</a> &#8211; studenci mają olbrzymie zniżki na egzaminy (byćmoże to będzie dla kogoś motywacja na zapisanie się na kolejne studia w swoim życiu;)). Z tego miejsca pozwalam sobie zacytować Ambasadora Sun z jednej z krakowskich uczelni:</p>
<blockquote><p>Są zniżki dla studentów i pracowników uczelni. Cena egzaminu ze zniżką wynosi około 200zł (40€ z marginesem) zamiast mniej więcej 800zł.</p>
<p>Dostępne są następujące egzaminy:</p>
<p>212-019 Sun Certified Associate for Java Platform, Standard Edition, Exam Version 1.0</p>
<p>212-035 Sun Certified Programmer for the Java 2 Platform 1.4</p>
<p>212-055 Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0</p>
<p>212-056 Sun Certified Programmer for J2SE 5.0 &#8211; UPGRADE EXAM</p>
<p>212-065 Sun Certified Programmer for the Java 2 Platform, Standard Edition 6.0</p>
<p>212-066 Sun Certified Upgrade Exam for the Sun Certified Java Programmer, SE 6.0</p>
<p>212-083 Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5</p>
<p>212-105 Sun Certified Solaris Associate</p>
<p>212-200 Sun Certified System Administrator for Solaris 10 OS, Part 1 Exam</p>
<p>212-202 Sun Certified System Administrator for Solaris 10 OS, Part 2 Exam</p>
<p>212-302 Sun Certified Network Administrator for Solaris 10 OS Exam</p></blockquote>
<p>Data stworzenia tego posta zobowiązuje, zatem obiecuję sobie w 2009 roku podejść do <a title="Sun Certified Web Component Developer (SCWCD)" href="http://www.sun.com/training/certification/java/scwcd.xml" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.sun.com/training/certification/java/scwcd.xml?referer=');">SCWCD</a> i zrobić upgrade swojego SCJP do wersji 1.6. Czy się uda? Jak mawiają starzy górale &#8220;We will see&#8221;&#8230; <img src='http://ludera.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://ludera.info/cv/sun-certified-java-programmer-scjp-jak-zdac/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

