ThreadLocals containing JDK classes (StringBuilder, etc) are not a problem. Their classloader is the system classloader, not the web app classloader, so these ThreadLocals do not have a reference to the web app classes and do not prevent web app classes from being garbage collected.
This idiom is safe: class SafeClass { // The type of this field is java.lang.ThreadLocal, and // both the key (ThreadLocal) and the value (StringBuilder) are JDK classes. // This idiom is safe and will not cause memory leaks in web apps. static ThreadLocal<StringBuilder> safe = new ThreadLocal<StringBuilder>(); private StringBuilder getThreadLocalStringBuilder() { StringBuilder value = safe.get(); if (value == null) { value = new StringBuilder(1024); safe.set(value); } return value; } } However, as soon as we create an anonymous subclass like below we cause memory leaks again: class MemoryLeakingClass { // The type of this field is MemoryLeakingClass$1, an anonymous subclass of java.lang.ThreadLocal! // In a web app, the classloader of this class is the web app class loader: may cause memory leak... static ThreadLocal<StringBuilder> anonymousSubclass = new ThreadLocal<StringBuilder>() { @Override protected StringBuilder initialValue() { return new StringBuilder(1024); } }; } On Wed, Mar 9, 2016 at 11:32 AM, Ralph Goers <ralph.go...@dslextreme.com> wrote: > I still am unclear as to why you are thinking GC-free mode won’t work in > web apps. What is the issue with ThreadLocals that causes the problem? We > are using ThreadLocals for other things that seem to be working. > > Ralph > > On Mar 8, 2016, at 3:05 PM, Remko Popma <remko.po...@gmail.com> wrote: > > Some of the recent changes were to fix issues introduced by the reusable > message idea. It is good that we are not rushing this release, and thanks > everyone for your patience. > > I originally wanted to make GC-free mode the default to begin with, but it > may be smart to initially require that users switch GC-free mode on > explicitly, and only make it the default after it has gained a track > record. (Even so, it would only be switched on automatically for non-web > apps.) > > The async logger performance investigation is still ongoing. I hope to be > able to resolve it and do the GC-free write-up including performance test > results in the next few weeks. I am currently on a business trip, working > with people creating low latency trading systems, and they have good ideas > on how to investigate the performance regression, so that is helpful. > > On Wed, Mar 9, 2016 at 4:01 AM, Gary Gregory <garydgreg...@gmail.com> > wrote: > >> I'm even more concerned now that more of the no-GC changes are coming in, >> still, fast and furious. >> >> I see what smells like a lot of non-OO code fly by here and there: lots >> if-else-if-else-if-else, as opposed to subclassing or delegation if >> appropriate. >> >> Are we rushing toward this no-GC goal without considering speed >> performance? >> >> Where are we on the async logger slow down investigation? >> >> Concerned and glad to see to much activity all at the same time, >> Gary >> >> On Thu, Mar 3, 2016 at 1:23 PM, Matt Sicker <boa...@gmail.com> wrote: >> >>> Remko (and anyone else who wants to try and solve this regression): >>> >>> https://www.jclarity.com/product/censum-free-trial/ >>> >>> Go ahead and get the trial and the guys at JClarity will give us >>> licenses. I'd use your apache.org email to be safe. >>> >>> On 3 March 2016 at 11:27, Matt Sicker <boa...@gmail.com> wrote: >>> >>>> So far, Remko's proposal is language-neutral since he defined >>>> endianness (big endian like java, but we could use either since ByteBuffer >>>> supports both) and field widths.. >>>> >>>> On 3 March 2016 at 03:15, Mikael Ståldal <mikael.stal...@magine.com> >>>> wrote: >>>> >>>>> If we are to design a new binary log event format, then I think that >>>>> we should make sure that it is not Java / JVM specific, and that it will >>>>> be >>>>> reasonably easy to implement reading and writing of it on other platforms. >>>>> >>>>> On Thu, Mar 3, 2016 at 5:14 AM, Remko Popma <remko.po...@gmail.com> >>>>> wrote: >>>>> >>>>>> I created https://issues.apache.org/jira/browse/LOG4J2-1305 as a >>>>>> write up of my current thinking on the topic and a place to discuss >>>>>> ideas. >>>>>> Still need to add some things we discussed here (tools, endianness, >>>>>> versioning etc). >>>>>> >>>>>> It's a fascinating topic but I still have a lot of work to do on the >>>>>> GC-free epic before I can start working on this one. >>>>>> >>>>>> >>>>>> On Thursday, 3 March 2016, Remko Popma <remko.po...@gmail.com> wrote: >>>>>> >>>>>>> Not Java Serialization, I was thinking simple ByteBuffer.putLong, >>>>>>> putInt, putBytes. This is much more performant ( >>>>>>> http://mechanical-sympathy.blogspot.jp/2012/07/native-cc-like-performance-for-java.html). >>>>>>> SBE (Simple Binary Encoding) seems overkill, but open to other opinions. >>>>>>> >>>>>>> The less conditional logic in there the better, so I'm not that >>>>>>> interested in configurability. All log event fields, >>>>>>> ok. ThreadContextMap/Stack keys and values: similarly to other repeating >>>>>>> strings like logger names: write to separate mapping file & only write >>>>>>> int >>>>>>> values (for count as well as key/value indices) to the "main" log file. >>>>>>> >>>>>>> Two things we would need to decide is how to handle versioning, and >>>>>>> what Endianness to use. >>>>>>> >>>>>>> Version information (possibly with schema info) could be written to >>>>>>> the log file header. >>>>>>> >>>>>>> Endianness could also be written to the header, or we could simply >>>>>>> say we use network byte order (big endian). Intel chips use little >>>>>>> endian, >>>>>>> but apparently swapping is implemented with an intrinsic and is very >>>>>>> fast. >>>>>>> >>>>>>> On Thursday, 3 March 2016, Matt Sicker <boa...@gmail.com> wrote: >>>>>>> >>>>>>>> At that point, it would be nice if it were extensible. There are >>>>>>>> some neat binary formats we could use that would allow for that. >>>>>>>> >>>>>>>> On 2 March 2016 at 12:09, Gary Gregory <garydgreg...@gmail.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> I think we'd need to provide all LogEvent fields. >>>>>>>>> >>>>>>>>> Gary >>>>>>>>> >>>>>>>>> On Wed, Mar 2, 2016 at 9:13 AM, Remko Popma <remko.po...@gmail.com >>>>>>>>> > wrote: >>>>>>>>> >>>>>>>>>> That's what I meant, I didn't make myself clear. For example, we >>>>>>>>>> could offer a simple binary layout: >>>>>>>>>> time stamp (8 bytes) >>>>>>>>>> level int (4 bytes) >>>>>>>>>> thread ID (4 bytes) - Thread names in separate file >>>>>>>>>> Logger ID (4 bytes) - Logger names in separate file. >>>>>>>>>> message length (4 bytes) >>>>>>>>>> message type (2 bytes) >>>>>>>>>> message data (variable length) >>>>>>>>>> throwable length (4 bytes) >>>>>>>>>> throwable data (variable length) >>>>>>>>>> >>>>>>>>>> It's a very different approach to logging. On the plus side, this >>>>>>>>>> would be extremely compact and very fast to write. >>>>>>>>>> >>>>>>>>>> On the other hand it would require a separate tool to >>>>>>>>>> decode/display the data in human readable form. Such a tool should >>>>>>>>>> handle >>>>>>>>>> text messages out of the box, but for custom messages I image there >>>>>>>>>> could >>>>>>>>>> be some plugin mechanism for custom decoders. >>>>>>>>>> >>>>>>>>>> All very interesting... >>>>>>>>>> :-) >>>>>>>>>> >>>>>>>>>> Sent from my iPhone >>>>>>>>>> >>>>>>>>>> On 2016/03/03, at 0:01, Matt Sicker <boa...@gmail.com> wrote: >>>>>>>>>> >>>>>>>>>> That's what I thought at first, but he means non-human readable >>>>>>>>>> formats since we all use tools to parse logs as it is (Splunk and >>>>>>>>>> ELK are >>>>>>>>>> the big two I know of). >>>>>>>>>> >>>>>>>>>> On 2 March 2016 at 02:15, Remko Popma <remko.po...@gmail.com> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>>> Re: binary logging, I think he's talking about providing an API >>>>>>>>>>> to log objects directly into byte buffers without turning them into >>>>>>>>>>> Strings >>>>>>>>>>> first. >>>>>>>>>>> >>>>>>>>>>> https://issues.apache.org/jira/browse/LOG4J2-1274 and >>>>>>>>>>> https://issues.apache.org/jira/browse/LOG4J2-506 >>>>>>>>>>> >>>>>>>>>>> were created with that in mind and should be a good step in that >>>>>>>>>>> direction. >>>>>>>>>>> >>>>>>>>>>> Sent from my iPhone >>>>>>>>>>> >>>>>>>>>>> On 2016/03/02, at 15:11, Gary Gregory <garydgreg...@gmail.com> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>> Well, I've often wondered about creating a binary format but it >>>>>>>>>>> seems that you could use JSON+ZIP or BSON and get most of the >>>>>>>>>>> advantages. >>>>>>>>>>> >>>>>>>>>>> Gary >>>>>>>>>>> >>>>>>>>>>> On Tue, Mar 1, 2016 at 9:12 PM, Matt Sicker <boa...@gmail.com> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> One other interesting thing I learned is that improper use of >>>>>>>>>>>> logging is a huge source of performance problems. The GC-free >>>>>>>>>>>> parameterized >>>>>>>>>>>> message factory will help with one aspect of that (I suggested >>>>>>>>>>>> parameterized messages, but he countered with the Object[] that is >>>>>>>>>>>> created), and encouraging users to use a Supplier<String> instead >>>>>>>>>>>> of >>>>>>>>>>>> passing parameters should help as well (especially when those >>>>>>>>>>>> parameters >>>>>>>>>>>> have to be computed). He had some strong criticisms of logging APIs >>>>>>>>>>>> promoting bad practices which stems all the way back to log4j1 and >>>>>>>>>>>> affects >>>>>>>>>>>> pretty much every logging API in Java (some criticisms were >>>>>>>>>>>> actually >>>>>>>>>>>> outdated or didn't consider newer features of the API like markers >>>>>>>>>>>> and the >>>>>>>>>>>> huge amount of filters available). >>>>>>>>>>>> >>>>>>>>>>>> His other big idea was promoting the use of binary logging >>>>>>>>>>>> formats because humans rarely read the raw log files as it is, but >>>>>>>>>>>> it's not >>>>>>>>>>>> like there's a standard way to do that. >>>>>>>>>>>> >>>>>>>>>>>> Now I kinda wonder if he'll find this thread one day and tell >>>>>>>>>>>> me how I misinterpreted him or something. ;) >>>>>>>>>>>> >>>>>>>>>>>> On 1 March 2016 at 22:28, Matt Sicker <boa...@gmail.com> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Alright, I learned some interesting things. I'm going to get >>>>>>>>>>>>> us some tools we can use to try and profile this. Otherwise, he >>>>>>>>>>>>> did suggest >>>>>>>>>>>>> trying out this project: >>>>>>>>>>>>> https://github.com/RichardWarburton/honest-profiler >>>>>>>>>>>>> >>>>>>>>>>>>> On 1 March 2016 at 19:31, Matt Sicker <boa...@gmail.com> >>>>>>>>>>>>> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> So far he's said something about using lambdas for lazy >>>>>>>>>>>>>> evaluation (though I don't think that would actually help us at >>>>>>>>>>>>>> all). I'll >>>>>>>>>>>>>> try to talk to him one-on-one afterward to delve more into this. >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 1 March 2016 at 18:13, Ralph Goers < >>>>>>>>>>>>>> ralph.go...@dslextreme.com> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Actually, most of the tests have the commands in the >>>>>>>>>>>>>>> comments right in the class. Just cut and past. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Ralph >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On Mar 1, 2016, at 1:43 PM, Matt Sicker <boa...@gmail.com> >>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I can't even figure out how to execute the simple perf test >>>>>>>>>>>>>>> class. IntelliJ gives me some annotation processing error, and >>>>>>>>>>>>>>> doing it >>>>>>>>>>>>>>> from the command line is turning into a classpath nightmare to >>>>>>>>>>>>>>> figure out >>>>>>>>>>>>>>> what jars are needed to execute the test manually. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 1 March 2016 at 11:34, Gary Gregory < >>>>>>>>>>>>>>> garydgreg...@gmail.com> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Before the talk: Hi, I'm Remko, I help on Apache Log4j, are >>>>>>>>>>>>>>>> you available after the preso to talk about some issue we are >>>>>>>>>>>>>>>> seeing? >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Gary >>>>>>>>>>>>>>>> On Mar 1, 2016 8:29 AM, "Matt Sicker" <boa...@gmail.com> >>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I'm attending a JUG meetup tonight with Kirk Pepperdine >>>>>>>>>>>>>>>>> presenting. It's supposed to be a Java performance workshop >>>>>>>>>>>>>>>>> type of thing, >>>>>>>>>>>>>>>>> so if you've got a decent way to ask about it, I could see if >>>>>>>>>>>>>>>>> he can help >>>>>>>>>>>>>>>>> figure out this regression. I can at least show off the >>>>>>>>>>>>>>>>> SimplePerfTest and >>>>>>>>>>>>>>>>> any microbenchmarks we have. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On 28 February 2016 at 11:54, Matt Sicker < >>>>>>>>>>>>>>>>> boa...@gmail.com> wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Take a look at the git bisect command. Might help you >>>>>>>>>>>>>>>>>> find which changes caused the problem. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On Sunday, 28 February 2016, Gary Gregory < >>>>>>>>>>>>>>>>>> garydgreg...@gmail.com> wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Thank you for digging in Remko. This is will be a nice >>>>>>>>>>>>>>>>>>> theme to publicize when you get it figured out. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Gary >>>>>>>>>>>>>>>>>>> On Feb 28, 2016 4:08 AM, "Remko Popma" < >>>>>>>>>>>>>>>>>>> remko.po...@gmail.com> wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> After removing the potential impact of appenders and >>>>>>>>>>>>>>>>>>>> layouts by testing with >>>>>>>>>>>>>>>>>>>> log4j-core\src\test\resources\perf-CountingNoOpAppender.xml >>>>>>>>>>>>>>>>>>>> and >>>>>>>>>>>>>>>>>>>> org.apache.logging.log4j.core.async.perftest.SimplePerfTest, >>>>>>>>>>>>>>>>>>>> I've confirmed >>>>>>>>>>>>>>>>>>>> my initial numbers: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> 2.0: 7.5M ops/sec >>>>>>>>>>>>>>>>>>>> 2.1: 6M ops/sec >>>>>>>>>>>>>>>>>>>> 2.2: 6M ops/sec >>>>>>>>>>>>>>>>>>>> 2.3: 6M ops/sec >>>>>>>>>>>>>>>>>>>> 2.4: 4.5M ops/sec >>>>>>>>>>>>>>>>>>>> 2.5: 4M ops/sec >>>>>>>>>>>>>>>>>>>> 2.6: 2M ops/sec >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I tried reverting various changes made to AsyncLogger >>>>>>>>>>>>>>>>>>>> since 2.0, performance improves a little up to 4M ops/sec. >>>>>>>>>>>>>>>>>>>> However, when completely reverting AsyncLogger source >>>>>>>>>>>>>>>>>>>> to the 2.0 version, performance is back to 7.5M ops/sec. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I'll try starting from the 2.0 source and getting back >>>>>>>>>>>>>>>>>>>> to 2.6 functionality without losing performance... >>>>>>>>>>>>>>>>>>>> (Lengthy process...) >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> On Sat, Feb 27, 2016 at 12:18 PM, Remko Popma < >>>>>>>>>>>>>>>>>>>> remko.po...@gmail.com> wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> This is the PerfTestDriver test class (in >>>>>>>>>>>>>>>>>>>>> log4j-core/test, package ...async.perf). >>>>>>>>>>>>>>>>>>>>> Mainly perf3PlainNoLocation.xml: >>>>>>>>>>>>>>>>>>>>> RollingRandomAccessFileAppender, PatternLayout, all >>>>>>>>>>>>>>>>>>>>> loggers are AsyncLoggers, logging a simple string without >>>>>>>>>>>>>>>>>>>>> parameters. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Profiling with YourKit did not tell me anything >>>>>>>>>>>>>>>>>>>>> useful. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> I'm now eliminating the effect of Layouts/Appenders, >>>>>>>>>>>>>>>>>>>>> using CountingNoOpAppender, and seeing similar numbers. >>>>>>>>>>>>>>>>>>>>> So this seems to be >>>>>>>>>>>>>>>>>>>>> mostly an issue in AsyncLogger. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> I'll let you know when I find out more. >>>>>>>>>>>>>>>>>>>>> There's a lot of trial and error here, so this may >>>>>>>>>>>>>>>>>>>>> take a while... >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Remko >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Sent from my iPhone >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> On 2016/02/26, at 21:02, Mikael Ståldal < >>>>>>>>>>>>>>>>>>>>> mikael.stal...@magine.com> wrote: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Which components (appenders, layouts) are involved in >>>>>>>>>>>>>>>>>>>>> the tests? Would it be possible to do some profiling to >>>>>>>>>>>>>>>>>>>>> see if there is any >>>>>>>>>>>>>>>>>>>>> particular component which is to blame? >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> On Fri, Feb 26, 2016 at 12:51 PM, Remko Popma < >>>>>>>>>>>>>>>>>>>>> remko.po...@gmail.com> wrote: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> To give you some rough impression on concrete numbers >>>>>>>>>>>>>>>>>>>>>> for this trend: >>>>>>>>>>>>>>>>>>>>>> 2.0: ~6M ops/sec >>>>>>>>>>>>>>>>>>>>>> 2.1-2.2: ~5M ops/sec >>>>>>>>>>>>>>>>>>>>>> 2.3-2.4: ~3-4M ops/sec >>>>>>>>>>>>>>>>>>>>>> 2.5: ~3M ops/sec >>>>>>>>>>>>>>>>>>>>>> 2.6: ~2M ops/sec >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> On Friday, 26 February 2016, Remko Popma < >>>>>>>>>>>>>>>>>>>>>> remko.po...@gmail.com> wrote: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> You're absolutely right. I still have quite a few >>>>>>>>>>>>>>>>>>>>>>> unit tests to add. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Initial perf testing shows a downward trend in Async >>>>>>>>>>>>>>>>>>>>>>> Logger performance with every release. (Logging simple >>>>>>>>>>>>>>>>>>>>>>> string messages without params.) This is worrisome and >>>>>>>>>>>>>>>>>>>>>>> I'm focusing on >>>>>>>>>>>>>>>>>>>>>>> figuring that out first: this will likely involve >>>>>>>>>>>>>>>>>>>>>>> additional code changes >>>>>>>>>>>>>>>>>>>>>>> and I'll add more tests after that. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Sent from my iPhone >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> On 2016/02/26, at 10:38, Gary Gregory < >>>>>>>>>>>>>>>>>>>>>>> garydgreg...@gmail.com> wrote: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Wow, I love the activity we are seeing toward 2.6! >>>>>>>>>>>>>>>>>>>>>>> All the perf work on top of an existing sizable change >>>>>>>>>>>>>>>>>>>>>>> set. Very exciting >>>>>>>>>>>>>>>>>>>>>>> indeed. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> There sure are a lot of changes coming in. I hope >>>>>>>>>>>>>>>>>>>>>>> that we all can pitch in to make sure most if not all >>>>>>>>>>>>>>>>>>>>>>> of these changes get >>>>>>>>>>>>>>>>>>>>>>> code coverage from unit tests. I've not checked >>>>>>>>>>>>>>>>>>>>>>> closely, but it seems like >>>>>>>>>>>>>>>>>>>>>>> we may not have good coverage _yet_, or do I have the >>>>>>>>>>>>>>>>>>>>>>> wrong impression? >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> I want to make sure we keep our stability in tip top >>>>>>>>>>>>>>>>>>>>>>> shape :-) and that we have no regression from previous >>>>>>>>>>>>>>>>>>>>>>> releases. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Gary >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Java Persistence with Hibernate, Second Edition >>>>>>>>>>>>>>>>>>>>>>> <http://www.manning.com/bauer3/> >>>>>>>>>>>>>>>>>>>>>>> JUnit in Action, Second Edition >>>>>>>>>>>>>>>>>>>>>>> <http://www.manning.com/tahchiev/> >>>>>>>>>>>>>>>>>>>>>>> Spring Batch in Action >>>>>>>>>>>>>>>>>>>>>>> <http://www.manning.com/templier/> >>>>>>>>>>>>>>>>>>>>>>> Blog: http://garygregory.wordpress.com >>>>>>>>>>>>>>>>>>>>>>> Home: http://garygregory.com/ >>>>>>>>>>>>>>>>>>>>>>> Tweet! http://twitter.com/GaryGregory >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>> [image: MagineTV] >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> *Mikael Ståldal* >>>>>>>>>>>>>>>>>>>>> Senior software developer >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> *Magine TV* >>>>>>>>>>>>>>>>>>>>> mikael.stal...@magine.com >>>>>>>>>>>>>>>>>>>>> Grev Turegatan 3 | 114 46 Stockholm, Sweden | >>>>>>>>>>>>>>>>>>>>> www.magine.com >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Privileged and/or Confidential Information may be >>>>>>>>>>>>>>>>>>>>> contained in this message. If you are not the addressee >>>>>>>>>>>>>>>>>>>>> indicated in this >>>>>>>>>>>>>>>>>>>>> message >>>>>>>>>>>>>>>>>>>>> (or responsible for delivery of the message to such a >>>>>>>>>>>>>>>>>>>>> person), you may not copy or deliver this message to >>>>>>>>>>>>>>>>>>>>> anyone. In such case, >>>>>>>>>>>>>>>>>>>>> you should destroy this message and kindly notify the >>>>>>>>>>>>>>>>>>>>> sender by reply email. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>>>>>>>> Java Persistence with Hibernate, Second Edition >>>>>>>>>>> <http://www.manning.com/bauer3/> >>>>>>>>>>> JUnit in Action, Second Edition >>>>>>>>>>> <http://www.manning.com/tahchiev/> >>>>>>>>>>> Spring Batch in Action <http://www.manning.com/templier/> >>>>>>>>>>> Blog: http://garygregory.wordpress.com >>>>>>>>>>> Home: http://garygregory.com/ >>>>>>>>>>> Tweet! http://twitter.com/GaryGregory >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >>>>>>>>> Java Persistence with Hibernate, Second Edition >>>>>>>>> <http://www.manning.com/bauer3/> >>>>>>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >>>>>>>>> Spring Batch in Action <http://www.manning.com/templier/> >>>>>>>>> Blog: http://garygregory.wordpress.com >>>>>>>>> Home: http://garygregory.com/ >>>>>>>>> Tweet! http://twitter.com/GaryGregory >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Matt Sicker <boa...@gmail.com> >>>>>>>> >>>>>>> >>>>> >>>>> >>>>> -- >>>>> [image: MagineTV] >>>>> >>>>> *Mikael Ståldal* >>>>> Senior software developer >>>>> >>>>> *Magine TV* >>>>> mikael.stal...@magine.com >>>>> Grev Turegatan 3 | 114 46 Stockholm, Sweden | www.magine.com >>>>> >>>>> Privileged and/or Confidential Information may be contained in this >>>>> message. If you are not the addressee indicated in this message >>>>> (or responsible for delivery of the message to such a person), you may >>>>> not copy or deliver this message to anyone. In such case, >>>>> you should destroy this message and kindly notify the sender by reply >>>>> email. >>>>> >>>> >>>> >>>> >>>> -- >>>> Matt Sicker <boa...@gmail.com> >>>> >>> >>> >>> >>> -- >>> Matt Sicker <boa...@gmail.com> >>> >> >> >> >> -- >> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >> Java Persistence with Hibernate, Second Edition >> <http://www.manning.com/bauer3/> >> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >> Spring Batch in Action <http://www.manning.com/templier/> >> Blog: http://garygregory.wordpress.com >> Home: http://garygregory.com/ >> Tweet! http://twitter.com/GaryGregory >> > > >