Apache httpcomponents-core NIO SSL example broken

The example snippet of a SSL enabled Apache http-components-core-based Webserver did not work out for me. It crashed after every Request with the following message:

Connection closed: [null]
I/O error: I/O dispatch worker terminated abnormally
Shutdown

Printing the StackTrace revealed the following:

org.apache.http.nio.reactor.IOReactorException: I/O dispatch worker terminated abnormally
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor .execute(AbstractMultiworkerIOReactor.java:324)
at com.demandware.tenantssl.NHttpSSLServer.main(SslPaymentServer.java:176)
Caused by: java.lang.UnsupportedOperationException: Entity template does not implement getContent()
at org.apache.http.entity.EntityTemplate.getContent(EntityTemplate.java:57)
at org.apache.http.nio.entity.NHttpEntityWrapper.(NHttpEntityWrapper.java:56)
at org.apache.http.nio.protocol.AsyncNHttpServiceHandler .sendResponse(AsyncNHttpServiceHandler.java:495)
at org.apache.http.nio.protocol.AsyncNHttpServiceHandler .responseReady(AsyncNHttpServiceHandler.java:362)
at org.apache.http.nio.protocol.BufferingHttpServiceHandler .responseReady(BufferingHttpServiceHandler.java:135)
at org.apache.http.impl.nio.DefaultNHttpServerConnection .produceOutput(DefaultNHttpServerConnection.java:221)
at org.apache.http.impl.nio.ssl.SSLServerIOEventDispatch .outputReady(SSLServerIOEventDispatch.java:252)
at org.apache.http.impl.nio.reactor.BaseIOReactor .writable(BaseIOReactor.java:185)
at org.apache.http.impl.nio.reactor.AbstractIOReactor .processEvent(AbstractIOReactor.java:338)
at org.apache.http.impl.nio.reactor.AbstractIOReactor .processEvents(AbstractIOReactor.java:315)
at org.apache.http.impl.nio.reactor.AbstractIOReactor .execute(AbstractIOReactor.java:275)
at org.apache.http.impl.nio.reactor.BaseIOReactor .execute(BaseIOReactor.java:104)
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker .run(AbstractMultiworkerIOReactor.java:542)
at java.lang.Thread.run(Thread.java:662)

As inline subclassed EntityTemplate does not implement getContent(), you just have to add this tiny snippet in the two inline definitions of EntityTemplate for a minimal working SSL-server:

EntityTemplate body = new EntityTemplate(new ContentProducer()
{

	public void writeTo(final OutputStream outstream) throws IOException
	{
		OutputStreamWriter writer = new OutputStreamWriter(outstream, "UTF-8");
		writer.write("<html><body><h1>");
		writer.write("File ");
		writer.write(file.getPath());
		writer.write(" not found");
		writer.write("</h1></body></html>");
		writer.flush();
	}
}) {
	@Override
	public InputStream getContent() {
		return new InputStream() {

			@Override
			public int read() throws IOException
			{
				return 0;
			}

		};
	}
};

Hadoop MultipleOutputCollector MRunit Testcase

Code-Snippet for a test case with MRUnit and Mockito to test a Hadoop Reducer with MultipleOutputs. MRUnit ReduceDriver unfortunately does not return result data when using multiple Ouptuts.

private HashMap<String, MockOutputCollector> mockOutputCollectors = new HashMap<String, MockOutputCollector>();

@Test
public void test() {
	driver.withInput(new Text(INPUT_KEY, INPUT).run();
	List<Type> resultList = new ArrayList<Type>();

	// This has to be done that complicated way as the above driver.run() only returns an empty list
	// if run with ReduceDriver. For some reason it works with MapDriver, though...
	for (String collectorDirectory : mockOutputCollectors.keySet()) {
		MockOutputCollector<NullWritable, Object> mockOutputCollector = mockOutputCollectors
				.get(collectorDirectory);
		for (Pair<NullWritable, Object> pair : mockOutputCollector.getOutputs()) {
			if (pair.getSecond() instanceof MultipleOutputType1) {
				MultipleOutputType1 multipleOutputType = (MultipleOutputType1) pair.getSecond();
				logger.debug("MultipleOutputType1: "
						+ multipleOutputType.toString());
			}
			if  (pair.getSecond() instanceof MultipleOutputType2) {
				[...]
			}

		}
	}
}

@Before
public void setup() {
	for (Directories directory : Directories.values()) {
		mockOutputCollectors.put(directory.getDirectoryName(),
				new MockOutputCollector());
		when(
				multipleOutputs.getCollector(
						eq(directory.getDirectoryName()),
						argThat(new IsMockReporter()))).thenReturn(
				mockOutputCollectors.get(directory.getDirectoryName()));
	}
	mockOutputCollectors.put(
			OUTPUT_DIRECTORY_NAME,
			new MockOutputCollector());
	
	when(
			multipleOutputs.getCollector(
					eq(OUTPUT_DIRECTORY_NAME),
					argThat(new IsMockReporter()))).thenReturn(
				mockOutputCollectors.get(Constants.OUTPUT_DIRECTORY_NAME));
}

Axsotic in Action

Der Axsotic ist erschienen und kann ab sofort bestaunt werden. Es wird eine kleine Feldstudie durchgeführt, wieviel man bereit ist, für so ein innovatives Gerät zu bezahlen. Hier eine kleine Demo:

3D-Spheric-Mouse from Valentin Heun on Vimeo.

Geocaching im Senioren- und Rentner-Kletterbaum

Dieser Cache in Jena wird als Senioren- und Kindergeeignet ausgewiesen… naja, so ganz stimmt das nicht, jedenfalls nicht ohne vernünftige Ausrüstung.

K3b-Plugin für Shuffle-unfähige CD-Player

Mein DVD-Player spielt zwar MP3-DVDs ab, kennt aber dummerweise keinen Random-Modus, spielt also alle Titel hintereinanderweg Album für Album durch. Als Gegenmaßnahme habe ich ein Plugin für K3b geschrieben, dass allen Dateien im Wurzelverzeichnis (mehr oder weniger) zufällige Namen gibt. Die Dateien heißen dann “titleXXXXX.ext”, die X werden durch Ziffern ersetzt, die Erweiterung wird beibehalten. Es basiert auf den K3b-Plugins audioprojectcddb und audiometainforenamer von Sebastian Trueg. Es arbeitet nur auf  neu erstellten Datenprojekten, nicht auf importieren Sessions.
k3bdataprojectrandomizerplugin

Cindy mag keinen Besen

Geocaching

Geocaching ist die lang erwartete Anwendung für GPS-Geräte in Privatanwenderhand. Dabei läuft man in der Natur herum und sucht versteckte Tupperdosen oder Filmdosen, für die nur die GPS-Koordinaten bekannt sind. Hier ist der Link zu meinem Profil:
Profile for christian_bay

Zum Cachen habe ich mein Medion-Navi MDPNA 200 freigeschaltet und nutze unter Windows CE Glopus mit OpenStreetMap-Karten zum Cachen.

Core4400

Hardware-mäßig kein Exot, dafür aber Software-mäßig. Core2Duo 8400, 4 GB Crucial Ballistix RAM und eine Asus ATI Radeon 1950 Pro. Bei diesem System war mir die Lautstärke wichtig, ein flüsterleises und kühles System mit Bequiet-Netzteil für die Lüftersteuerung. Die Graka hat eine gigantische Heatpipe-Konstruktion und ist nicht hörbar. Der Skythe Samurai kühlt den Prozessor auf 40 Grad bei Vollast und ebenfalls flüsterleise. Am längsten hat die Auswahl des Mainboards gedauert, am Ende ist es dann ein Gigabyte GA P35C-DS3R geworden.Aber die Software!! Naja. Kein LFS mehr, ich habe mittlerweile Gentoo für mich entdeckt. Ein erstaunliches Build-System, wirklich. Hat mich überzeugt. Das macht doch tatsächlich genau, was ich will.. Das erste System überhaupt! Und wenn nicht dann kann man immernoch im gut dokumentierten Innereien herumsägen un basteln. Wirklich toll.

Die Besonderheit hierbei ist das Boot-Setup. Linux ist in einem Linux-Software-RAID 5 installiert, über insgesamt 3 SATA-Platten. Meine Daten-Laufwerke sollen auch unter Windows verfügbar sein und sind daher mit NTFS formatiert. Jedoch wollte ich auch hier nicht auf eine gewisse Datensicherheit verzichten, daher sind die beiden Datenpartitionen mit dem Windows-eigenen Software-RAID gespiegelt. Problem dabei ist, dass diese Windows-RAID-Laufwerke nur funktionieren, wenn sie auf einer Platte mit LDM angelegt werden können (dynamischer Datenträger unter Windows). Dummerweise liegen auch die beiden Partitionen des Linux-RAID5-Arrays auf den LDM-Platten. Diese Partitionstabelle erkennt der Autoassembler für die Linux-RAIDs beim Booten aber nicht. Dazu muss eine Initial-Ramdisk angelegt werden, die das Array zusammenbastelt. Eine Beispielramdisk gibts hier (initramfs.tar). Das entsprechende Initscript /sbin/init sieht folgendermaßen aus:

#!/bin/sh
export PATH=/bin:/sbin
umask 0077
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t tmpfs tmpfs /dev
busybox –install -s
mdev -s
echo /sbin/mdev > /proc/sys/kernel/hotplug
mknod /dev/md0 b 9 0
ln -s /dev/console /dev/tty
mdadm –assemble /dev/md0 /dev/sda11 /dev/sdb3 /dev/sdc3
mount /dev/md0 /new-root
echo > /proc/sys/kernel/hotplug
umount -l /proc /sys /dev
exec switch_root /new-root /sbin/init
exec /bin/sh

Unter Linux sind die LDM-Laufwerke nach folgendem Eintrag in /etc/mdadm.conf verfügbar:

DEVICE /dev/sdb1 /dev/sdc1
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=867e99c4:e8616584:39ad41ad:XXXXXX
DEVICE /dev/sdb2 /dev/sdc2
ARRAY /dev/md2 level=raid1 num-devices=2 UUID=81183f55:72559ad3:3f16c699:XXXXXX

Mit folgendem Script kann man das ganze dann scharf schalten:

mdadm –assemble /dev/md1 /dev/sdb1
mdadm –run /dev/md1
mdadm –add /dev/md1 /dev/sdc1
mdadm –assemble /dev/md2 /dev/sdb2
mdadm –run /dev/md2
mdadm –add /dev/md2 /dev/sdc2

Danach wird das Array neu synchronisiert, das dauert ne Weile, aber es kann schon gemountet werden.

Powerbook Lombard

… mit 400 MHz G3 und 256 MB RAM. Hier läuft Gentoo Linux mit Unterstützung für (fast) alle Hardware. Sogar XV-Ausgabe und die recht beschränkten DRI-Fähigkeiten des Mach64 werden unterstützt – leider aber mit starken Farbfehlern. Liegt warhscheinlich an der Kombination alter X-Server und komisches Kernel-Modul für zu neuen Kernel. Nun ja. Xorg nochmal neu bauen, dann gehts vielleicht. Aber das wird wohl eher auf Gentoo hinauslaufen. Denn mittleiweile habe ich nicht mehr die Zeit, überhaupt ein LFS auf auktuellem Stand zu halten. Geschweige denn 4 oder 5.
Was nicht geht ist die Hardware-Beschleunigung für MPEG-Decodierung. Denn in diesem Powerbook ist eine DXR3-Hollywood-änhliche PCI-Karte eingebaut(!). Leider gibt es bis jetzt keinen Treiber dafür, nur einen Stub.

Motorola Powerstack

PC-Harware, aber PowerPC-Prozessor, 300 MHz PowerPC 604e. Leider habe ich nie ein PowerPC-Grafik-BIOS auf meine Matrox Millenium oder meine verschiedenen ATI-Karten bekommen. Damit würde nämlich auch der X-Server halbwegs erträglich sein auf der Kiste, im Gegensatz zur originalen Trident-Karte. Die hat einfach zu wenig RAM zum arbeiten und ist zu langsam zum Filme gucken. Ich habe auch mit einer Voodoo2-Karte herumprobiert, aber der framebuffer dafür hat nicht so richtig funktioniert. Schade, denn Soundkarte und Netzwerk waren bereits integriert, und der SCSI-Controller war schon recht schnell für damalige Verhältnisse und sogar der IDE-Chip wurde erkannt und unterstützt. Nur war auf dem Board keine Pfostenleiste aufgelötet. Und für alle, die es probieren wollen: Offensichtlich sind die Dinger auch nicht verdrahtet. Selbst wenn man eine auflötet, erkennt der Kernel kein IDE-Gerät…
Hier habe ich ein bisschen gecheatet, ich habe – hoho! – das fertige LFS auf die Powerstack gebügelt. Allerdings habe ich den X-Server mit allen möglichen patches mehrmals neukompiliert, aber ohne ein PPC-BIOS auf einer PPC-Kiste kein X…

Nach oben