Hazelcast has a Queue implementation. On 26 September 2016 at 22:21, Gary Gregory <garydgreg...@gmail.com> wrote:
> 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/jcac >> he/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 > -- Matt Sicker <boa...@gmail.com>