<?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>kurtsparber.de</title>
	<atom:link href="http://www.kurtsparber.de/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.kurtsparber.de</link>
	<description>Entwicklung, Design und Architekturen</description>
	<lastBuildDate>Tue, 15 May 2012 09:47:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>*.csv Verarbeitung mit opencsv</title>
		<link>http://www.kurtsparber.de/?p=93</link>
		<comments>http://www.kurtsparber.de/?p=93#comments</comments>
		<pubDate>Tue, 15 May 2012 09:47:06 +0000</pubDate>
		<dc:creator>sparber</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[csv]]></category>

		<guid isPermaLink="false">http://www.kurtsparber.de/?p=93</guid>
		<description><![CDATA[Wer kennt sie nicht? In fast jedem System mit Datenaustausch sind sie zu finden. Und falls nicht, benötigt sie mindestens eine das System nutzende Fachabteilung um sie in Excel einzulesen. Die Rede ist von csv Dateien, beschrieben in rfc4180, die einfachste Form des strukturierten Datenaustauschs. Wer beim Verarbeiten der Dateien zur Abwechslung mal nicht mit StringTokenizer, &#8230; </p><p><a class="more-link block-button" href="http://www.kurtsparber.de/?p=93">Weiterlesen &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Wer kennt sie nicht? In fast jedem System mit Datenaustausch sind sie zu finden. Und falls nicht, benötigt sie mindestens eine das System nutzende Fachabteilung um sie in Excel einzulesen. Die Rede ist von csv Dateien, beschrieben in <a href="http://tools.ietf.org/html/rfc4180">rfc4180</a>, die einfachste Form des strukturierten Datenaustauschs. Wer beim Verarbeiten der Dateien zur Abwechslung mal nicht mit StringTokenizer, StringBuilder und Listen von Strings hantieren möchte, sollte einen Blick auf <a href="http://opencsv.sourceforge.net/">opencsv</a> werfen. Insbesondere das Binding der csv Daten an JavaBeans ist erleichtert das Einlesen der Daten enorm, hier das Beispiel dazu aus der Dokumentation:</p>
<pre class="brush: java; gutter: true">ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setType(YourOrderBean.class);
// the fields to bind do in your JavaBean
String[] columns = new String[] {&quot;name&quot;, &quot;orderNumber&quot;, &quot;id&quot;};
strat.setColumnMapping(columns);

CsvToBean csv = new CsvToBean();
List list = csv.parse(strat, yourReader);</pre>
<p>Alles in allem ein hilfreiches kleines Framework, das die Arbeit mit csv Dateien erleichtert.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kurtsparber.de/?feed=rss2&#038;p=93</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JBoss 7 &#8211; maximum number of request parameters</title>
		<link>http://www.kurtsparber.de/?p=65</link>
		<comments>http://www.kurtsparber.de/?p=65#comments</comments>
		<pubDate>Mon, 14 May 2012 08:42:13 +0000</pubDate>
		<dc:creator>sparber</dc:creator>
				<category><![CDATA[Java EE]]></category>
		<category><![CDATA[JBoss 7]]></category>
		<category><![CDATA[jbossweb]]></category>

		<guid isPermaLink="false">http://www.kurtsparber.de/?p=65</guid>
		<description><![CDATA[Bei sehr großen Formularen kann es vorkommen, dass jbossweb an das Limit der Request Parameter stößt, dies resultiert dann in folgender Fehlermeldung: java.lang.IllegalStateException: More than the maximum number of request parameters (GET plus POST) for a single request ([512]) were detected. Any parameters beyond this limit have been ignored. To change this limit, set the &#8230; </p><p><a class="more-link block-button" href="http://www.kurtsparber.de/?p=65">Weiterlesen &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Bei sehr großen Formularen kann es vorkommen, dass jbossweb an das Limit der Request Parameter stößt, dies resultiert dann in folgender Fehlermeldung:</p>
<pre class="brush: java; gutter: false">java.lang.IllegalStateException: More than the maximum number of request
parameters (GET plus POST) for a single request ([512]) were detected. Any
parameters beyond this limit have been ignored. To change this limit,
set the maxParameterCount attribute on the Connector.
	org.apache.tomcat.util.http.Parameters.addParameter(Parameters.java:199)
	org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:383)
	org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:229)
	org.apache.catalina.connector.Request.parseParameters(Request.java:2874)
	org.apache.catalina.connector.Request.getParameter(Request.java:1291)
	...</pre>
<p>Laut Tomcat Dokumentation sollte der Parameter maxParameterCount auf 10000 stehen, dies ist aber bei jbossweb nicht der Fall. Um den Parameter zu setzen ist es notwendig eine <strong><em>system property</em></strong> mit den Namen <strong><em>org.apache.tomcat.util.http.Parameters.MAX_COUNT</em></strong> zu setzen. Dies kann entweder über die JBoss 7 Kommando Konsole erfolgen (<em><strong>jboss-cli</strong></em>) oder direkt über die Konfigurationsdatei <em><strong>standalone.xml</strong></em>.</p>
<p>Der Aufruf mit jboss-cli sieht folgendermaßen aus:</p>
<pre class="brush: bash; gutter: false">/system-property=org.apache.tomcat.util.http.Parameters.MAX_COUNT:add(value=10000)</pre>
<p>Dieser Aufruf erzeugt einen Eintrag in standalone.xml, welcher auch direkt eingefügt werden könnte:</p>
<pre class="brush: xml; gutter: true">&lt;system-properties&gt;
   &lt;property name=&quot;org.apache.tomcat.util.http.Parameters.MAX_COUNT&quot; value=&quot;10000&quot;/&gt;
&lt;/system-properties&gt;</pre>
<p>Nach einem <strong>Neustart </strong>des Servers sollten das Problem beseitigt sein.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kurtsparber.de/?feed=rss2&#038;p=65</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Echo Service mit Websocket und Glassfish</title>
		<link>http://www.kurtsparber.de/?p=44</link>
		<comments>http://www.kurtsparber.de/?p=44#comments</comments>
		<pubDate>Sat, 05 May 2012 19:12:59 +0000</pubDate>
		<dc:creator>sparber</dc:creator>
				<category><![CDATA[Java EE]]></category>

		<guid isPermaLink="false">http://www.kurtsparber.de/?p=44</guid>
		<description><![CDATA[Kürzlich stand ich im Bahnhofskiosk und überflog kurz das Javamagazin 05/2012 zum Thema Websockets. Grund genug, selbst zu recherchieren und auszuprobieren was Java, speziell Application Server hinsichtlich Websockets zu bieten haben. Was ist ein Websocket? Das WebSocket Protokoll, beschrieben in RFC 6455, ermöglicht eine bidirektionale Kommunikation zwischen einem Server und einer Webanwendung. Die Verbindung zum &#8230; </p><p><a class="more-link block-button" href="http://www.kurtsparber.de/?p=44">Weiterlesen &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Kürzlich stand ich im Bahnhofskiosk und überflog kurz das Javamagazin 05/2012 zum Thema Websockets. Grund genug, selbst zu recherchieren und auszuprobieren was Java, speziell Application Server hinsichtlich Websockets zu bieten haben.</p>
<p><strong>Was ist ein Websocket?</strong></p>
<p>Das WebSocket Protokoll, beschrieben in RFC 6455, ermöglicht eine bidirektionale Kommunikation zwischen einem Server und einer Webanwendung. Die Verbindung zum Server wird dabei über http initialisiert und dann offen gehalten. Übertragen werden können dann Binärdaten oder Zeichenketten.</p>
<p><strong>Java und Websockets</strong></p>
<p>Recherchiert man im Netz, so finden sich durchwegs viele Frameworks, bzw. Server die Websockets unterstützen. Einen Standard zur Integration in einen Application Server gibt es jedoch noch nicht, was nicht verwundert, da das Protokoll noch nicht abschließend spezifiziert ist. Eine Standardisierung ist in Java EE Version 7 zu erwarten.</p>
<p>Für Jetty und Glassfish existieren gut dokumentierte und nachvollziehbare Beispiele und Dokumentationen, JBoss AS 7 hingegen unterstützt Websockets derzeit noch unzureichend. Eine Implementierung ist jedoch in Arbeit <a href="https://github.com/mikebrock/jboss-websockets">https://github.com/mikebrock/jboss-websockets</a>. Alternativ ist es wohl mit Hilfe eines eingebetteten Jetty Servers möglich Websocket Kommunikation auch mit dem JBoss zu betreiben, sofern man noch davon sprechen kann. Mehr dazu siehe hier:  <a href="http://golovnin.blogspot.it/2012/04/jboss-7-and-websockets.html">http://golovnin.blogspot.it/2012/04/jboss-7-and-websockets.html</a></p>
<p><strong>Glassfish Echo Server</strong></p>
<p>Entschieden habe ich mich für eine einfachste Implementierung mit dem Glassfish Application Server. Die Idee: Einen einfachen Echo Service mit minimalen Codeumfang als Maven Projekt zu implementieren und die Stolpersteine dabei kennenzulernen.</p>
<p>Es existieren einige Beispiele im Netz, jedoch stellte sich bald heraus, dass zahlreiche von ihnen nicht lauffähig waren, Ursache dafür war eigentlich immer eine veraltete Protokollversion. Eine mit dem Glassfish 3.1.2 funktionierende Applikation ist hier zu finden: <a href="http://download.java.net/maven/glassfish/com/sun/grizzly/samples/grizzly-websockets-chat/1.9.19/">http://download.java.net/maven/glassfish/com/sun/grizzly/samples/grizzly-websockets-chat/1.9.19/</a></p>
<p>Mein Beispiel sollte jedoch etwas weniger umfänglich sein.</p>
<p>Glassfish benutzt ein standard HttpServlet als Einstiegspunkt für die Websocket Kommunikation, welches einen WebSocket Adapter registriert. Im pom.xml des Projekt sind also folgende Abhängigkeiten notwendig:</p>
<pre class="brush: xml; gutter: true">&lt;dependency&gt;
   &lt;groupId&gt;javax&lt;/groupId&gt;
   &lt;artifactId&gt;javaee-api&lt;/artifactId&gt;
   &lt;version&gt;6.0&lt;/version&gt;
   &lt;scope&gt;provided&lt;/scope&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
   &lt;groupId&gt;com.sun.grizzly&lt;/groupId&gt;
   &lt;artifactId&gt;grizzly-websockets&lt;/artifactId&gt;
   &lt;version&gt;1.9.46&lt;/version&gt;
   &lt;scope&gt;provided&lt;/scope&gt;
&lt;/dependency&gt;</pre>
<p>Die Implementierung des Servlets selbst ist recht einfach:</p>
<pre class="brush: java; gutter: true">public class WebsocketServlet extends HttpServlet {

    /** The Application to register or unregister. */
    private final EchoApplication app = new EchoApplication();

    @Override
    public void init(ServletConfig config) throws ServletException {
        WebSocketEngine.getEngine().register(app);
    }

    @Override
    public void destroy() {
        WebSocketEngine.getEngine().unregister(app);
    }
}</pre>
<p>In Zeile 4 wird eine Instanz der eigentlichen Websocket Applikation erzeugt, welche wiederum WebSocketApplication erweitert. EchoApplication erweitert überschreibt dabei die Methode zur Erzeugung des Websockets und zur Verarbeitung eingehender Textnachrichten. Zur Verarbeitung von binären Nachrichten oder fragmentierten Nachrichten existieren eigene Methode. Dementsprechend einfach ist ist auch die Echo Applikation gehalten:</p>
<pre class="brush: java; gutter: true">public class EchoApplication extends WebSocketApplication {

    /** The logger. */
    private static final Logger logger =
        Logger.getLogger(EchoApplication.class.getName());

    @Override
    public boolean isApplicationRequest(Request request) {
        final String uri = request.requestURI().toString();
        return uri.endsWith(&quot;/echo&quot;);
    }

    @Override
    public WebSocket createWebSocket(ProtocolHandler protocolHandler,
                                     WebSocketListener... listeners) {
        return new DefaultWebSocket(protocolHandler, listeners);
    }

    @Override
    public void onMessage(WebSocket socket, String text) {
        logger.info(&quot;Received message: &quot; + text);
        try {
            socket.send(text);
            logger.info(&quot;Sent message: &quot; + text);
        } catch (WebSocketException e) {
            logger.info(&quot;Error, closing socket: &quot; + e.getMessage());
            socket.close();
        }
    }
}</pre>
<p>Um auf Seiten des Clients eine Websocket Verbindung zu öffnen wird mit Javascript eine WebSocket Instanz mit der URL des Services erzeugt. Es gibt dabei vier Callback Funktionen und eine Funktion zum Senden von Nachrichten.</p>
<pre class="brush: javascript; gutter: true">webSocket = new WebSocket(&quot;ws://localhost:8080/echo-websocket/echo&quot;);

webSocket.onopen = function(event) {
    var $textarea = $(&#039;#echoLogId&#039;);
    $textarea.val($textarea.val() + &quot;Connected.\n&quot;);
};

webSocket.onmessage = function(event) {
    var $textarea = $(&#039;#echoLogId&#039;);
    $textarea.val($textarea.val() + &quot;Received: &quot; + event.data + &quot;\n&quot;);
    $textarea.animate({scrollTop:$textarea.height()}, 1000);
};

webSocket.onclose = function(event) {
    webSocket.send(&quot;Disconnected&quot;);
};

webSocket.onerror = function(event) {
    var $textarea = $(&#039;#echoLogId&#039;);
    $textarea.val($textarea.val() + &quot;Communication error!\n&quot;);
}</pre>
<p>jQuery ist übrigens nicht Voraussetzung für eine Websocket Kommunikation. Das Verschicken von Nachrichten erfolgt dann folgendermaßen:</p>
<pre class="brush: javascript; gutter: true">jQuery.sendEchoMessage = function() {
    var message = $(&#039;#echoMessageId&#039;).val();
    webSocket.send(message);
    var $textarea = $(&#039;#echoLogId&#039;);
    $textarea.val($textarea.val() + &quot;Sending: &quot; + message + &quot;\n&quot;);
};</pre>
<p>Nach dem Deployment kann die Applikation unter <em>http://localhost:8080/websockets-gl/</em> aufgerufen werden.</p>
<p><a href="http://www.kurtsparber.de/wordpress/wp-content/uploads/2012/05/websocketclient.png"><img class="alignnone size-full wp-image-53" style="border: 1px solid black;" title="websocketclient" src="http://www.kurtsparber.de/wordpress/wp-content/uploads/2012/05/websocketclient.png" alt="" width="418" height="188" /></a></p>
<p>Interessant ist wie der Client mit dem Server die Websocket Verbindung aushandelt, indem dieser nach einem Upgrade auf eine bestimmte Protokollversion fragt.</p>
<pre class="brush: text; gutter: true">Host=localhost:8080
...
Connection=keep-alive, Upgrade
Sec-WebSocket-Version=13
Origin=http://localhost:8080
Sec-WebSocket-Key=WqbvVAKudnxMdk7KQWJslg==
...
Upgrade=websocket</pre>
<p>Der Server akzeptiert das Upgrade und antwortet seinerseits mit einer 101</p>
<pre class="brush: text; gutter: true">Status=Switching Protocols - 101
Upgrade=websocket
Connection=Upgrade
Sec-WebSocket-Accept=rpoZxgcB9KqCOXdGWc/46nmkZLk=</pre>
<p><strong>Fazit</strong></p>
<p>Websocket ist ein interessanter Ansatz was die bidirektionale Kommunikation zwischen Client und Server angeht, vor allem kann dadurch ein ständiges Pollen des Clients entfallen. Derzeit ist die Standardisierung des Protokolls leider noch nicht abgeschlossen, insbesondere für die serverseitige Implementierung in Java gibt es noch keine Standards. Abhilfe wird hier vermutlich Java EE 7 schaffen. Auf Client Seite werden Websocket Verbindungen derzeit von Chrome, Firefox, Safari und Opera je nach Version unterschiedlich unterstützt. Der Internet Explorer kann noch nicht mit Websockets umgehen, es gibt aber Workarounds die auf Flash basieren. Erst ab Version 10 soll der IE dann Websocket Verbindungen beherrschen.<br />
Sobald die verbreiteten Browser Websocket unterstützen, Java EE das Protokoll in einer finalen Version in den Standard integriert, werden wir sich öfters Websockets in Webapplikationen finden.</p>
<p>Das gesamte Projekt ist hier zu finden: <a href="https://github.com/bpark/websockets-gl">https://github.com/bpark/websockets-gl</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.kurtsparber.de/?feed=rss2&#038;p=44</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Und es geht von vorne los&#8230;</title>
		<link>http://www.kurtsparber.de/?p=7</link>
		<comments>http://www.kurtsparber.de/?p=7#comments</comments>
		<pubDate>Wed, 02 Nov 2011 19:53:29 +0000</pubDate>
		<dc:creator>sparber</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.kurtsparber.de/?p=7</guid>
		<description><![CDATA[Nachdem Rechteumstellung bei hosteurope und ein neues WordPress Update mein altes Weblog mit in den Abgrund gerissen haben, starte ich das Ganze mal neu. Dies nehme ich auch als Gelegenheit wahr öfters Artikel zu Themen rund um Java Entwicklung zu verfassen, zumal hier lange Zeit Ruhe eingekehrt war. Allen Lesern wünsche ich daher viel Spaß &#8230; </p><p><a class="more-link block-button" href="http://www.kurtsparber.de/?p=7">Weiterlesen &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Nachdem Rechteumstellung bei hosteurope und ein neues WordPress Update mein altes Weblog mit in den Abgrund gerissen haben, starte ich das Ganze mal neu. Dies nehme ich auch als Gelegenheit wahr öfters Artikel zu Themen rund um Java Entwicklung zu verfassen, zumal hier lange Zeit Ruhe eingekehrt war.</p>
<p>Allen Lesern wünsche ich daher viel Spaß mit den neuen Artikeln.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kurtsparber.de/?feed=rss2&#038;p=7</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

