<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-2976473844390099876</atom:id><lastBuildDate>Mon, 01 Jun 2026 21:20:38 +0000</lastBuildDate><category>softwareag</category><category>jms</category><category>terracotta</category><category>JCA</category><category>java</category><category>jboss</category><category>security</category><category>terracotta_bigmemory</category><category>universal_messaging</category><category>webMethods</category><category>SSL</category><category>authentication</category><category>demo</category><category>ehcache</category><category>encryption</category><category>hadoop</category><category>mdb</category><category>plugfest</category><category>resource_adapter</category><category>TLSv1.2</category><category>cep</category><category>ciphers</category><category>concurrent</category><category>flume</category><category>garbage_collection</category><category>gc</category><category>google_maps</category><category>hdfs</category><category>heap</category><category>https</category><category>memory</category><category>messaging</category><category>nhps</category><category>nsps</category><category>offheap</category><category>performance</category><category>realtime</category><category>testing_framework</category><category>threads</category><category>vault</category><title>A journey through tech goodness...</title><description>This blog is a sharing platform and sometimes brain dump of my ongoing technical activities, explorations, and discoveries. As a chief solutions architect in softwareAG&#39;s Big Data Streaming Analytics division, I mostly focus on creating simple solutions to complex scalability, analytical and/or real-time data problems. Frequently leveraging in-memory data grids, CEP engines, big data platforms, fast messaging, and of course JAVA and open-source...&#xa;So this is pretty much what you&#39;ll find in here.</description><link>http://fsanglier.blogspot.com/</link><managingEditor>noreply@blogger.com (Fabien Sanglier)</managingEditor><generator>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2976473844390099876.post-1769521147339760345</guid><pubDate>Mon, 13 Apr 2015 19:20:00 +0000</pubDate><atom:updated>2015-04-14T09:41:14.309-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ciphers</category><category domain="http://www.blogger.com/atom/ns#">https</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">nhps</category><category domain="http://www.blogger.com/atom/ns#">nsps</category><category domain="http://www.blogger.com/atom/ns#">security</category><category domain="http://www.blogger.com/atom/ns#">SSL</category><category domain="http://www.blogger.com/atom/ns#">terracotta</category><category domain="http://www.blogger.com/atom/ns#">TLSv1.2</category><category domain="http://www.blogger.com/atom/ns#">universal_messaging</category><title>Java 7 and TLSv1.2 - supported, but not enabled by default</title><description>Lately, I had to investigate how to make a&amp;nbsp;Java&amp;nbsp;7 client connect to a server resource (in my case a JMS broker server) using sockets or http traffic over secure TLS v1.2 protocol (and only TLS v1.2... all other communication protocols should be refused). This would all have been a breeze if my client app was on&amp;nbsp;Java&amp;nbsp;8...but being on&amp;nbsp;Java&amp;nbsp;7, it was a completely different story.&lt;br /&gt;
&lt;br /&gt;
At first, I thought it&#39;d be easy since my JMS broker server (&lt;a href=&quot;http://terracotta.org/products/universal-messaging&quot; target=&quot;_blank&quot;&gt;Terracotta Universal Messaging&lt;/a&gt; in this case) already supports TLS v1.2, lets you enforce it through system property (-DSSLProtocols), and also lets you pick which cipher(s) to use. So I thought all I needed was to set that system property on the server side and disable in the UI (called Enterprise Manager) all ciphers for this communication interface BUT the TLS v1.2 ciphers I wanted to use (the &quot;SHA256&quot; cipher suites in this case -- check full list of available ciphers for TLS v1.2 at&amp;nbsp;&lt;a href=&quot;https://www.openssl.org/docs/apps/ciphers.html#TLS-v1.2-cipher-suites&quot; target=&quot;_blank&quot;&gt;https://www.openssl.org/docs/apps/ciphers.html&lt;/a&gt;)...as shown below in screenshot:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihE-YmZ6dziQJEw45IyWvbd7MzBU4notOBko_FSJNXXmNw9aPu_ylxsu_MUXkeigFiwHWG1CaBCi05d-NV-I-YbSaaxYY380HLwVvHnvzyu6EjUBmPGJWq8x5AdelyOQzmketOezFrL_Q/s1600/Terracotta-UM-ciphers.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihE-YmZ6dziQJEw45IyWvbd7MzBU4notOBko_FSJNXXmNw9aPu_ylxsu_MUXkeigFiwHWG1CaBCi05d-NV-I-YbSaaxYY380HLwVvHnvzyu6EjUBmPGJWq8x5AdelyOQzmketOezFrL_Q/s1600/Terracotta-UM-ciphers.png&quot; height=&quot;112&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
And everything would work fine, right? The client would start the secure handshake with the server, figure out that TLSv1.2 is the only protocol that can be used, and use the right secure protocol version and ciphers as defined by the server.&lt;br /&gt;
&lt;br /&gt;
Well, this theoretical scenario is partially true: Everything is setup properly on the server side, as it rightly says &quot;I only accept TLSv1.2 sessions with the following ciphers&quot;. But unfortunately, the&amp;nbsp;Java&amp;nbsp;7 client does not seem to be able to start a TLSv1.2 secure connection by default (if you&#39;re on&amp;nbsp;Java&amp;nbsp;8, stop reading right now -- unless you&#39;re curious of course -- as it would all work fine out of the box)&lt;br /&gt;
&lt;br /&gt;
And yes, after quick research, Java 7 introduced support for TLS v1.2 (refer to&amp;nbsp;&lt;a href=&quot;http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements-7.html&quot; target=&quot;_blank&quot;&gt;http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements-7.html&lt;/a&gt;) BUT&amp;nbsp;&lt;b&gt;does not enable it by default&lt;/b&gt;. In other words, your client app must explicitly specify &quot;TLS v1.2&quot; at SSLContext creation, or otherwise will just not be able to use it.&lt;br /&gt;
&lt;br /&gt;
This is a pretty important nuance that you can test yourself very easily with the following 2 test cases:&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;&lt;b&gt;1)&amp;nbsp;Output for&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;a href=&quot;https://gist.github.com/lanimall/cb7d84c8d6c6301d4d0c&quot; target=&quot;_blank&quot;&gt;Gist - Java 7 + SSLContext context = SSLContext.getDefault()&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;Supported Protocols: 5
&amp;nbsp;SSLv2Hello
&amp;nbsp;SSLv3
&amp;nbsp;TLSv1
&amp;nbsp;TLSv1.1
&amp;nbsp;TLSv1.2
&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;Enabled Protocols: 1&lt;/span&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;TLSv1&lt;/span&gt;&lt;/b&gt;
Enabled Ciphers: 80
... list of available ciphers omitted here ...
&lt;/pre&gt;&lt;div&gt;&lt;b&gt;2)&amp;nbsp;Output for&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;a href=&quot;https://gist.github.com/lanimall/cb808a11a058f7fb620a&quot; target=&quot;_blank&quot;&gt;Gist - Java 7 + SSLContext context = SSLContext.getInstance(&quot;TLSv1.2&quot;)&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;Supported Protocols: 5
&amp;nbsp;SSLv2Hello
&amp;nbsp;SSLv3
&amp;nbsp;TLSv1
&amp;nbsp;TLSv1.1
&amp;nbsp;TLSv1.2
&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;Enabled Protocols: 3&lt;/span&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;TLSv1&lt;/span&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;TLSv1.1&lt;/span&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp;TLSv1.2&lt;/span&gt;&lt;/b&gt;
Enabled Ciphers: 80
... list of available ciphers omitted here ...
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;So this is great! All you and I need is to update the client app&#39;s code to specify TLSv1.2 at SSL Context creation!&amp;nbsp;&lt;/div&gt;&lt;div&gt;But wait...what if I&#39;m using a client library to perform all that low level SSLContext connection etc...in that case, it&#39;s going to be tricky to update the code, unless specifying the SSL protocol versions and ciphers are exposed to client app in some way (eg. system properties).&lt;/div&gt;&lt;div&gt;If you reach this situation, &lt;b&gt;here are 3 solutions&lt;/b&gt; I found (well, I found 1 and 3...solution 2 is credited to a smarter developer :) )&lt;/div&gt;&lt;div&gt;1) &lt;b&gt;If all you want is to create a HTTPS connection&lt;/b&gt; (over TLSv1.2) from your client app to the server, you&#39;re in luck: all you need is add the following &lt;b&gt;2 system properties&lt;/b&gt; to your client app and the SSL context will be created properly as specified:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;https.protocols&lt;/b&gt; ==&amp;gt; -Dhttps.protocols=TLSv1.2 (comma-separated list of you want to use several protocols)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;https.cipherSuites&lt;/b&gt; ==&amp;gt; -Dhttps.cipherSuites=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (comma-separated list of you want to use several ciphers)&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;2) &lt;b&gt;If you want to use the secure socket protocol&lt;/b&gt; (as opposed to HTTPs traffic), the above properties won&#39;t work unfortunately...but you could create a &quot;TLSv1.2&quot; SSLContext at application startup and use the &quot;SSLContext.setDefault(ctx)&quot; call to register that new context as the default one.&lt;br /&gt;
&lt;br /&gt;
3) &lt;b&gt;Upgrade your client to JAVA 8, which enables TLSv1.2 protocol by default&amp;nbsp;&lt;/b&gt;(at this time, JAVA 8 should be already used anyway, or on most project roadmaps hopefully)&lt;br /&gt;
&lt;br /&gt;
That&#39;s it! Another fun investigative work day at the office!&lt;/div&gt;&lt;/div&gt;</description><link>http://fsanglier.blogspot.com/2015/04/java-7-and-tlsv12-supported-but-not-enabled.html</link><author>noreply@blogger.com (Fabien Sanglier)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihE-YmZ6dziQJEw45IyWvbd7MzBU4notOBko_FSJNXXmNw9aPu_ylxsu_MUXkeigFiwHWG1CaBCi05d-NV-I-YbSaaxYY380HLwVvHnvzyu6EjUBmPGJWq8x5AdelyOQzmketOezFrL_Q/s72-c/Terracotta-UM-ciphers.png" height="72" width="72"/><thr:total>18</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2976473844390099876.post-5601840806207011623</guid><pubDate>Tue, 07 Apr 2015 16:10:00 +0000</pubDate><atom:updated>2015-04-07T12:43:02.804-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ehcache</category><category domain="http://www.blogger.com/atom/ns#">garbage_collection</category><category domain="http://www.blogger.com/atom/ns#">gc</category><category domain="http://www.blogger.com/atom/ns#">heap</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">memory</category><category domain="http://www.blogger.com/atom/ns#">offheap</category><category domain="http://www.blogger.com/atom/ns#">performance</category><category domain="http://www.blogger.com/atom/ns#">terracotta</category><title>What&#39;s this Offheap thing anyway?</title><description>As you may have noticed already, there&#39;s a lot of open-source activity around Ehcache and Terracotta in the past couple of week:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;u&gt;&lt;b&gt;Ehcache 3 Milestone 1&lt;/b&gt;&lt;/u&gt; is out, and includes&lt;b&gt;&amp;nbsp;offheap storage&lt;/b&gt;. Check it out at &lt;a href=&quot;http://ehcache.github.io/&quot;&gt;http://ehcache.github.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;u&gt;Terracotta 4.3&lt;/u&gt; with offheap storage&lt;/b&gt; is also available as an open-source offering. Check it out at &lt;a href=&quot;http://blog.terracotta.org/2015/04/02/terracotta-bolsters-in-memory-open-source-offerings/&quot;&gt;http://blog.terracotta.org/2015/04/02/terracotta-bolsters-in-memory-open-source-offerings/&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
So that&#39;s all great and there&#39;s a lot to talk about on both these announcements...&lt;br /&gt;
&lt;br /&gt;
But it turns out that one of the first question I got while sharing the news to wider non-tech circles was: &lt;br /&gt;
&quot;&lt;b&gt;What&#39;s this offheap thing anyway? What&#39;s so special about it, and why should I care.&lt;/b&gt;&quot; &lt;br /&gt;
&lt;br /&gt;
Really fair questions indeed!&lt;br /&gt;
&lt;br /&gt;
So as I wrote my reply and tried hard not to dive in &quot;geeky&quot; land while doing so (please refer to&amp;nbsp;&lt;a href=&quot;https://github.com/Terracotta-OSS/offheap-store&quot;&gt;https://github.com/Terracotta-OSS/offheap-store&lt;/a&gt;&amp;nbsp;for these technical aspects such as detailed explanations and implementation code), I figured it could be useful to others as well...&lt;br /&gt;
So hopefully the following explanation will make sense to a wider non-developper audience (and developers out there too of course!).&lt;br /&gt;
&lt;br /&gt;
So here it is...starting from, well, the start:&lt;br /&gt;
&lt;br /&gt;
Traditionally in Java programming land, the memory space accessible to Java programs (called &quot;heap&quot;) is totally managed by the Java Virtual Machine (JVM)...making it much easier for developers to NOT have to think about memory allocations and clean ups (like we used to with programming languages such as C, C++ etc…). And really, &quot;not having to think about memory complexities&quot; is a big part of JAVA’s success over the years.&lt;br /&gt;
&lt;br /&gt;
But the memory management that JAVA performs under-the-hood (refer to as Garbage Collection, or GC) is something that potentially becomes costly performance-wise (lower throughput, higher latencies) especially as the used &quot;heap&quot; space grows (for example, heap space would grow if you started to cache lots of&amp;nbsp;objects in memory)&lt;br /&gt;
&lt;br /&gt;
So to reconcile these 2 contradictory concepts of:&lt;br /&gt;
&lt;br /&gt;
(A) Being able to cache a lot more data (10s of GB or TBs possibly) within your Java application, and&lt;br /&gt;
(B) Not incurring a big cost on application performance due to underlying Java memory management operations,&lt;br /&gt;
&lt;br /&gt;
--&amp;gt; Enter Offheap Memory.&lt;br /&gt;
&lt;br /&gt;
Offheap Memory, as the name implies, is a memory space that is &quot;outside the Java heap&quot; (and hence outside the traditional Java memory management responsibilities), but yet still accessible within the Java process through the &lt;a href=&quot;http://docs.oracle.com/javase/7/docs/api/java/nio/package-summary.html&quot; target=&quot;_blank&quot;&gt;java.nio&lt;/a&gt; API.&lt;br /&gt;
&lt;br /&gt;
So when a product or framework refers to &quot;Offheap&quot; as a general concept, really it means that this product/framework can &lt;b&gt;natively&lt;/b&gt; access the machine’s RAM memory &lt;b&gt;directly from the JAVA process&lt;/b&gt; (as opposed to doing it the &quot;traditional&quot; way of accessing the machine’s RAM memory through JAVA’s managed memory heap space). In other words, it’s like poking a hole through JAVA’s walls to access the RAM directly.&lt;br /&gt;
&lt;br /&gt;
To the question of why should you care:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;With offheap, your &lt;b&gt;Java program can put as much data as it needs in-memory&lt;/b&gt;, and access it all within process (there’s no memory limitation aside from the amount of RAM the machine has to offer), even TBs of data (check out this &lt;a href=&quot;https://www.blogger.com/&quot;&gt;&lt;span id=&quot;goog_2025746583&quot;&gt;&lt;/span&gt;Intel white paper&lt;/a&gt;[PDF]&amp;nbsp;showing offheap usage and benchmarks with a single 6TB Intel server)&lt;/li&gt;
&lt;li&gt;Your Java program will demonstrate &lt;b&gt;very predictable latencies&lt;/b&gt;&amp;nbsp;even if you&#39;re storing large amounts of data in-memory (even at the TB scale)...&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;This is because&amp;nbsp;offheap memory space is not managed by Java in the first place, and as such, storing data in that Offheap space will simply not add any extra JAVA&amp;nbsp;memory management overhead to the picture.&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
So overall, it’s really the best of both worlds: storing lots of data in memory but not incurring performance unpredictability in the process.&lt;br /&gt;
&lt;br /&gt;
The next question you might have is: if it is such a great concept, why doesn’t everybody do it in their own Java programs?&lt;br /&gt;
&lt;br /&gt;
And the simple answer is that it’s not a straightforward thing to do because you have to create yourself all that low-level memory management when you use the offheap.&lt;br /&gt;
&lt;br /&gt;
And that’s really the &quot;secret&quot; sauce&amp;nbsp;of libraries implementing offheap usage...such as Ehcache/Terracotta libraries (not so secret anymore for ehcache/terracotta since it&#39;s officially open-sourced now - refer to&amp;nbsp;&lt;a href=&quot;https://github.com/Terracotta-OSS/offheap-store&quot; target=&quot;_blank&quot;&gt;offheap-store&lt;/a&gt;&amp;nbsp;on github): all these low-level memory mechanisms are done for you and are especially hidden from you so you don’t have to care about them as a Java developer. All you have to know is that you can cache as much as you want/need on a single machine (GBs, TBs even) and that it will not slow down your app unpredictably while doing so (as it would if you were putting all that stuff in the traditional JAVA heap.)&lt;br /&gt;
&lt;br /&gt;
To explore further, find Ehcache Offheap store implementation at&amp;nbsp;&lt;a href=&quot;https://github.com/Terracotta-OSS/offheap-store&quot;&gt;https://github.com/Terracotta-OSS/offheap-store&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Please leave comments if you have any questions, or better yet, post your question on the &lt;a href=&quot;https://groups.google.com/forum/#!categories/ehcache-users/ehcache-core&quot; target=&quot;_blank&quot;&gt;Ehcache-users&lt;/a&gt; google group!</description><link>http://fsanglier.blogspot.com/2015/04/whats-this-offheap-thing-anyway.html</link><author>noreply@blogger.com (Fabien Sanglier)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2976473844390099876.post-2750376528190247302</guid><pubDate>Fri, 05 Dec 2014 20:44:00 +0000</pubDate><atom:updated>2014-12-05T16:35:38.177-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">authentication</category><category domain="http://www.blogger.com/atom/ns#">encryption</category><category domain="http://www.blogger.com/atom/ns#">jboss</category><category domain="http://www.blogger.com/atom/ns#">JCA</category><category domain="http://www.blogger.com/atom/ns#">jms</category><category domain="http://www.blogger.com/atom/ns#">security</category><category domain="http://www.blogger.com/atom/ns#">softwareag</category><category domain="http://www.blogger.com/atom/ns#">vault</category><category domain="http://www.blogger.com/atom/ns#">webMethods</category><title>JBOSS Vault to encrypt JMS password for secure JCA configuration</title><description>&lt;div&gt;In the previous post (&lt;a href=&quot;http://fsanglier.blogspot.com/2014/12/ssl-auth-jboss-jca-wM-broker.html&quot;&gt;SSL Encryption / Authentication between JBOSS JCA + webMethods Broker&lt;/a&gt;) I explained how you can setup a MDB (hosted on JBOSS) to securely connect and consume JMS messages from SoftwareAG webMethods Broker using JCA, SSL encryption and authentication...&lt;br /&gt;
&lt;br /&gt;
That was a very easy setup since all we had to do is add a couple of system properties in the JBOSS admin console to make this work fine.&lt;br /&gt;
But as you may have noticed, we specified the keystore password in clear text (for simplicity sake...and also because I knew I&#39;d be writing this post soon after of course!!) as part of those system properties...and that should raise a couple of alarms for most IT professional...&lt;br /&gt;
&lt;br /&gt;
So this post is to explain how we can remediate this situation using JBOSS built-in Vault feature.&lt;br /&gt;
&lt;br /&gt;
Please note this post is the 3rd out of the following 3 related posts:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://fsanglier.blogspot.com/2014/07/jboss-to-softwareag-webmethods-jms-jca.html&quot;&gt;Integrating SoftwareAG webMethods messaging Broker with JBOSS AS 7 through standard JCA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://fsanglier.blogspot.com/2014/12/ssl-auth-jboss-jca-wM-broker.html&quot;&gt;SSL Encryption / Authentication between JBOSS JCA + WebMethods Broker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JBOSS Vault to encrypt JMS password for secure JCA configuration&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;h3&gt;JBOSS Vault&lt;/h3&gt;&lt;div&gt;In short, this component offers a very nice way to obfuscate/encrypt sensitive text information within JBOSS configuration files. Using this concept, I&#39;m going to show how to encrypt the SoftwareAG webMethods Broker password and how to use it through the Resource Adapter configuration...&lt;br /&gt;
&lt;br /&gt;
First, Since I&#39;m not a big fan of recreating documentation when the original product one is pretty good already, please refer to the well-written &lt;a target=&quot;_blank&quot; href=&quot;https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6.1/html/Security_Guide/sect-Password_Vaults_for_Sensitive_Strings.html&quot;&gt;JBOSS EAP 6.1 doc&lt;/a&gt; to setup the JBOSS Vault for your environment.&lt;br /&gt;
&lt;br /&gt;
If you follow it pretty closely, you should have:&lt;br /&gt;
- a keystore file saved somewhere on your file system, &lt;br /&gt;
- added in that keystore the various sensitive passwords you want to securely use in the JBOSS configuration, by using the provided JBOSS vault.sh script&lt;br /&gt;
- A &quot;VAULT&quot; block in your JBOSS configuration file, similar to the following:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: xml;gutter: true;&quot;&gt;&lt;vault&gt;
    &lt;vault-option name=&quot;KEYSTORE_URL&quot; value=&quot;/your/filesystem/secure/jbossvault.keystore&quot;&gt;&lt;/vault-option&gt;
    &lt;vault-option name=&quot;KEYSTORE_PASSWORD&quot; value=&quot;MASK-2G9sZErsaOtxhOqBS98FcBK&quot;&gt;&lt;/vault-option&gt;
    &lt;vault-option name=&quot;KEYSTORE_ALIAS&quot; value=&quot;jbossvault&quot;&gt;&lt;/vault-option&gt;
    &lt;vault-option name=&quot;SALT&quot; value=&quot;12345678&quot;&gt;&lt;/vault-option&gt;
    &lt;vault-option name=&quot;ITERATION_COUNT&quot; value=&quot;50&quot;&gt;&lt;/vault-option&gt;
    &lt;vault-option name=&quot;ENC_FILE_DIR&quot; value=&quot;/your/filesystem/secure/&quot;&gt;&lt;/vault-option&gt;
&lt;/vault&gt;
&lt;/pre&gt;&lt;br /&gt;
From there, you should be able to add the encrypted strings in most JBOSS configurations without too much problem...using the pattern that should have been given to you during the encrypting process...&lt;br /&gt;
&lt;br /&gt;
For example, here is my sample &quot;encrypted&quot; string for the test password I used with my test instance of webMethods Broker:&lt;br /&gt;
${VAULT::broker-ssl::password::OWQyMjZmNjktMTEA5Zi00YzRc0LWFhYWQtZTTU2MzUwMmY1NDNlTElOaRRV9CUkVBS2pib3NzdmF1bHQ=}&lt;br /&gt;
&lt;/div&gt;&lt;h3&gt;Wrong instinct!&lt;/h3&gt;&lt;div&gt;Ok now if you&#39;re like me, your first reflex is going to be to use this encrypted string in the password system property we added in the previous post...&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: xml;gutter: true;&quot;&gt;&lt;system-properties&gt;
    ...
    &lt;property name=&quot;com.webmethods.jms.password&quot; value=&quot;${VAULT::broker-ssl::password::OWQyMjZmNjktMTEA5Zi00YzRc0LWFhYWQtZTTU2MzUwMmY1NDNlTElOaRRV9CUkVBS2pib3NzdmF1bHQ=}&quot;&gt;&lt;/property&gt;
    ...
&lt;/system-properties&gt;
&lt;/pre&gt;&lt;br /&gt;
But unfortunately, &lt;b&gt;that does not work&lt;/b&gt;...at least not with EAP 6 standalone...Seems like it&#39;s due to a race condition where the JBOSS Vault is not yet initialized when the system properties are added...hence the system property &quot;com.webmethods.jms.password&quot; ends up still having the encrypted string in its value...as opposed to the decrypted value...&lt;br /&gt;
&lt;br /&gt;
And of course, this is not quite what we need...as the resource adapter is not going to be able to do anything with that encrypted password...&lt;br /&gt;
&lt;/div&gt;&lt;h3&gt;Keep pushing, there&#39;s light at the end of the tunnel!&lt;/h3&gt;&lt;div&gt;But fear not! There&#39;s another simple way to make use of that encrypted password (and I think ultimately a better way...which does not save the clear password in a system property that is readable by anybody...).&lt;br /&gt;
&lt;br /&gt;
The generic jms resource adapter provides 2 properties for username and password (refer to &lt;a target=&quot;_blank&quot; href=&quot;https://genericjmsra.java.net/docs/userguide/userguide.html#mozTocId883660&quot;&gt;genericjmsra.java.net: user guide&lt;/a&gt;), and fortunately for us, we can use the {VAULT} encrypted string for those since the resource-adapters subsystem is initialized after the VAULT subsystem!&lt;br /&gt;
&lt;br /&gt;
So the solution is to remove from the global system properties block those 2 system properties for username and password (com.webmethods.jms.username, com.webmethods.jms.password), and instead add them in the wm Broker Resource Adapter configuration block a follow (using the VAULT encrypted password instead of the clear text one!):&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: xml;gutter: true;&quot;&gt;&lt;subsystem xmlns=&quot;urn:jboss:domain:resource-adapters:1.1&quot;&gt;
    &lt;resource-adapters&gt;
        &lt;!-- This is the resource adapter for SoftwareAG webMethods Broker --&gt;
        &lt;resource-adapter id=&quot;webm-jmsra.rar&quot;&gt;
            &lt;archive&gt;
                webm-jmsra.rar
            &lt;/archive&gt;
            ...
            &lt;config-property name=&quot;UserName&quot;&gt;
                [some jms username]
            &lt;/config-property&gt;
            &lt;config-property name=&quot;Password&quot;&gt;
                ${VAULT::broker-ssl::password::OWQyRRMjZm9NjktMTA5Zi00Yzc0L7WFhYWQ4tZTU2eeSMsszUwMmwytY1NDNlTElORV9CUkVBS2pib3NzdmF1bHQ=}
            &lt;/config-property&gt;
            &lt;connection-definitions&gt;
            ...
            &lt;/connection-definitions&gt;
        &lt;/resource-adapter&gt;
        ...
    &lt;/resource-adapters&gt;
&lt;/subsystem&gt;
&lt;/pre&gt;Now, the Resource Adapter component will &quot;magically&quot; get access to the right decrypted password (because the VAULT will have decrypted it first) and provide it (alongside the username) to the JMS new connection method!&lt;br /&gt;
&lt;/div&gt;&lt;h3&gt;Done and happy...onto next challenge!&lt;/h3&gt;&lt;div&gt;So with all this in place, you get a secured JBOSS / Resource Adapter configuration file free of any clear text password...and all the while can take advantage of JBOSS Vault auto-decryption to have your application components (and/or resource adapter in this case) use that precious password in the very same way as before...all this without having to add/write one extra line of code!! Sweet!&lt;br /&gt;
&lt;/div&gt;</description><link>http://fsanglier.blogspot.com/2014/12/jboss-vault-to-encrypt-jca-jms-password.html</link><author>noreply@blogger.com (Fabien Sanglier)</author><thr:total>6</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2976473844390099876.post-5440769828409147938</guid><pubDate>Fri, 05 Dec 2014 19:13:00 +0000</pubDate><atom:updated>2014-12-05T17:21:51.202-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">authentication</category><category domain="http://www.blogger.com/atom/ns#">encryption</category><category domain="http://www.blogger.com/atom/ns#">jboss</category><category domain="http://www.blogger.com/atom/ns#">JCA</category><category domain="http://www.blogger.com/atom/ns#">jms</category><category domain="http://www.blogger.com/atom/ns#">mdb</category><category domain="http://www.blogger.com/atom/ns#">resource_adapter</category><category domain="http://www.blogger.com/atom/ns#">security</category><category domain="http://www.blogger.com/atom/ns#">softwareag</category><category domain="http://www.blogger.com/atom/ns#">SSL</category><category domain="http://www.blogger.com/atom/ns#">webMethods</category><title>SSL Encryption / Authentication between JBOSS JCA + SoftwareAG webMethods Broker</title><description>&lt;div&gt;In our previous post (&lt;a href=&quot;http://fsanglier.blogspot.com/2014/07/jboss-to-softwareag-webmethods-jms-jca.html&quot;&gt;Integrating SoftwareAG webMethods messaging Broker with JBOSS AS 7 through standard JCA&lt;/a&gt;) we created a simple setup to publish and consume JMS messages using JCA Resource Adapter construct on JBOSS AS 7. &lt;br /&gt;
&lt;br /&gt;
This post will extend this simple setup by explaining how to use secure communications (SSL encryption + SSL Authentication) between JBOSS and webMethods Broker.&lt;br /&gt;
&lt;br /&gt;
Please note this post is the 2nd out of the following 3 related posts:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://fsanglier.blogspot.com/2014/07/jboss-to-softwareag-webmethods-jms-jca.html&quot;&gt;Integrating SoftwareAG webMethods messaging Broker with JBOSS AS 7 through standard JCA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SSL Encryption / Authentication between JBOSS JCA + SoftwareAG webMethods Broker&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://fsanglier.blogspot.com/2014/12/jboss-vault-to-encrypt-jca-jms-password.html&quot;&gt;JBOSS Vault to encrypt JMS password for secure JCA configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
First, let&#39;s assume that you&#39;re already a webMethods Broker expert and have already setup your Broker server with the right SSL certificates (and if not, please refer to that &quot;pretty&quot;-screenshots &lt;a href=&quot;http://techcommunity.softwareag.com/download/developer-communities/webmethods/JBoss-Broker-ResourceAdapter.pdf&quot;&gt;SoftwareAG &quot;techcommunity&quot; document (PDF - 4MB)&lt;/a&gt; I was referring to in the previous post -- go to &quot;Configuring SSL Communication / Authentication&quot; on page 13).&lt;br /&gt;
&lt;br /&gt;
And all we need to do now is to have our JBOSS client encrypt all communications and authenticate to Wm Broker over SSL...&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;u&gt;It&#39;s actually &lt;b&gt;very&lt;/b&gt; easy:&lt;/u&gt;&lt;br /&gt;
All you need to do is add the right system properties for it (jboss admin console at “profile &amp;gt; General Configuration &amp;gt; System Properties”)...and the wM Broker client library will take care of the rest without changing anything in the code or configuration!&lt;br /&gt;
&lt;br /&gt;
Here are the needed properties:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;com.webmethods.jms.username&lt;/li&gt;
&lt;li&gt;com.webmethods.jms.password&lt;/li&gt;
&lt;li&gt;com.webmethods.jms.ssl.keystore&lt;/li&gt;
&lt;li&gt;com.webmethods.jms.ssl.keystoretype&lt;/li&gt;
&lt;li&gt;com.webmethods.jms.ssl.truststore&lt;/li&gt;
&lt;li&gt;com.webmethods.jms.ssl.truststoretype&lt;/li&gt;
&lt;/ul&gt;All these values must match the keystore and trustore you used on the wM Broker server side...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Important notes&lt;/b&gt;:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;keystore should be of type &quot;PKCS12&quot; (keystoretype=PKCS12)&lt;/li&gt;
&lt;li&gt;trustore of type &quot;JKS&quot; (truststoretype=JKS)&lt;/li&gt;
&lt;li&gt;username / password must match (of course) the ones used by your keystore...&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;That&#39;s it: once those properties are set, you should be able to verify in the wM Broker client sessions are indeed using SSL encryption + SSL authentication...&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0qWPCrI2BQMo1mP0_rYcaM95LWrGz8Gz4sUQxOKzd3IUkPHyR0FCnom31TlUAXJ2S19Iw9_1F3ZeyEMp93UtA_6CBwiSznGjFvlVsZ6lmgRC9zKKlPeN04-8gttTSWADYd-LbomSESGs/s1600/jms-ssl-auth-session-detail.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0qWPCrI2BQMo1mP0_rYcaM95LWrGz8Gz4sUQxOKzd3IUkPHyR0FCnom31TlUAXJ2S19Iw9_1F3ZeyEMp93UtA_6CBwiSznGjFvlVsZ6lmgRC9zKKlPeN04-8gttTSWADYd-LbomSESGs/s400/jms-ssl-auth-session-detail.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</description><link>http://fsanglier.blogspot.com/2014/12/ssl-auth-jboss-jca-wM-broker.html</link><author>noreply@blogger.com (Fabien Sanglier)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0qWPCrI2BQMo1mP0_rYcaM95LWrGz8Gz4sUQxOKzd3IUkPHyR0FCnom31TlUAXJ2S19Iw9_1F3ZeyEMp93UtA_6CBwiSznGjFvlVsZ6lmgRC9zKKlPeN04-8gttTSWADYd-LbomSESGs/s72-c/jms-ssl-auth-session-detail.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2976473844390099876.post-4487993121248425719</guid><pubDate>Wed, 23 Jul 2014 21:19:00 +0000</pubDate><atom:updated>2017-03-02T10:18:47.107-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">jboss</category><category domain="http://www.blogger.com/atom/ns#">JCA</category><category domain="http://www.blogger.com/atom/ns#">jms</category><category domain="http://www.blogger.com/atom/ns#">mdb</category><category domain="http://www.blogger.com/atom/ns#">resource_adapter</category><category domain="http://www.blogger.com/atom/ns#">softwareag</category><category domain="http://www.blogger.com/atom/ns#">webMethods</category><title>Integrating SoftwareAG webMethods messaging Broker with JBOSS AS 7 through standard JCA</title><description>Lately I had to work a bit on integrating some of SoftwareAG&#39;s messaging brokers (&lt;a href=&quot;http://www.softwareag.com/corporate/products/wm/integration/products/ai/overview/default.asp&quot;&gt;SoftwareAG webMethods Broker&lt;/a&gt; and &lt;a href=&quot;http://www.softwareag.com/corporate/products/bigdata/in-memory_data_mgmt/universal_messaging/overview/default.asp&quot;&gt;Universal Messaging&lt;/a&gt;) with common application servers (JBOSS AS 7, WebSphere 8) through standard&amp;nbsp;&lt;a href=&quot;http://docs.oracle.com/javaee/5/tutorial/doc/bncjx.html&quot; target=&quot;_blank&quot;&gt;JCA resource adaptor&lt;/a&gt; construct.&lt;br /&gt;
&lt;br /&gt;
So this post, the first of 3, is to summarize (before I forget myself :) ) some of the steps involved with that setup using SoftwareAG webMethods JMS Broker + JBOSS combination...Hoping that it might be useful to somebody in the meantime.&lt;br /&gt;
&lt;br /&gt;
Please note this post is the 1st out of the following 3 related posts:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;b&gt;Integrating SoftwareAG webMethods messaging Broker with JBOSS AS 7 through standard JCA&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://fsanglier.blogspot.com/2014/12/ssl-auth-jboss-jca-wM-broker.html&quot;&gt;SSL Encryption / Authentication between JBOSS JCA + SoftwareAG webMethods Broker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://fsanglier.blogspot.com/2014/12/jboss-vault-to-encrypt-jca-jms-password.html&quot;&gt;JBOSS Vault to encrypt JMS password for secure JCA configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;b&gt;Note 1*&lt;/b&gt;: all the resources/code I mention in this post are accessible on github at&amp;nbsp;&lt;a href=&quot;https://github.com/lanimall/messaging-samples/tree/master/jbossjca-sample-mdbs&quot; target=&quot;_blank&quot;&gt;jbossjca-sample-mdbs&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note 2**&lt;/b&gt;: If you like a more formal documentation with &quot;pretty&quot; screenshots, I posted such doc (PDF) on the SoftwareAG &quot;techcommunity&quot; resource wiki, accessible publicly at &lt;a href=&quot;http://techcommunity.softwareag.com/pwiki/-/wiki/Main/Integration+and+Configuration+of+SoftwareAG’s+webMethods+Broker+with+JBOSS+EAP+6.1&quot; target=&quot;_blank&quot;&gt;techcommunity.softwareag.com&lt;/a&gt;. Please check it out as well...&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;First words&lt;/h3&gt;First, many posts out there talk about the JCA Resource Adapter construct and why it is useful...(eg. &lt;a href=&quot;http://planet.jboss.org/post/jboss_as7_and_jca&quot; target=&quot;_blank&quot;&gt;http://planet.jboss.org/post/jboss_as7_and_jca&lt;/a&gt;). Yes it is useful as it decouples your code from the JMS low level implementation, and make directly available to you all the enterprise production-ready features that you really don’t want to re-develop yourself (unless you have a lot of extra time on your hand and don’t know what to do with it) such as connection pooling, transactional support,&amp;nbsp;connection validation, connection failure strategies, reconnection strategies, etc…&lt;br /&gt;
&lt;br /&gt;
Secondly, if you’re reading this, you’re likely a knowledgeable webMethods users already, and as such, I won’t go into the details of setting up the SoftwareAG webMethods JMS Broker etc... But for you to reproduce quickly some of the steps identified by this post, I’ve added the admin script&amp;nbsp;that allows you to create all the webMethods Broker objects in 1 liner executable command (using the jmsadmin tool), as follow:&lt;br /&gt;
&lt;br /&gt;
$WM_BROKER_HOME/bin/jmsadmin -properties &lt;a href=&quot;https://github.com/lanimall/messaging-samples/blob/master/jca-jms-samples/configs-resources/wM-Broker/jndi.properties&quot; target=&quot;_blank&quot;&gt;jndi.properties&lt;/a&gt; -f &lt;a href=&quot;https://github.com/lanimall/messaging-samples/blob/master/jca-jms-samples/configs-resources/wM-Broker/jmsadmin.script&quot; target=&quot;_blank&quot;&gt;jmsadmin.script&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
At this point, you should have a SoftwareAG webMethods Broker working and accessible with the following objects:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;InboundQueueConnectionFactory&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;This is the factory we’ll use to consume messages from our MDBs&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;OutboundQueueConnectionFactory&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;This is the factory we’ll use to send messages from our sample servlet&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;simplequeue&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;This is the queue we’ll use&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;Let’s now get started on the JBOSS side.&lt;/div&gt;&lt;h3&gt;1 - Deploy the SoftwareAG webMethods Broker RAR&lt;/h3&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;The RAR package is at $WM_BROKER_HOME/lib/webm-jmsra.rar&lt;/li&gt;
&lt;li&gt;Deploy RAR package onto JBOSS using either way:&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;Copy to the JBOSS deployment folder (&amp;amp;lt;JBOSS-EAP-HOME&amp;gt;/standalone/deployments) and the RAR should be deployed automatically&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;A file “webm-jmsra.rar.deployed” should be created.&lt;/li&gt;
&lt;li&gt;If nothing is created, or a file “webm-jmsra.rar.failed” is created, an error occurred during deployment.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Use the JBOSS admin console to deploy the package just like you would do it for any other deployable resource (EAR, WAR, etc…)&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;Success or failure should be displayed in the console&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;h3&gt;2 - Configure the Resource Adapter&lt;/h3&gt;Then, we just need to configure the resource adapter for both inbound (used by message consumers) and outbound (used by message producers). This can all be done thorough the JBOSS admin console at “profile &amp;gt; subsystems &amp;gt; Connector &amp;gt; Resource Adapters”.&lt;br /&gt;
For brevity, I’ll pass on the multi-screen setup (it&#39;s really well explained on the red-hat website at &lt;a href=&quot;https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6/html/Administration_and_Configuration_Guide/Configure_a_Deployed_Resource_Adapter1.html&quot; target=&quot;_blank&quot;&gt;Red-Hat Doc: Configure_a_Deployed_Resource_Adapter&lt;/a&gt;), and show here the end result that will be written in jboss configuration (standalone.xml or domain.xml) within the subsystem resource-adapters:&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush: xml;gutter: true;&quot;&gt;&lt;subsystem xmlns=&quot;urn:jboss:domain:resource-adapters:1.1&quot;&gt;
            &lt;resource-adapters&gt;
                &lt;resource-adapter id=&quot;webm-jmsra.rar&quot;&gt;
                    &lt;archive&gt;
                        webm-jmsra.rar
                    &lt;/archive&gt;
                    &lt;transaction-support&gt;NoTransaction&lt;/transaction-support&gt;
                    &lt;config-property name=&quot;JndiProperties&quot;&gt;
                        java.naming.factory.initial=com.webmethods.jms.naming.WmJmsNamingCtxFactory,java.naming.provider.url=wmjmsnaming://mybroker@wmvm:6849
                    &lt;/config-property&gt;
                    &lt;config-property name=&quot;SupportsXA&quot;&gt;
                        false
                    &lt;/config-property&gt;
                    &lt;connection-definitions&gt;
                        &lt;connection-definition class-name=&quot;com.sun.genericra.outbound.ManagedJMSConnectionFactory&quot; enabled=&quot;true&quot; jndi-name=&quot;java:/jms/broker&quot; pool-name=&quot;java:/jms/broker&quot;&gt;
                            &lt;config-property name=&quot;JndiProperties&quot;&gt;
                                java.naming.factory.initial=com.webmethods.jms.naming.WmJmsNamingCtxFactory,java.naming.provider.url=wmjmsnaming://mybroker@wmvm:6849
                            &lt;/config-property&gt;
                            &lt;config-property name=&quot;ConnectionValidationEnabled&quot;&gt;
                                true
                            &lt;/config-property&gt;
                            &lt;config-property name=&quot;ConnectionFactoryJndiName&quot;&gt;
                                OutboundQueueConnectionFactory
                            &lt;/config-property&gt;
                            &lt;pool&gt;
                                &lt;min-pool-size&gt;10&lt;/min-pool-size&gt;
                                &lt;max-pool-size&gt;50&lt;/max-pool-size&gt;
                                &lt;prefill&gt;true&lt;/prefill&gt;
                                &lt;use-strict-min&gt;true&lt;/use-strict-min&gt;
                                &lt;flush-strategy&gt;IdleConnections&lt;/flush-strategy&gt;
                            &lt;/pool&gt;
                            &lt;security&gt;
                                &lt;application&gt;
                            &lt;/application&gt;&lt;/security&gt;
                            &lt;validation&gt;
                                &lt;background-validation&gt;true&lt;/background-validation&gt;
                            &lt;/validation&gt;
                        &lt;/connection-definition&gt;
                    &lt;/connection-definitions&gt;
                &lt;/resource-adapter&gt;
            &lt;/resource-adapters&gt;
        &lt;/subsystem&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Couple of quick notes on this:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;The resource adapter id / name should be same as the RAR you just uploaded&lt;/li&gt;
&lt;li&gt;&quot;JndiProperties&quot; setting is self-explanatory: it&#39;s the usual connection settings to the JMS broker JNDI. For SoftwareAG webMethods broker, the factory class is &quot;com.webmethods.jms.naming.WmJmsNamingCtxFactory&quot;...make sure to use that. And then, customize the url based on your setup.&lt;/li&gt;
&lt;li&gt;The connection-definition section is for outbound pooled connections (sending messages), hence that&#39;s why we used the &quot;OutboundQueueConnectionFactory&quot; broker object for the &quot;ConnectionFactoryJndiName&quot; setting&lt;/li&gt;
&lt;li&gt;In the connection-definition section, you notice also that it&#39;s registered in JBOSS JNDI with the name specified in jndi-name=&quot;java:/jms/broker&quot;. This is important as we&#39;ll need to refer to that in our code to send messages to the queue (see further down)&lt;/li&gt;
&lt;li&gt;In that same connection-definition section, you can also see that the &quot;class-name&quot; attribute is &quot;com.sun.genericra.outbound.ManagedJMSConnectionFactory&quot;...do not change that, as it&#39;s the resource adapter connection factory that will take advantage of application server connection pooling amongst others&lt;/li&gt;
&lt;li&gt;&quot;pool&quot; section: customize it to meet you needs&lt;/li&gt;
&lt;/ul&gt;For a complete reference of all the properties available in the resource adapter, please check out the RA implementation page at &lt;a href=&quot;https://genericjmsra.java.net/docs/userguide/userguide.html#mozTocId883660&quot; target=&quot;_blank&quot;&gt;genericjmsra.java.net: user guide&lt;/a&gt; (this is the core RA implementation used in the SoftwareAG webMethods Broker RAR package)&lt;br /&gt;
&lt;br /&gt;
When you restart JBOSS, you now should see some JCA activity in the console output. If something is not quite right, and you&#39;d like to see more of what&#39;s going on under the hood, an easy way I found was to enable deeper logging within JBOSS for the resource-adapter components:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: xml;gutter: true;&quot;&gt;&lt;subsystem xmlns=&quot;urn:jboss:domain:logging:1.2&quot;&gt;

            &lt;!-- ... --&gt;

            &lt;logger category=&quot;org.jboss.resource.adapter&quot;&gt;
                &lt;level name=&quot;TRACE&quot;&gt;
            &lt;/level&gt;&lt;/logger&gt;
            &lt;logger category=&quot;com.sun.genericjmsra&quot;&gt;
                &lt;level name=&quot;TRACE&quot;&gt;
            &lt;/level&gt;&lt;/logger&gt;

            &lt;!-- ... --&gt;

        &lt;/subsystem&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;3 - Tune SoftwareAG webMethods Broker behavior by setting the right system.properties&lt;/h3&gt;To tweak the webMethods broker client library, all you need to do is add the right system property in JBOSS...This can be done through the admin console at “profile &amp;gt; General Configuration &amp;gt; System Properties”, or simply be written directly in the jboss configuration (standalone.xml or domain.xml), right under the &quot;extensions&quot; section...&lt;br /&gt;
Here is a sample block containing some useful webMethods Broker properties:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: xml;gutter: true;&quot;&gt;&lt;system-properties&gt;
        &lt;property name=&quot;com.webmethods.jms.clientIDSharing&quot; value=&quot;true&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;com.webmethods.jms.keepAliveInterval&quot; value=&quot;15&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;com.webmethods.jms.keepAliveAttempts&quot; value=&quot;10&quot;&gt;&lt;/property&gt;
        &lt;property name=&quot;com.webmethods.jms.log.level&quot; value=&quot;ERROR&quot;&gt;&lt;/property&gt;
    &lt;/system-properties&gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;h3&gt;4 - Create your MDBs with the right Activation Properties&lt;/h3&gt;Here is a sample of an MDB that just prints the received messages in the logs...(full code and working maven-enabled project is on github at &lt;a href=&quot;https://github.com/lanimall/messaging-samples/blob/master/jca-jms-samples/src/main/java/com/softwareag/messaging/subscribe/SimpleQueueConsumerBean.java&quot; target=&quot;_blank&quot;&gt;SimpleQueueConsumerBean.java&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
As you noticed, I specified - on purpose - a lot of the activation config available in the resource adapter implementation. Interestingly though, you don&#39;t see the &quot;JndiProperties&quot; activation spec here...and that&#39;s good and expected, since we specified it in the resource adapter &quot;JndiProperties&quot; property...That way I don&#39;t have to specify the connection definition in all my MDBs...which is great.&lt;br /&gt;
&lt;br /&gt;
For a complete reference of all the activation parameters available, refer to &lt;a href=&quot;https://genericjmsra.java.net/docs/userguide/userguide.html#mozTocId883660&quot; target=&quot;_blank&quot;&gt;genericjmsra.java.net: user guide&lt;/a&gt; and go to the &quot;Activation Spec Properties&quot; section.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java;gutter: true;&quot;&gt;//imports
...

@MessageDriven(name = &quot;SimpleQueueConsumerBean&quot;, activationConfig = {
  @ActivationConfigProperty(propertyName = &quot;connectionFactoryJndiName&quot;, propertyValue = &quot;InboundQueueConnectionFactory&quot;),
  @ActivationConfigProperty(propertyName = &quot;destinationType&quot;, propertyValue = &quot;javax.jms.Queue&quot;),
  @ActivationConfigProperty(propertyName = &quot;destinationJndiName&quot;, propertyValue = &quot;simplequeue&quot;),
        @ActivationConfigProperty(propertyName = &quot;maxPoolSize&quot;, propertyValue = &quot;50&quot;),
        @ActivationConfigProperty(propertyName = &quot;maxWaitTime&quot;, propertyValue = &quot;10&quot;),
        @ActivationConfigProperty(propertyName = &quot;redeliveryAttempts&quot;, propertyValue = &quot;10&quot;),
        @ActivationConfigProperty(propertyName = &quot;redeliveryInterval&quot;, propertyValue = &quot;1&quot;),
        @ActivationConfigProperty(propertyName = &quot;reconnectAttempts&quot;, propertyValue = &quot;10&quot;),
        @ActivationConfigProperty(propertyName = &quot;reconnectInterval&quot;, propertyValue = &quot;5&quot;)
})

@TransactionManagement(value=TransactionManagementType.BEAN)
@TransactionAttribute(value=TransactionAttributeType.NOT_SUPPORTED)
@Pool(value=&quot;mdb-strict-max-pool&quot;)
@ResourceAdapter(&quot;webm-jmsra.rar&quot;)
public class SimpleQueueConsumerBean implements MessageListener, MessageDrivenBean {
 ...

 public void onMessage(Message rcvMessage) {
  TextMessage msg = null;
  try {
   if(null != rcvMessage){
    if (rcvMessage instanceof TextMessage) {
     msg = (TextMessage) rcvMessage;
     log.info(&quot;SimpleQueueConsumerBean: Received Message from queue: &quot; + msg.getText());
    } else {
                    log.error(&quot;SimpleQueueConsumerBean: Message of wrong type: &quot; + rcvMessage.getClass().getName());
    }
   } else {
                log.info(&quot;SimpleQueueConsumerBean: Received Message from queue: null&quot;);
   }
  } catch (JMSException e) {
   throw new RuntimeException(e);
  }
 }
}
&lt;/pre&gt;&lt;br /&gt;
Another thing you might have noticed is the 2 JBOSS-specific annotations @ResourceAdaper (org.jboss.ejb3.annotation.ResourceAdapter) and @Pool (org.jboss.ejb3.annotation.Pool). This is 1 of the ways to specify which resource adapter and MDB pool your MDB should use.&lt;br /&gt;
&lt;br /&gt;
Depending on your setup (eg. all your MDBs should be using the same resource adapter + parameters), it might just be easier/better to make the webMethods Broker resource adapter the default one, and assign it a default pool...This is done in the EJB3 subsystem, as follow:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: xml;gutter: true;&quot;&gt;&lt;subsystem xmlns=&quot;urn:jboss:domain:ejb3:1.4&quot;&gt;

            &lt;!-- ... --&gt;

            &lt;mdb&gt;
                &lt;resource-adapter-ref resource-adapter-name=&quot;webm-jmsra.rar&quot;&gt;
                &lt;bean-instance-pool-ref pool-name=&quot;mdb-strict-max-pool&quot;&gt;
            &lt;/bean-instance-pool-ref&gt;&lt;/resource-adapter-ref&gt;&lt;/mdb&gt;
            &lt;pools&gt;
                &lt;bean-instance-pools&gt;
                    &lt;strict-max-pool instance-acquisition-timeout-unit=&quot;MINUTES&quot; instance-acquisition-timeout=&quot;5&quot; max-pool-size=&quot;20&quot; name=&quot;slsb-strict-max-pool&quot;&gt;
                    &lt;strict-max-pool instance-acquisition-timeout-unit=&quot;MINUTES&quot; instance-acquisition-timeout=&quot;5&quot; max-pool-size=&quot;50&quot; name=&quot;mdb-strict-max-pool&quot;&gt;
                &lt;/strict-max-pool&gt;&lt;/strict-max-pool&gt;&lt;/bean-instance-pools&gt;
            &lt;/pools&gt;

            &lt;!-- ... --&gt;

        &lt;/subsystem&gt;
&lt;/pre&gt;&lt;br /&gt;
Tune the &quot;mdb-strict-max-pool&quot; to meet your performance needs...One rule of thumb though: whatever &quot;max-pool-size&quot; you chose for the MDB pool, make sure that it&#39;s the same number also for the maxPoolSize activation property. For example, I used 50 for both.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java;gutter: true;&quot;&gt;@ActivationConfigProperty(propertyName = &quot;maxPoolSize&quot;, propertyValue = &quot;50&quot;),
&lt;/pre&gt;&lt;h3&gt;5 - Create message producer that uses the Resource Adapter outbound pooled connection&lt;/h3&gt;Ok, so now we need to send messages to that webMethods Broker queue and see if our MDB setup works ok. Sending messages to a queue is nothing new in Java JMS and we&#39;ve written that type of code thousands of time. BUT the interesting part here is to send messages using the outbound connection defined in the resource adapter and identified by the JBOSS JNDI name &quot;java:/jms/broker&quot;. By doing so, we automatically get access to app server goodness such as connection pooling for best performance...&lt;br /&gt;
All your code needs to do &quot;different&quot; (from a non-managed implementation) is to bind the connection factory to that jndi entry &quot;java:/jms/broker&quot;, which is easily achieved using the standard @resource annotation. See the extract below for details (full class at &lt;a href=&quot;https://github.com/lanimall/messaging-samples/blob/master/jca-jms-samples/src/main/java/com/softwareag/messaging/web/JcaRequestMessageProducer.java&quot; target=&quot;_blank&quot;&gt;JcaRequestMessageProducer.java&lt;/a&gt;)&lt;br /&gt;
&lt;pre class=&quot;brush: java;gutter: true;&quot;&gt;@WebServlet(&quot;/JcaMessageProducer&quot;)
public class JcaMessageProducer extends HttpServlet {
    ...

    //this uses the resource-adapter to make sure it&#39;s a managed connection etc...
    @Resource(mappedName = &quot;java:/jms/broker&quot;)
    private ConnectionFactory connectionFactory;

 ...
 
 private void sendMessage(String textToSend, String destinationName, boolean isQueue) throws JMSException {
        Connection connection = null;

        try {
            if (null == connectionFactory)
                throw new JMSException(&quot;connection factory is null...can&#39;t do anything.&quot;);

            connection = connectionFactory.createConnection();
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            //here we avoid a JNDI lookup...
            Destination destination;
            if (isQueue)
                destination = session.createQueue(destinationName);
            else
                destination = session.createTopic(destinationName);

            MessageProducer messageProducer = session.createProducer(destination);
            TextMessage message = session.createTextMessage();

            log.info(String.format(&quot;Sending new message to %s %s : %s &quot;, (isQueue) ? &quot;queue&quot; : &quot;topic&quot;, destinationName, textToSend));

            message.setText(textToSend);
            messageProducer.send(message); // Send Message

            log.info(String.format(&quot;Messages Sent&quot;));
        } catch (Exception e) {
            log.error(&quot;error while sending message&quot;, e);
            throw new JMSException(&quot;Couldn&#39;t send to queue&quot;);
        } finally {
            if (null != connection)
                connection.close();
        }
    }
&lt;/pre&gt;&lt;h3&gt;6 - Deploy and test!&lt;/h3&gt;To deploy the sample code directly onto your local JBOSS, a simple maven command (thanks maven and jboss plugin!): &lt;br /&gt;
&quot;mvn clean package jboss-as:deploy&quot;&lt;br /&gt;
&lt;br /&gt;
Once successfully deployed, you should be able to access the URL &quot;http://localhost:8080/jbossjca-sample-mdbs/JcaMessageProducer&quot;, providing the right parameter for queue name and number of message to send...&lt;br /&gt;
&lt;br /&gt;
For example, I have a queue called &quot;simplequeue&quot; and want to send 20 message...hence url would be: &quot;http://localhost:8080/jbossjca-sample-mdbs/JcaMessageProducer?queue=simplequeue&amp;count=20&quot;&lt;br /&gt;
&lt;br /&gt;
Upon execution of that url, you should see in the JBOSS standard output the messages being submitted as well as consumed by our sample MDB...&lt;br /&gt;
&lt;h3&gt;Final Words&lt;/h3&gt;I think that&#39;s it for now...You can easily recreate all this on your local laptop (as long as you have access to JBOSS EAP 6 / JBOSS AS 7 and webMethods Broker that is) as I put everything I wrote about (and more) on github at &lt;a href=&quot;https://github.com/lanimall/messaging-samples/tree/master/j2ee-jms-examples&quot;&gt;j2ee-jms-examples&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
To build and deploy the project:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;First, You&#39;ll need to put the webMethods Broker client libraries in the jbossjca-sample-mdbs/libs folder (not required to compile, but required to be added to the WAR package). Another way would be to put these jars in a Jboss global module...&lt;/li&gt;
&lt;li&gt;Then simple maven command: mvn clean package jboss-as:deploy -P jboss-ga-repository&lt;/li&gt;
&lt;/ul&gt;In some follow up posts, I&#39;ll go over the steps involved in setting up JBOSS for SSL encryption and authentication to SoftwareAG webMethods Broker...as well as specifics around JBOSS vault usage in order to encrypt the password for SSL certs...&lt;br /&gt;
&lt;br /&gt;
Hope that was helpful...</description><link>http://fsanglier.blogspot.com/2014/07/jboss-to-softwareag-webmethods-jms-jca.html</link><author>noreply@blogger.com (Fabien Sanglier)</author><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2976473844390099876.post-2216010321288953625</guid><pubDate>Fri, 19 Jul 2013 17:17:00 +0000</pubDate><atom:updated>2014-07-23T17:44:25.320-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">hadoop</category><category domain="http://www.blogger.com/atom/ns#">hdfs</category><category domain="http://www.blogger.com/atom/ns#">softwareag</category><category domain="http://www.blogger.com/atom/ns#">terracotta_bigmemory</category><title>Terracotta BigMemory-Hadoop connector: A detailed hands-on tutorial</title><description>In my previous post, &quot;&lt;a href=&quot;http://fsanglier.blogspot.com/2013/07/how-to-reconcile-real-time-and-batch.html&quot; target=&quot;_blank&quot;&gt;How to reconcile Real-Time and Batch processing using In-Memory technology: A demo at the AFCEA Cyber Symposium Plugfest&lt;/a&gt;&quot;, I went over the challenges and benefits of reconciling real-time analytics with batched analytics. Doing so, I explained the solution we put together to create an integrated Real-Time analytical capability &quot;augmented&quot; by a batched BigData Hadoop cluster.&lt;br /&gt;
&lt;br /&gt;
A critical piece of that architecture is the ability for &lt;a href=&quot;http://terracotta.org/products/bigmemorymax&quot; target=&quot;_blank&quot;&gt;Terracotta BigMemory&lt;/a&gt; to act as a fast In-Memory buffer, accessible by both the real-time world and the batch world...effectively bridging the gap between the 2.&lt;br /&gt;
The Terracotta BigMemory-Hadoop connector is at the center of that piece, allowing hadoop to write seamlessly to BigMemory.&lt;br /&gt;
&lt;br /&gt;
For general information, please refer to existing writings about this connector:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.terracotta.org/2013/04/02/hadoop-bigmemory-run-elephant-run/&quot; target=&quot;_blank&quot;&gt;http://blog.terracotta.org/2013/04/02/hadoop-bigmemory-run-elephant-run/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://terracotta.org/resources/whitepapers/bigmemory-hadoop?set=1&quot;  target=&quot;_blank&quot;&gt;http://terracotta.org/resources/whitepapers/bigmemory-hadoop?set=1&lt;/a&gt;&amp;nbsp;(White paper)&lt;/li&gt;
&lt;/ul&gt;
But in this post, I want to be &quot;hands-on&quot; and enable you to see it running for yourself on your own development box. I&#39;ve outlined the 5 major steps to successfully install and test the Hadoop-to-BigMemory connector on your own development platform.&lt;br /&gt;
I&#39;ll be using as a guide the code I put together for &quot;AFCEA Cyber Symposium Plugfest&quot;, available on github at &lt;a href=&quot;https://github.com/lanimall/cyberplugfest&quot; target=&quot;_blank&quot;&gt;https://github.com/lanimall/cyberplugfest&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Master Step 1 - Get the software components up and running&lt;/h2&gt;
&lt;br /&gt;
&lt;h3&gt;
1 - Let&#39;s download the needed components:&lt;/h3&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Hadoop connector&lt;/b&gt;: &lt;a href=&quot;http://terracotta.org/downloads/hadoop-connector?set=1&quot;  target=&quot;_blank&quot;&gt;http://terracotta.org/downloads/hadoop-connector?set=1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Bigmemory Max&lt;/b&gt;: &lt;a href=&quot;http://terracotta.org/downloads/bigmemorymax?set=1&quot; target=&quot;_blank&quot;&gt;http://terracotta.org/downloads/bigmemorymax?set=1&lt;/a&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;We&#39;ll test here with latest 4.0.2 version…but works fine with TC 3.7.x as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Hadoop&lt;/b&gt;: The connector documentation mentions hadoop version 0.20.203.0 (&lt;a href=&quot;http://archive.apache.org/dist/hadoop/core/hadoop-0.20.203.0/&quot; target=&quot;_blank&quot;&gt;http://archive.apache.org/dist/hadoop/core/hadoop-0.20.203.0/&lt;/a&gt;), but I tested successfully with Hadoop 1.1.2, and Cloudera CDH (&lt;a href=&quot;http://www.cloudera.com/content/cloudera/en/products/cdh.html&quot; target=&quot;_blank&quot;&gt;http://www.cloudera.com/content/cloudera/en/products/cdh.html&lt;/a&gt;) packages as well. Pick the one you want. I chose the standard Apache Hadoop 1.1.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
2 - Clone the git repository to get the cyberplugfest code:&amp;nbsp;&lt;/h3&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;git clone https://github.com/lanimall/cyberplugfest&lt;/i&gt;&lt;/blockquote&gt;
In the rest of the article, we will assume that &lt;b&gt;$CYBERPLUGFEST_CODE_HOME&lt;/b&gt; is the root install directory for the code.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
3 - Extract the hadoop connector somewhere on your development box.&amp;nbsp;&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
The content of the package has some simple instructions as well as a &quot;wordcount&quot; map reduce package.&lt;br /&gt;
If you want to explore and follow the default instructions + sample word count program, it works fine…but please note that I took some liberties when it comes to my setup…and these will be explained in this article.&lt;br /&gt;
In the rest of the article, we will assume that &lt;b&gt;$TC_HADOOP_HOME&lt;/b&gt; is the root install directory of the terracotta hadoop connector.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
4 - Install, configure, and start BigMemory Max&amp;nbsp;&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Follow this guide at &lt;a href=&quot;http://terracotta.org/documentation/4.0/bigmemorymax/get-started&quot; target=&quot;_blank&quot;&gt;http://terracotta.org/documentation/4.0/bigmemorymax/get-started&lt;/a&gt;. Make sure to try the helloWorld application to see if things are setup properly.&lt;br /&gt;
In the rest of the article, we will assume that &lt;b&gt;$TC_HOME&lt;/b&gt; is the root directory of BigMemory Max.&lt;br /&gt;
&lt;br /&gt;
I added a sample tc-config.xml at &lt;a href=&quot;https://github.com/lanimall/cyberplugfest/blob/master/configs/tc-config.xml&quot;  target=&quot;_blank&quot;&gt;https://github.com/lanimall/cyberplugfest/blob/master/configs/tc-config.xml&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
To get bigmemory-max started with that configuration file on your local machine, run:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;export CYBERPLUGFEST_CODE_HOME=&amp;lt;root path to cyberplugfest code cloned from github&amp;gt;&lt;br /&gt;export TC_HOME=&amp;lt;root path to terracotta install&amp;gt;&lt;br /&gt;$TC_HOME/server/bin/start-tc-server.sh -f $CYBERPLUGFEST_CODE_HOME/configs/tc-config.xml -n Server1&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;h3&gt;
5 - Install Hadoop&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
I used the pseudo distributed mode for development…Tuning and configuring hadoop is outside the scope of this article…but should certainly be explored as a &quot;go further&quot; step.&amp;nbsp;The apache page &lt;a href=&quot;http://hadoop.apache.org/docs/stable/single_node_setup.html&quot; target=&quot;_blank&quot;&gt;http://hadoop.apache.org/docs/stable/single_node_setup.html&lt;/a&gt; is good to get started on that...&lt;br /&gt;
In the rest of the article, we will assume that &lt;b&gt;$HADOOP_INSTALL&lt;/b&gt; is the root install directory of Apache Hadoop&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
6 - Add the needed terracotta libraries to the Hadoop class path&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;The hadoop connector library: bigmemory-hadoop-0.1.jar&lt;/li&gt;
&lt;li&gt;The ehcache client library: ehcache-ee-&amp;lt;downloaded version&amp;gt;.jar&lt;/li&gt;
&lt;li&gt;The terracotta toolkit library: terracotta-toolkit-runtime-ee-&amp;lt;downloaded version&amp;gt;.jar&lt;/li&gt;
&lt;/ul&gt;
&lt;u&gt;Note&lt;/u&gt;: I&#39;ve downloaded on step 4 the version 4.0.2 of bigmemory-max, so that&#39;s the version I&#39;ll be using here. Adjust appropriately the HADOOP_CLASSPATH below based on the version you downloaded.&lt;br /&gt;
&lt;br /&gt;
Edit $HADOOP_INSTALL/conf/hadoop-env.sh and add the following towards the top (replace the default empty HADOOP_CLASSPATH= line with it)&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;export TC_HOME=&amp;lt;root path to terracotta install&amp;gt;&lt;br /&gt;export TC_HADOOP_HOME=&amp;lt;root path to hadoop install&amp;gt;&lt;br /&gt;
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:${TC_HADOOP_HOME}/jars/bigmemory-hadoop-0.1.jar:${TC_HOME}/apis/ehcache/lib/ehcache-ee-2.7.2.jar:${TC_HOME}/apis/toolkit/lib/terracotta-toolkit-runtime-ee-4.0.2.jar&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;h3&gt;
7 - Start Hadoop in pseudo-distributed mode&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Master Step 2 - Write the Map/Reduce job using spring-hadoop and Terracotta BigMemory output connector&lt;/h2&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Ok, at this point, you should have all the software pieces (big memory max and hadoop) ready and running in the background. Now it&#39;s time to build a map/reduce job that will output something in Terracotta BigMemory. For the &quot;AFCEA Cyber Symposium Plugfest&quot; which this article is based on, I decided to build a simple &quot;Mean Calculation&quot; map/reduce job…the idea being that the job would run on a schedule, calculate the mean for all the transactions per Vendor, and output the calculated mean per vendor into a Terracotta BigMemory cache.&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot; colspan=&quot;2&quot;&gt;Cache &lt;br /&gt;
&quot;vendorAvgSpend&quot;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor A&lt;/td&gt;
&lt;td&gt;Mean A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor B&lt;/td&gt;
&lt;td&gt;Mean B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor N&lt;/td&gt;
&lt;td&gt;Mean N&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
And since I really like Spring (&lt;a href=&quot;http://www.springsource.org/&quot; target=&quot;_blank&quot;&gt;http://www.springsource.org&lt;/a&gt;) and wanted to extend the simple hadoop wordCount example, I decided to use Spring-Data Hadoop (&lt;a href=&quot;http://www.springsource.org/spring-data/hadoop&quot; target=&quot;_blank&quot;&gt;http://www.springsource.org/spring-data/hadoop&lt;/a&gt;) to build the map reduce job for the plugfest.&lt;br /&gt;
&lt;br /&gt;
Some really good tutorials for Spring Hadoop out there, so I don&#39;t want to duplicate here…One I liked for it&#39;s simplicity and clarity was &lt;a href=&quot;http://www.petrikainulainen.net/programming/apache-hadoop/creating-hadoop-mapreduce-job-with-spring-data-apache-hadoop/&quot; target=&quot;_blank&quot;&gt;http://www.petrikainulainen.net/programming/apache-hadoop/creating-hadoop-mapreduce-job-with-spring-data-apache-hadoop/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Rather, I&#39;ll concentrate at the specificities related to the Terracotta BigMemory output writing.&lt;br /&gt;
Code available at: &lt;a href=&quot;https://github.com/lanimall/cyberplugfest/tree/master/HadoopJobs&quot; target=&quot;_blank&quot;&gt;https://github.com/lanimall/cyberplugfest/tree/master/HadoopJobs&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
1 - Let&#39;s explore the application-context.xml&lt;/h3&gt;
&lt;br /&gt;
&lt;a href=&quot;https://github.com/lanimall/cyberplugfest/blob/master/HadoopJobs/src/main/resources/META-INF/spring/application-context.xml&quot; target=&quot;_blank&quot;&gt;https://github.com/lanimall/cyberplugfest/blob/master/HadoopJobs/src/main/resources/META-INF/spring/application-context.xml&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
a - Specify the output cache name for the BigMemory hadoop job&lt;/h4&gt;
In the &amp;lt;hdp:configuration&amp;gt;&amp;lt;hdp:configuration&amp;gt;, make sure to add the &quot;bigmemory.output.cache&quot; entry that specifies the output cache. Since our output cache is &quot;vendorAvgSpend&quot;, it should basically be: bigmemory.output.cache=vendorAvgSpend&lt;br /&gt;
&lt;u&gt;NOTE&lt;/u&gt;: I use Maven resource plugin, so this value is actually specific in the pom.xml (in the property &quot;hadoop.output.cache&quot;)&lt;br /&gt;
&lt;h4&gt;
b - Check the difference between hadoop jobs&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;hdjob-vendoraverage&lt;/b&gt;=standard M/R job that outputs to HDFS&lt;/li&gt;
&lt;li&gt;&lt;b&gt;hdjob-vendoraverage-bm&lt;/b&gt;=the same M/R job that outputs to BigMemory&lt;/li&gt;
&lt;/ul&gt;
You&#39;ll notice 4 differences:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;output-format&lt;/b&gt;&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;For the hadoop BigMemory job (&lt;b&gt;hdjob-vendoraverage-bm&lt;/b&gt;), output-format value is: &quot;org.terracotta.bigmemory.hadoop.BigmemoryOutputFormat&quot;&lt;/li&gt;
&lt;li&gt;For&amp;nbsp;&lt;b&gt;hdjob-vendoraverage&lt;/b&gt;, it&#39;s the standard &lt;b&gt;&quot;&lt;/b&gt;org.apache.hadoop.mapreduce.lib.output.TextOutputFormat&quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;&lt;b&gt;output-path&lt;/b&gt;&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;It is not needed for the hadoop BigMemory job since it does not write onto HDFS...&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;&lt;b&gt;reducer&lt;/b&gt;&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;For the hadoop BigMemory job, a different reducer implementation is needed (org.terracotta.pocs.cyberplugfest.VendorSalesAvgReducerBigMemory) because you need to return an object of type &quot;BigmemoryElementWritable&quot;&lt;/li&gt;
&lt;li&gt;For&amp;nbsp;hdjob-vendoraverage job, the reducer returns an&amp;nbsp;object of type&quot;Text&quot;.&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;&lt;b&gt;files&lt;/b&gt;&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;In the&amp;nbsp;&lt;b&gt;hdjob-vendoraverage-bm&lt;/b&gt; job, you need to add the terracotta license file so the hadoop job can connect to the terracotta bigmemory (enterprise feature)&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;h4&gt;
c - Specify the job to run.&lt;/h4&gt;
Done in the &amp;lt;hdp:job-runner ...&amp;gt; tag. You can switch back and forth to see the difference...
&lt;br /&gt;
&lt;h3&gt;
2 - Now, let&#39;s look at the reducers&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Compare:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;hdjob-vendoraverage-bm&amp;nbsp;&lt;/b&gt;reducer class: org.terracotta.pocs.cyberplugfest.VendorSalesAvgReducerBigMemory&lt;/li&gt;
&lt;li&gt;&lt;b&gt;hdjob-vendoraverage&lt;/b&gt;: org.terracotta.pocs.cyberplugfest.VendorSalesAvgReducer&lt;/li&gt;
&lt;/ul&gt;
The difference is pretty much&amp;nbsp;the return type that must be a &quot;&lt;b&gt;BigmemoryElementWritable&lt;/b&gt;&quot; type if you want to output the results to Terracotta BigMemory.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
3 - Include the cache configuration (Ehcache.xml) in your M/R project&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
To specify the details for the vendorAvgSpend cache. Using the maven conventions, the file is included (along my other resources files) in the resources folder (&lt;a href=&quot;https://github.com/lanimall/cyberplugfest/blob/master/HadoopJobs/src/main/resources/ehcache.xml&quot; target=&quot;_blank&quot;&gt;https://github.com/lanimall/cyberplugfest/blob/master/HadoopJobs/src/main/resources/ehcache.xml&lt;/a&gt;)  &lt;br /&gt;
&lt;br /&gt;
In this ehcache.xml file, you&#39;ll notice our hadoop output cache (as well as several other caches that are NOT used by the hadoop jobs). The one thing that is needed is that it must be a &quot;distributed&quot; cache - in other word, the data will be stored on the BigMemory Max Server instance that should be already running on your development box (The &quot;&lt;terracotta&gt;&quot; and &quot;&lt;terracottaconfig&gt;&quot; tags specifies that) &lt;/terracottaconfig&gt;&lt;/terracotta&gt;&lt;br /&gt;
&lt;br /&gt;
For more info on that, go to &lt;a href=&quot;http://terracotta.org/documentation/4.0/bigmemorymax/get-started/server-array&quot; target=&quot;_blank&quot;&gt;http://terracotta.org/documentation/4.0/bigmemorymax/get-started/server-array&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Master Step 3 - Prepare the sample data&lt;/h2&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
In the real demo scenario, I use Apache Flume (&lt;a href=&quot;http://flume.apache.org/&quot;&gt;http://flume.apache.org&lt;/a&gt;) to &quot;funnel&quot; near real-time the generated sample data into HDFS…But for the purpose of this test, it can all work fine with some sample data. All we need to do is import the data into our local HDFS.&lt;br /&gt;
&lt;br /&gt;
Extract the sample at: $CYBERPLUGFEST_CODE_HOME/HadoopJobs/SampleTransactionsData/&lt;a href=&quot;https://github.com/lanimall/cyberplugfest/blob/master/HadoopJobs/SampleTransactionsData/sample-data.zip&quot; target=&quot;_blank&quot;&gt;sample-data.zip&lt;/a&gt;.&lt;br /&gt;
It should create a &quot;flume&quot; folder with the following hierarchy:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;flume/&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;events/&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;13-07-17/&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;events.* (those are the files with the comma separated data)&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;br /&gt;
Navigate to $CYBERPLUGFEST_CODE_HOME/HadoopJobs/SampleTransactionsData/ &lt;br /&gt;
Run the hadoop shell &quot;put&quot; command to add all these files into HDFS:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;$HADOOP_INSTALL/bin/hadoop dfs -put flume/ .&lt;/i&gt;&lt;/blockquote&gt;
Once done, verify that the data is in HDFS by running (This should bring a lot of event files…):&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;$HADOOP_INSTALL/bin/hadoop dfs -ls flume/events/13-07-17/&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;h2&gt;
Master Step 4 - Compile and Run the hadoop job&lt;/h2&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Still referring to the Cyberplugfest code available at &lt;a href=&quot;https://github.com/lanimall/cyberplugfest/blob/master/HadoopJobs&quot; target=&quot;_blank&quot;&gt;https://github.com/lanimall/cyberplugfest/&lt;/a&gt;, you&#39;ll need to simply execute a maven build to get going.&lt;br /&gt;
&lt;br /&gt;
Before that though, make sure the maven properties are right for your environment (i.e. hadoop name node url, hadoop job tracker url, terracotta url, cache name, etc…). These properties are specified towards the end of the &lt;a href=&quot;https://github.com/lanimall/cyberplugfest/blob/master/HadoopJobs/pom.xml&quot; target=&quot;_blank&quot;&gt;pom file&lt;/a&gt;, in the maven profiles I created for that event (dev profile is for my local, prod profile is to deploy in the amazon ec2 cloud)&lt;br /&gt;
&lt;br /&gt;
Then, navigate to the $CYBERPLUGFEST_CODE_HOME/HadoopJobs folder and run:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;mvn clean package appassembler:assemble&lt;/i&gt;&lt;/blockquote&gt;
This should build without an issue, and create a &quot;PlugfestHadoopApp&quot; executable script (the maven appassembler plugin helps with that) in $CYBERPLUGFEST_CODE_HOME/HadoopJobs/target/appassembler/bin folder.&lt;br /&gt;
&lt;br /&gt;
Depending on your platform (window or nix), chose the right script (sh or bat) and run:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;sh $CYBERPLUGFEST_CODE_HOME/HadoopJobs/target/appassembler/bin/PlugfestHadoopApp&lt;br /&gt;or&lt;br /&gt;%CYBERPLUGFEST_CODE_HOME%/HadoopJobs/target/appassembler/bin/PlugfestHadoopApp.bat&lt;/i&gt;&lt;/blockquote&gt;
Your hadoop job should be running.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5C3uWfAZtjVCV_lKuNZDRxsdZABdMvo6zWj8FNPhL8ozUI_e81NfoC5F6GCMKTlX1Di5fOzWD2Sj5IQG4PpMOsEQ4przcodrkVbf5eP22EDF1i-P2Kz1PYDvSnBIUs1l2D3iVLjRWGbo/s1600/hadoop-job-running.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;276&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5C3uWfAZtjVCV_lKuNZDRxsdZABdMvo6zWj8FNPhL8ozUI_e81NfoC5F6GCMKTlX1Di5fOzWD2Sj5IQG4PpMOsEQ4przcodrkVbf5eP22EDF1i-P2Kz1PYDvSnBIUs1l2D3iVLjRWGbo/s400/hadoop-job-running.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Master Step 5 - Verify data is written to Terracotta BigMemory&lt;/h2&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Now we&#39;ll verify that the data was written to BigMemory from the hadoop job. Simply run:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;sh $CYBERPLUGFEST_CODE_HOME/HadoopJobs/target/appassembler/bin/VerifyBigmemoryData&lt;br /&gt;or&lt;br /&gt;%CYBERPLUGFEST_CODE_HOME%/HadoopJobs/target/appassembler/bin/VerifyBigmemoryData.bat&lt;/i&gt;&lt;/blockquote&gt;
You should see 6 entries being printed for cache vendorAvgSpend&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1TyWRVoZaNU8gZ6mxqITA9mkLdY-Cq2DgFuO7ANDJQNncmjt3wUHpgA_WQxk29tVIPWwlLO_SOgN-WKulUTL6NhbCr4YpueuR-mamee7FUWdXifjADUQj6qEqC73QP7SxGYGnUh_TVjg/s1600/hadoop-output-bigmemory-verification.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;171&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1TyWRVoZaNU8gZ6mxqITA9mkLdY-Cq2DgFuO7ANDJQNncmjt3wUHpgA_WQxk29tVIPWwlLO_SOgN-WKulUTL6NhbCr4YpueuR-mamee7FUWdXifjADUQj6qEqC73QP7SxGYGnUh_TVjg/s400/hadoop-output-bigmemory-verification.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;h2&gt;
Final Words&lt;/h2&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Using this hadoop-to-bigmemory connector, you can truly start to think: &quot;I can now access all my BigData insights at micro-second speed directly from within all my enterprise applications, AND confidently rely on the fact that these insights will be updated automatically whenever you hadoop jobs are running next&quot;.&lt;br /&gt;
&lt;br /&gt;
Hope you find this hands-on post useful.</description><link>http://fsanglier.blogspot.com/2013/07/terracotta-bigmemory-hadoop-connector.html</link><author>noreply@blogger.com (Fabien Sanglier)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5C3uWfAZtjVCV_lKuNZDRxsdZABdMvo6zWj8FNPhL8ozUI_e81NfoC5F6GCMKTlX1Di5fOzWD2Sj5IQG4PpMOsEQ4przcodrkVbf5eP22EDF1i-P2Kz1PYDvSnBIUs1l2D3iVLjRWGbo/s72-c/hadoop-job-running.png" height="72" width="72"/><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2976473844390099876.post-3324924229677002930</guid><pubDate>Mon, 01 Jul 2013 16:49:00 +0000</pubDate><atom:updated>2014-07-23T17:45:44.998-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">demo</category><category domain="http://www.blogger.com/atom/ns#">flume</category><category domain="http://www.blogger.com/atom/ns#">hadoop</category><category domain="http://www.blogger.com/atom/ns#">jms</category><category domain="http://www.blogger.com/atom/ns#">messaging</category><category domain="http://www.blogger.com/atom/ns#">plugfest</category><category domain="http://www.blogger.com/atom/ns#">softwareag</category><category domain="http://www.blogger.com/atom/ns#">terracotta_bigmemory</category><category domain="http://www.blogger.com/atom/ns#">universal_messaging</category><title>How to reconcile Real-Time and Batch processing using In-Memory technology: A demo at the AFCEA Cyber Symposium Plugfest</title><description>As you might remember, we&lt;span style=&quot;font-size: xx-small;&quot;&gt;(*)&lt;/span&gt;&amp;nbsp;participated in a &quot;Plugfest&quot;&lt;span style=&quot;font-size: xx-small;&quot;&gt;(**)&lt;/span&gt; earlier this year in San Diego. Here is the summary post of what we built for that occasion: &lt;a href=&quot;http://fsanglier.blogspot.com/2013/04/my-2013-afcea-san-diego-plugfest.html&quot; target=&quot;_blank&quot;&gt;http://fsanglier.blogspot.com/2013/04/my-2013-afcea-san-diego-plugfest.html&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
This time around, we entered the plugfest competition as a technology provider at the&amp;nbsp;&lt;a href=&quot;http://www.afcea.org/events/cyber/13/intro.asp&quot; target=&quot;_blank&quot;&gt;AFCEA Cyber Symposium&lt;/a&gt;,&amp;nbsp;which happened last week (June 25-27 2013) in Baltimore. We not only provided technologies components and data feeds to the challengers (San Diego State University, GMU, Army PEO C3T milSuite), but also built a very cool Fraud Detection and Money Laundering demo which was 1 of the plugfest use case for this cyber event.&lt;br /&gt;
&lt;br /&gt;
Our demo was centered around a fundamental &quot;Big Data&quot; question: How can you detect fraud on 100,000s transactions per seconds &lt;b&gt;in real-time&lt;/b&gt; (which is absolutely critical if you don&#39;t want to lose lots of $$$$ to fraud) while efficiently incorporating in that real-time process data from external systems (i.e. data warehouse or hadoop clusters).&lt;br /&gt;
Or in more general words:&amp;nbsp;How to reconcile Real-time&amp;nbsp;processing and Batch&amp;nbsp;processing when dealing with large amounts of data.&lt;br /&gt;
&lt;br /&gt;
To answer this question, we put together a demo centered around&amp;nbsp;Terracotta&#39;s In-Genius intelligence platform (&lt;a href=&quot;http://terracotta.org/products/in-genius&quot;&gt;http://terracotta.org/products/in-genius&lt;/a&gt;) which provides a highly scalable low-latency in-memory layer capable of &quot;reconciling&quot; the real-time processing needs (ultra low latency with large amounts of new transactions) with the traditional batch processing needs (100s of TB/PB processed in an asynchronous background jobs), all bundled in a simple software package deployable on any commodity hardware.&lt;br /&gt;
&lt;br /&gt;
Here is the solution we assembled:&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi14KHFw4jH5kAQjeVGkG8dYwJ_Zwp-hqyAY_c93YcX4X4avoW2BsIISe4wIYiYBg_OJ7IFP4DHtcz5zzjJ3JwpcYxCFh74FsWDk_O-pEEyTm0CU40z0uvAfhfWgxCJlkQdXkRwL_8szsU/s1430/Cyber+Plugfest-Software+Architecture.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;425&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi14KHFw4jH5kAQjeVGkG8dYwJ_Zwp-hqyAY_c93YcX4X4avoW2BsIISe4wIYiYBg_OJ7IFP4DHtcz5zzjJ3JwpcYxCFh74FsWDk_O-pEEyTm0CU40z0uvAfhfWgxCJlkQdXkRwL_8szsU/s640/Cyber+Plugfest-Software+Architecture.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Cyber Plugfest Software Architecture&lt;br /&gt;How to reconcile real-time and batch processing&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
A quick view at how it all works:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;A custom transaction simulator generates pseudo-random fictional credit card transactions and publish all of them onto a JMS topic (&lt;a href=&quot;http://my-channels.com/products/nirvana.html&quot; target=&quot;_blank&quot;&gt;Terracotta Universal Messaging bus&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Each JMS message is delivered through pub/sub messaging to both real-time and batch track:&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;The Complex Event Processing (CEP) engine which will identify fraud in &lt;u&gt;&lt;b&gt;real-time&lt;/b&gt;&lt;/u&gt; through the use of continuous queries.&lt;/li&gt;
&lt;ol&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;See &quot;&lt;span style=&quot;text-align: -webkit-auto;&quot;&gt;Real-Time fraud detection route&lt;/span&gt;&quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;&lt;a href=&quot;http://flume.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache Flume&lt;/a&gt;, an open source platform which will efficiently and reliably route all the messages into HDFS for further &lt;b&gt;&lt;u&gt;batch&lt;/u&gt;&lt;/b&gt; processing.&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;See &quot;&lt;/span&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;text-align: -webkit-auto;&quot;&gt;Batch Processing Route&lt;/span&gt;&quot;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;li&gt;&lt;u&gt;Batch Processing Route&lt;/u&gt;:&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://hadoop.apache.org/&quot; target=&quot;_blank&quot;&gt;Apache hadoop&lt;/a&gt;&amp;nbsp;to collect and store all the transaction data in its powerful batch-optimized file system&lt;/li&gt;
&lt;li&gt;Map-Reduce jobs to compute transaction trends (simplified rolling average in this demo case) on the full transaction data for each vendors, customer, or purchase types.&lt;/li&gt;
&lt;li&gt;Output of map-reduce jobs stored in&amp;nbsp;&lt;a href=&quot;http://terracotta.org/products/bigmemorymax&quot; target=&quot;_blank&quot;&gt;Terracotta BigMemory Max&lt;/a&gt;&amp;nbsp;In-Memory platform.&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;&lt;u&gt;Real-Time fraud detection route&lt;/u&gt;:&lt;/li&gt;
&lt;ol&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;CEP fraud detection queries fetch from&amp;nbsp;&lt;a href=&quot;http://terracotta.org/products/bigmemorymax&quot; style=&quot;text-align: -webkit-auto;&quot; target=&quot;_blank&quot;&gt;Terracotta BigMemory Max&lt;/a&gt;&amp;nbsp;(microsecond latency under load) the hadoop-calculated averages (in 3.2), and correlates those with the current incoming transaction to detect anomalies (potential fraud) in real-time.&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.softwareag.com/corporate/products/aris_platform/aris_controlling/aris_mashzone/overview/default.asp&quot; style=&quot;line-height: 20px;&quot; target=&quot;_blank&quot;&gt;Mashzone&lt;/a&gt;&lt;span style=&quot;line-height: 20px;&quot;&gt;, a mashup and data aggregation tool to provide&amp;nbsp;visualization on detected fraud data.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;line-height: 20px;&quot;&gt;For other plugfest challengers and technology providers to be able to use our data,&amp;nbsp;all our data feeds were also available in REST, SOAP, and Web socket formats (which were used by ESRI, Visual Analytics, and others)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;br /&gt;
As I hope you can see in this post, having a scalable and powerful &lt;b&gt;in-memory layer&lt;/b&gt; acting as the &lt;b&gt;middle man&lt;/b&gt; between Hadoop and CEP is the key to &lt;b&gt;providing true real-time analysis&lt;/b&gt; while still taking advantage of all the powerful computing capabilities that Hadoop has to offer.&lt;br /&gt;
&lt;br /&gt;
In further posts, I&#39;ll explain&amp;nbsp;in more detail&amp;nbsp;all the components and code (code and configs are available on github at &lt;a href=&quot;https://github.com/lanimall/cyberplugfest&quot;&gt;https://github.com/lanimall/cyberplugfest&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Notes:&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #333333; font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 16px; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: xx-small;&quot;&gt;(*)&amp;nbsp;&lt;/span&gt;&quot;we&quot; = The&amp;nbsp;&lt;a href=&quot;http://www.softwareag-gov.com/&quot; target=&quot;_blank&quot;&gt;SoftwareAG Government Solutions team&lt;/a&gt;, which I&#39;m part of...&lt;br /&gt;
&lt;span style=&quot;font-size: xx-small;&quot;&gt;(**)&lt;/span&gt;&amp;nbsp;&quot;Plugfest&quot; =&amp;nbsp;&lt;span style=&quot;background-color: white; color: #333333; font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 16px; text-align: left;&quot;&gt;&quot;collaborative competitive challenge where industry vendors, academic, and government teams work towards solving a specific set of &quot;challenges&quot; strictly using the&amp;nbsp;RI2P industrial best practices (agile, open standard, SOA, cloud, etc.) for enterprise information system development and deployment.&quot; (source:&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.afcea.org/events/west/13/plugfest.asp&quot; style=&quot;background-color: white; color: #336699; font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 16px; text-align: left;&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;s1&quot;&gt;http://www.afcea.org/events/west/13/plugfest.asp&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 16px; text-align: left;&quot;&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white; color: #333333; font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 16px; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
</description><link>http://fsanglier.blogspot.com/2013/07/how-to-reconcile-real-time-and-batch.html</link><author>noreply@blogger.com (Fabien Sanglier)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi14KHFw4jH5kAQjeVGkG8dYwJ_Zwp-hqyAY_c93YcX4X4avoW2BsIISe4wIYiYBg_OJ7IFP4DHtcz5zzjJ3JwpcYxCFh74FsWDk_O-pEEyTm0CU40z0uvAfhfWgxCJlkQdXkRwL_8szsU/s72-c/Cyber+Plugfest-Software+Architecture.png" height="72" width="72"/><thr:total>6</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2976473844390099876.post-6124037192098429790</guid><pubDate>Fri, 31 May 2013 15:45:00 +0000</pubDate><atom:updated>2014-07-23T17:46:48.785-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">concurrent</category><category domain="http://www.blogger.com/atom/ns#">ehcache</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">terracotta</category><category domain="http://www.blogger.com/atom/ns#">testing_framework</category><category domain="http://www.blogger.com/atom/ns#">threads</category><title>Custom framework for easy multi-threading</title><description>&lt;div class=&quot;p1&quot;&gt;
A big part of my job at &lt;a href=&quot;http://terracotta.org/&quot; target=&quot;_blank&quot;&gt;Terracotta&lt;/a&gt; is to not only demonstrate the various features of&amp;nbsp;&lt;a href=&quot;http://terracotta.org/products&quot; target=&quot;_blank&quot;&gt;Terracotta BigMemory&lt;/a&gt; (efficiently using all the RAM available on our server within a single java process, ease of use, high availability, consistency, multi-tenancy, etc...) but also the performance improvements (maximizing transaction/seconds or minimizing processing response times) you get by introducing BigMemory in your environment/application(s).&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
But to fully demonstrate how Terracotta BigMemory can provide and consistently guarantee &lt;b&gt;Microsecond speed at TerraByte (TB) scale&lt;/b&gt;, I needed (still need) on a regular basis to be able to:&lt;/div&gt;
&lt;ol class=&quot;ol1&quot;&gt;
&lt;li class=&quot;li1&quot;&gt;Create an way to load Terracotta with massive amount of data, and&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;Create a way to &quot;flood&quot; Terracotta BigMemory with massive amount of requests (gets, puts, searches)&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;While making it easy to extend for any test use case, and&amp;nbsp;&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;Allowing for the loading of all different &quot;specialized&quot; business objects into BigMemory (because customers don&#39;t want to necessarily test only with generic data structures or byte arrays)&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;p1&quot;&gt;
What I started to do initially was to build for each new use case a different program using thread pool executor, queue, deques, etc...and doing a lot of copy pasting, and of course introducing some nice concurrency bugs at the same time :) !! (for example, I should have known the class &quot;Random&quot; is thread-safe...hence uses locks if accessed by multiple threads = not good for a concurrent framework)&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
So I decided to build a highly concurrent framework that I could rely on and could reuse over and over without having to rebuild the wheel each time, and especially without having to wonder: is the performance I&#39;m measuring right now the actual performance of the system under test, or is it measuring - without my knowledge - the time taken by my threads to &quot;lock&quot; on top of each other!&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
Enter &quot;JPerftester&quot; (I wish I had found a more awesome name for it :) ) available on my github account at&amp;nbsp;&lt;a href=&quot;https://github.com/lanimall/JPerfTester&quot;&gt;&lt;span class=&quot;s1&quot;&gt;https://github.com/lanimall/JPerfTester&lt;/span&gt;&lt;/a&gt;.&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
I tried to architect it in a way that it&#39;s modular enough to use it for Terracotta-specific use cases, but possibly also for other use case as well (like for example using multi-threading to load billions of records into a DB, or do comparative load testing against other systems out there). Here is the structure:&lt;/div&gt;
&lt;ul class=&quot;ul1&quot;&gt;
&lt;li class=&quot;li1&quot;&gt;Base -----&amp;gt; [maven base pom for global plugins/dependencies]&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;BaseEngine&amp;nbsp;-----&amp;gt; [multi-threading base + generic framework objects and helpers]&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;TerracottaEhCacheTesterSuite&amp;nbsp;-----&amp;gt; [Terracotta specific suite]&lt;/li&gt;
&lt;ul class=&quot;ul2&quot;&gt;
&lt;li class=&quot;li1&quot;&gt;Base&amp;nbsp;-----&amp;gt; [maven base pom for global Terracotta/Ehcache&amp;nbsp;plugins/dependencies]&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;BaseEngine&amp;nbsp;&amp;nbsp;-----&amp;gt; [specific framework objects for terracotta such as key-value pair operation executors etc...]&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;TesterClients&amp;nbsp;&amp;nbsp;-----&amp;gt; [actual running examples]&lt;/li&gt;
&lt;ul class=&quot;ul3&quot;&gt;
&lt;li class=&quot;li1&quot;&gt;CacheWriterTester&amp;nbsp;&amp;nbsp;-----&amp;gt; [testing cache writing scenarii under load]&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;CustomCacheSearchTester&amp;nbsp; -----&amp;gt; [testing&amp;nbsp;searches]&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;POJOCacheTester&amp;nbsp;&amp;nbsp;-----&amp;gt; [testing get/puts with some actual POJOs]&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;...there could be many more here&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;li class=&quot;li1&quot;&gt;Other suite 1&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;Other suite 2&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;etc...&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;p1&quot;&gt;
To build,&amp;nbsp;simply go to JPerfTester root folder and run &quot;mvn clean install&quot;...that should be it to compile it all + package the sample TesterClients apps in tar.gz files (&quot;dist&quot; folders after build phase) that you can deploy anywhere you have JAVA installed (and Terracotta, since these sample app are terracotta testers)&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
In further posts, I&#39;ll go over in more detail how to run these test clients in your environment, and how to create a new &quot;Tester Client&quot; (terracotta-specific or not) for your needs.&lt;/div&gt;
</description><link>http://fsanglier.blogspot.com/2013/05/my-custom-framework-for-easy-multi.html</link><author>noreply@blogger.com (Fabien Sanglier)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2976473844390099876.post-7881772936446984117</guid><pubDate>Mon, 01 Apr 2013 17:29:00 +0000</pubDate><atom:updated>2014-07-23T17:47:58.236-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">cep</category><category domain="http://www.blogger.com/atom/ns#">demo</category><category domain="http://www.blogger.com/atom/ns#">google_maps</category><category domain="http://www.blogger.com/atom/ns#">plugfest</category><category domain="http://www.blogger.com/atom/ns#">realtime</category><category domain="http://www.blogger.com/atom/ns#">softwareag</category><category domain="http://www.blogger.com/atom/ns#">terracotta</category><category domain="http://www.blogger.com/atom/ns#">terracotta_bigmemory</category><category domain="http://www.blogger.com/atom/ns#">universal_messaging</category><title>My 2013 AFCEA San Diego Plugfest Participation - Showing off Terracotta In-Genius</title><description>A couple of weeks ago (end of January 2013), 2 colleagues and I participated (under our company banners, Terracotta and SoftwareAG) in a government &quot;plugfest&quot;...and we won first place! Check out this other articles that also talks about our win: &lt;a href=&quot;http://ctovision.com/2013/02/plugfest-at-afcea-west-terracotta-wins-first-place&quot; target=&quot;_blank&quot;&gt;http://ctovision.com/2013/02/plugfest-at-afcea-west-terracotta-wins-first-place&lt;/a&gt; - and if you&#39;re in a rush, jump directly to the &lt;a href=&quot;#videolink&quot;&gt;short 3 minute video demo&lt;/a&gt; below.
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;p2&quot;&gt;
What is that, you may ask? As explained on the AFCEA website (&lt;a href=&quot;http://www.afcea.org/events/west/13/plugfest.asp&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;s1&quot;&gt;http://www.afcea.org/events/west/13/plugfest.asp&lt;/span&gt;&lt;/a&gt;), a plugfest is a &quot;collaborative competitive&quot; challenge where industry vendors, academic, and government teams work towards solving a specific set of &quot;challenges&quot; strictly using the&amp;nbsp;RI2P industrial best practices (agile, open standard, SOA, cloud, etc.) for enterprise information system development and deployment.&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;
The idea is to &quot;plug&quot; technologies together (technologies provided by the various players, not necessarily within your team) as opposed to rebuild everything from scratch. And indeed, &quot;plugging&quot; is almost mandatory since the scenario is only announced 24 hours before the event, giving the teams a mere 72 hours to create something based on the scenario provided.&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;
Overall, it&#39;s the government effort to encourage/push for more interoperability and reuse of IT components across projects and/or even agencies.&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;span class=&quot;s2&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;This particular January 2013 plugfest was about s&lt;/span&gt;olving a&amp;nbsp;&lt;span class=&quot;s3&quot;&gt;Humanitarian Assistance and Disaster Relief&lt;/span&gt;&amp;nbsp;(HADR) use case problem where technology:&lt;/div&gt;
&lt;ul class=&quot;ul1&quot;&gt;
&lt;li class=&quot;li5&quot;&gt;Helps track in real-time what&#39;s happening on the ground (data streams about hazardous materials, first responders, sensors, injured civilians, etc...) and&amp;nbsp;report it in an actionable, geospatially-enabled, format&lt;/li&gt;
&lt;li class=&quot;li5&quot;&gt;Provides real-time decision support based on pre-defined emergency protocols&lt;/li&gt;
&lt;li class=&quot;li5&quot;&gt;Correlates various &quot;BigData&quot; streams (sensors, social feeds, etc...) to perform real-time analytics in order to predict movements and/or identify &quot;flash mobs&quot; / criminal hotspots taking advantage of the confusion.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;p6&quot;&gt;
The end result of what we put together was a real-time &quot;map&quot; dashboard that shows everything that&#39;s happening on the ground, and provide contextual highlights to help decision support.&lt;br /&gt;
&lt;a href=&quot;&quot; name=&quot;videolink&quot;&gt;&lt;/a&gt;Here is a short 3 minute video showing the nuts and bolts of that demo:&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p6&quot;&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;object height=&quot;360&quot; width=&quot;640&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/-MoC12YhwYI&amp;hl=en&amp;fs=1&quot;&gt;&lt;/param&gt;
&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;
&lt;embed src=&quot;http://www.youtube.com/v/-MoC12YhwYI&amp;hl=en&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; width=&quot;640&quot; height=&quot;360&quot;&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;p6&quot;&gt;
&lt;br /&gt;
What you particularly see in the video demo:&lt;/div&gt;
&lt;ul class=&quot;ul1&quot;&gt;
&lt;li class=&quot;li10&quot;&gt;Moving actors on the disaster zone (first responders, plumes of toxicity, drones, etc...). Each of these actors are &quot;broadcasting&quot;&amp;nbsp;their current geolocations (lat, long + metadata)&amp;nbsp;at various time interval using the &lt;a href=&quot;http://www.my-channels.com/products/nirvana.html&quot; target=&quot;_blank&quot;&gt;nirvana universal messaging&lt;/a&gt; (1000s of message per second)&lt;/li&gt;
&lt;li class=&quot;li10&quot;&gt;Terracotta&#39;s Complex event processing (CEP) engine performing continuous &quot;geo&quot; queries identifying in real-time the distance, speed and direction of the hazardous plumes in comparison to the various red-cross shelters on the map. The CEP engine automatically generates alerts if hazardous plumes are indeed forecasted to impact shelters...providing critical decision support to the commander in charge.&lt;/li&gt;
&lt;li class=&quot;li10&quot;&gt;All events and metadata are stored in-memory, using &lt;a href=&quot;http://terracotta.org/products&quot; target=&quot;_blank&quot;&gt;Terracotta BigMemory&lt;/a&gt; for faster, micro-second access and analytics.&lt;/li&gt;
&lt;li class=&quot;li10&quot;&gt;The ability to drill into the moving drones, planes and responders to see a ground view in real-time.&lt;/li&gt;
&lt;li class=&quot;li10&quot;&gt;A triaged based causality tracking and available blood supply.&lt;/li&gt;
&lt;li class=&quot;li10&quot;&gt;Availability of shelters, red cross centers, blood banks, and other supporting organizations(DOD types).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div class=&quot;p6&quot;&gt;
List of what we &quot;plugged&quot;:&lt;/div&gt;
&lt;ul class=&quot;ul1&quot;&gt;
&lt;li class=&quot;li6&quot;&gt;Terracotta&#39;s In-Genius in-memory intelligence platform (&lt;a href=&quot;http://terracotta.org/products/in-genius&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;s1&quot;&gt;http://terracotta.org/products/in-genius&lt;/span&gt;&lt;/a&gt;) to provide real-time analytics &amp;nbsp;(continuous queries ) and decision support based on the incoming streaming data&lt;/li&gt;
&lt;li class=&quot;li7&quot;&gt;&lt;span class=&quot;s2&quot;&gt;SoftwareAG/&lt;/span&gt;Terracotta&#39;s low-latency low-bandwidth universal messaging platform (&lt;a href=&quot;http://www.my-channels.com/products/nirvana.html&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;s1&quot;&gt;http://www.my-channels.com/products/nirvana.html&lt;/span&gt;&lt;/a&gt;) as the fast messaging communication engine between the visualization front-end and the intelligence platform backend&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;SoftwareAG webMethods ESB (&lt;a href=&quot;http://www.softwareag.com/webmethods/&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;s1&quot;&gt;http://www.softwareag.com/webmethods/&lt;/span&gt;&lt;/a&gt;) to integrate various data feeds and store and make it available to us and rest of the players&lt;/li&gt;
&lt;li class=&quot;li6&quot;&gt;Google (&lt;a href=&quot;https://developers.google.com/maps/&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;s1&quot;&gt;https://developers.google.com/maps/&lt;/span&gt;&lt;/a&gt;) and ESRI (&lt;a href=&quot;http://www.esri.com/software/arcgis/developers&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;s4&quot;&gt;http://www.esri.com/software/arcgis/developers&lt;/span&gt;&lt;/a&gt;) mapping technologies to display the events in a&amp;nbsp;&lt;span class=&quot;s5&quot;&gt;geospatially-enabled format.&lt;/span&gt;&lt;/li&gt;
&lt;ul class=&quot;ul2&quot;&gt;
&lt;li class=&quot;li1&quot;&gt;Note: We also use Jackbe Presto (&lt;a href=&quot;http://www.jackbe.com/&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;s1&quot;&gt;http://www.jackbe.com/&lt;/span&gt;&lt;/a&gt;) platform to display the same events onto a different platform and demonstrate interoperability and ease of message ingestions.&lt;/li&gt;
&lt;/ul&gt;
&lt;li class=&quot;li1&quot;&gt;Data feeds from&amp;nbsp;SimTable (&lt;a href=&quot;http://www.simtable.com/&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;s1&quot;&gt;http://www.simtable.com/&lt;/span&gt;&lt;/a&gt;),&amp;nbsp;IBM, Red Cross, San Diego state&amp;nbsp;university, and Nokia.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
Thanks for everyone who organized this event. It&#39;s been a blast to participate as part of Terracotta team, and I&#39;m looking forward to participating in the next &quot;plugfest&quot; event!&amp;nbsp;&lt;/div&gt;</description><link>http://fsanglier.blogspot.com/2013/04/my-2013-afcea-san-diego-plugfest.html</link><author>noreply@blogger.com (Fabien Sanglier)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2976473844390099876.post-809950914443650798</guid><pubDate>Mon, 26 Nov 2012 18:48:00 +0000</pubDate><atom:updated>2013-07-01T09:40:46.064-04:00</atom:updated><title>Moving alui-related posts to its own archive...</title><description>ok this is it...I finally took the steps of migrating all the ALUI-specific posts to an &quot;archive&quot; blog: &lt;a href=&quot;http://fsanglier-alui.blogspot.com/&quot;&gt;fsanglier-alui.blogspot.com&lt;/a&gt;
that way, I can start fresh and share more of the exciting stuff (i think so at least) that I&#39;m doing these days: java, in-memory, and big-data technologies.</description><link>http://fsanglier.blogspot.com/2012/11/moving-alui-related-posts-to-its-own.html</link><author>noreply@blogger.com (Fabien Sanglier)</author><thr:total>3</thr:total></item></channel></rss>