The IgniteCache looks richer than both the stock Cache and EhCache for sure: https://ignite.apache.org/releases/1.7.0/javadoc/org/apache/ignite/IgniteCache.html
I am not sure I like having to basically use a map with a AtomicLong sequence key I need to manage AND THEN sort the map keys when what I really want is a List or a Queue. I feels like I have to work extra hard for a simpler use case. What I want is a cache that behaves like a queue and not like a map. Using JMS is too heavy. So I am still considering a Collection Appender. Gary On Mon, Sep 26, 2016 at 7:55 PM, Ralph Goers <ralph.go...@dslextreme.com> wrote: > Ignite is a JSR 107 cache and has some benefits over ehcache. Ehcache > requires you set preferIPv4Stack to true for it to work. That might be a > problem for your client. > > Sent from my iPad > > On Sep 26, 2016, at 7:18 PM, Gary Gregory <garydgreg...@gmail.com> wrote: > > > On Mon, Sep 26, 2016 at 6:10 PM, Gary Gregory <garydgreg...@gmail.com> > wrote: > >> On Mon, Sep 26, 2016 at 6:09 PM, Gary Gregory <garydgreg...@gmail.com> >> wrote: >> >>> On Mon, Sep 26, 2016 at 5:21 PM, Ralph Goers <ralph.go...@dslextreme.com >>> > wrote: >>> >>>> I thought you didn’t want to write to a file? >>>> >>> >>> I do not but if the buffer is large enough, log events should stay in >>> RAM. But it is not quite right anyway because I'd have to interpret the >>> contents of the file to turn back into log events. >>> >>> I started reading up on the Chronicle appender; thank you Remko for >>> pointing it out. >>> >>> An appender to a cache of objects is really want I want since I also >>> want to be able to evict the cache. TBC... >>> >> >> Like a JSR-107 Appender... >> > > Looking at EHCache and https://ignite.apache.org/ > jcache/1.0.0/javadoc/javax/cache/Cache.html I can see that a cache is > always a kind of map, which leads to what the key should be. > > A sequence number like we have in the pattern layout seems like a natural > choice. I could see a Jsr107Appender that tracks a sequence number as the > key. The issue is that the JSR107 Cache interface defines the iterator > order as undefined which would force a client trying to drain a > Jsr107Appender to sort all entries before being able to serialize them. > Unless I can find a list-based Cache implementation within EhCache for > example. > > Gary > > > >> >> Gary >> >>> >>> Gary >>> >>> >>>> The Chronicle stuff Remko is linking to is also worth exploring. >>>> >>>> Ralph >>>> >>>> >>>> >>>> On Sep 26, 2016, at 5:04 PM, Gary Gregory <garydgreg...@gmail.com> >>>> wrote: >>>> >>>> oh... what about our own http://logging.apache.org/ >>>> log4j/2.x/manual/appenders.html#MemoryMappedFileAppender >>>> >>>> ? >>>> >>>> Gary >>>> >>>> On Mon, Sep 26, 2016 at 4:59 PM, Remko Popma <remko.po...@gmail.com> >>>> wrote: >>>> >>>>> In addition to the Flume based solution, here is another alternative >>>>> idea: use Peter Lawrey's Chronicle[1] library to store log events in a >>>>> memory mapped file. >>>>> >>>>> The appender can just keep adding events without worrying about >>>>> overflowing the memory. >>>>> >>>>> The client that reads from this file can be in a separate thread (even >>>>> a separate process by the way) and can read as much as it wants, and send >>>>> it to the server. >>>>> >>>>> Serialization: You can either serialize log events to the target >>>>> format before storing them in Chronicle (so you have binary blobs in each >>>>> Chronicle excerpt), client reads these blobs and sends them to the server >>>>> as is. Or you can use the Chronicle Log4j2 appender[2] to store the events >>>>> in Chronicle format. The tests[3] show how to read LogEvent objects from >>>>> the memory mapped file, and the client would be responsible for >>>>> serializing >>>>> these log events to the target format before sending data to the server. >>>>> >>>>> [1]: https://github.com/peter-lawrey/Java-Chronicle >>>>> [2]: https://github.com/OpenHFT/Chronicle-Logger >>>>> [3]: https://github.com/OpenHFT/Chronicle-Logger/blob/master >>>>> /logger-log4j-2/src/test/java/net/openhft/chronicle/logger/l >>>>> og4j2/Log4j2IndexedChronicleTest.java >>>>> >>>>> Remko >>>>> >>>>> Sent from my iPhone >>>>> >>>>> On 2016/09/27, at 5:57, Gary Gregory <garydgreg...@gmail.com> wrote: >>>>> >>>>> Please allow me to restate the use case I have for the >>>>> CollectionAppender, which is separate from any Flume-based or Syslog-based >>>>> solution, use cases I also have. Well, I have a Syslog use case, and >>>>> whether or not Flume is in the picture will really be a larger discussion >>>>> in my organization due to the requirement to run a Flume Agent.) >>>>> >>>>> A program (like a JDBC driver already using Log4j) communicates with >>>>> another (like a DBMS, not written in Java). The client and server >>>>> communicate over a proprietary socket protocol. The client sends a list of >>>>> buffers (in one go) to the server to perform one or more operations. One >>>>> kind of buffer this protocol defines is a log buffer (where each log event >>>>> is serialized in a non-Java format.) This allows each communication from >>>>> the client to the server to say "This is what's happened up to now". What >>>>> the server does with the log buffers is not important for this discussion. >>>>> >>>>> What is important to note is that the log buffer and other buffers go >>>>> to the server in one BLOB; which is why I cannot (in this use case) send >>>>> log events by themselves anywhere. >>>>> >>>>> I see that something (a CollectionAppender) must collect log events >>>>> until the client is ready to serialize them and send them to the server. >>>>> Once the events are drained out of the Appender (in one go by just getting >>>>> the collection), events can collect in a new collection. A synchronous >>>>> drain operation would create a new collection and return the old one. >>>>> >>>>> The question becomes: What kind of temporary location can the client >>>>> use to buffer log event until drain time? A Log4j Appender is a natural >>>>> place to collect log events since the driver uses Log4j. The driver will >>>>> make its business to drain the appender and work with the events at the >>>>> right time. I am thinking that the Log4j Appender part is generic enough >>>>> for inclusion in Log4j. >>>>> >>>>> Further thoughts? >>>>> >>>>> Thank you all for reading this far! >>>>> Gary >>>>> >>>>> On Sun, Sep 25, 2016 at 1:20 PM, Ralph Goers < >>>>> ralph.go...@dslextreme.com> wrote: >>>>> >>>>>> I guess I am not understanding your use case quite correctly. I am >>>>>> thinking you have a driver that is logging and you want those logs >>>>>> delivered to some other location to actually be written. If that is your >>>>>> use case then the driver needs a log4j2.xml that configures the >>>>>> FlumeAppender with either the memory or file channel (depending on your >>>>>> needs) and points to the server(s) that is/are to receive the events. The >>>>>> FlumeAppender handles sending them in batches with whatever size you want >>>>>> (but will send them in smaller amounts if they are in the channel too >>>>>> long). Of course you would need the log4j-flume and flume jars. So on the >>>>>> driver side you wouldn’t need to write anything, just configure the >>>>>> appender and make sure the jars are there. >>>>>> >>>>>> For the server that receives them you would also need Flume. Normally >>>>>> this would be a standalone component, but it really wouldn’t be hard to >>>>>> incorporate it into some other application. The only thing you would have >>>>>> to write would be the sink that writes the events to the database or >>>>>> whatever. To incorporate it into an application you would have to look at >>>>>> the main() method of flume and covert that to be a thread that you kick >>>>>> off. >>>>>> >>>>>> Ralph >>>>>> >>>>>> >>>>>> >>>>>> On Sep 25, 2016, at 12:01 PM, Gary Gregory <garydgreg...@gmail.com> >>>>>> wrote: >>>>>> >>>>>> Hi Ralph, >>>>>> >>>>>> Thanks for your feedback. Flume is great in the scenarios that do not >>>>>> involve sending a log buffer from the driver itself. >>>>>> >>>>>> I can't require a Flume Agent to be running 'on the side' for the use >>>>>> case where the driver chains a log buffer at the end of the train of >>>>>> database IO buffer. For completeness talking about this Flume scenario, >>>>>> if >>>>>> I read you right, I also would need to write a custom Flume sink, which >>>>>> would also be in memory, until the driver is ready to drain it. Or, I >>>>>> could >>>>>> query some other 'safe' and 'reliable' Flume sink that the driver could >>>>>> then drain of events when it needs to. >>>>>> >>>>>> Narrowing down on the use case where the driver chains a log buffer >>>>>> at the end of the train of database IO buffer, I'll think I have to see >>>>>> about converting the Log4j ListAppender into a more robust and flexible >>>>>> version. I think I'll call it a CollectionAppender and allow various >>>>>> Collection implementations to be plugged in. >>>>>> >>>>>> Gary >>>>>> >>>>>> Gary >>>>>> >>>>>> On Sat, Sep 24, 2016 at 3:44 PM, Ralph Goers < >>>>>> ralph.go...@dslextreme.com> wrote: >>>>>> >>>>>>> If you are buffering events in memory you run the risk of losing >>>>>>> events if something should fail. >>>>>>> >>>>>>> That said, if I had your requirements I would use the FlumeAppender. >>>>>>> It has either an in-memory option to buffer as you are suggesting or it >>>>>>> can >>>>>>> write to a local file to prevent data loss if that is a requirement. It >>>>>>> already has the configuration options you are looking for and has been >>>>>>> well >>>>>>> tested. The only downside is that you need to have either a Flume >>>>>>> instance >>>>>>> receiving the messages are something that can receive Flume events over >>>>>>> Avro, but it is easier just to use Flume and write a custom sink to do >>>>>>> what >>>>>>> you want with the data. >>>>>>> >>>>>>> Ralph >>>>>>> >>>>>>> On Sep 24, 2016, at 3:13 PM, Gary Gregory <garydgreg...@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>> Hi All, >>>>>>> >>>>>>> I can't believe it, but through a convoluted use-case, I actually >>>>>>> need an in-memory list appender, very much like our test-only >>>>>>> ListAppender. >>>>>>> >>>>>>> The requirement is as follows. >>>>>>> >>>>>>> We have a JDBC driver and matching proprietary database that >>>>>>> specializes in data virtualization of mainframe resources like DB2, >>>>>>> VSAM, >>>>>>> IMS, and all sorts of non-SQL data sources ( >>>>>>> http://www.rocketsoftware.com/products/rocket-data/rocket-d >>>>>>> ata-virtualization) >>>>>>> >>>>>>> The high level requirement is to merge the driver log into the >>>>>>> server's log for full-end to end tractability and debugging. >>>>>>> >>>>>>> When the driver is running on the z/OS mainframe, it can be >>>>>>> configured with a z/OS specific Appender that can talk to the server log >>>>>>> module directly. >>>>>>> >>>>>>> When the driver is running elsewhere, it can talk to the database >>>>>>> via a Syslog socket Appender. This requires more set up on the server >>>>>>> side >>>>>>> and for the server to do special magic to know how the incoming log >>>>>>> events >>>>>>> match up with server operations. Tricky. >>>>>>> >>>>>>> The customer should also be able to configure the driver such that >>>>>>> anytime the driver communicates to the database, it sends along whatever >>>>>>> log events have accumulated since the last client-server roundtrip. This >>>>>>> allows the server to match exactly the connection and operations the >>>>>>> client >>>>>>> performed with the server's own logging. >>>>>>> >>>>>>> In order to do that I need to buffer all log events in an Appender >>>>>>> and when it's time, I need to get the list of events and reset the >>>>>>> appender >>>>>>> to a new empty list so events can keep accumulating. >>>>>>> >>>>>>> My proposal is to either turn our ListAppender into such an >>>>>>> appender. For sanity, the appender could be configured with various >>>>>>> sizing >>>>>>> policies: >>>>>>> >>>>>>> - open: the list grows unbounded >>>>>>> - closed: the list grows to a given size and _new_ events are >>>>>>> dropped on the floor beyond that >>>>>>> - latest: the list grows to a given size and _old_ events are >>>>>>> dropped on the floor beyond that >>>>>>> >>>>>>> Thoughts? >>>>>>> >>>>>>> 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 >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> 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 >>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> 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 >>>>> >>>>> >>>> >>>> >>>> -- >>>> 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 >>>> >>>> >>>> >>> >>> >>> -- >>> 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 >>> >> >> >> >> -- >> 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 >> > > > > -- > 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 > > -- 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