https://github.com/d-led/persistent_observable_experiment
Durable queues as IObservables experiment for fun
https://github.com/d-led/persistent_observable_experiment
Last synced: 3 months ago
JSON representation
Durable queues as IObservables experiment for fun
- Host: GitHub
- URL: https://github.com/d-led/persistent_observable_experiment
- Owner: d-led
- License: mpl-2.0
- Created: 2016-09-02T20:40:26.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2024-05-10T17:11:15.000Z (about 2 years ago)
- Last Synced: 2025-01-21T21:22:18.860Z (over 1 year ago)
- Language: C#
- Size: 33.2 KB
- Stars: 3
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Durable queues as IObservables experiment for fun
[](https://ci.appveyor.com/project/d-led/persistent-observable-experiment/branch/master)
## Queue to IObservable
```c#
// create a queue
using (var queue = new PersistentQueueWrapper("q1")) {
queue.Enqueue(new WorkItem { WorkId = DateTime.Now.ToFileTimeUtc() });
}
// and lose it
// reopen the durable queue
using (var queue = new PersistentQueueWrapper("q1")) {
// enqueue
queue.Enqueue(new WorkItem { WorkId = DateTime.Now.ToFileTimeUtc() });
// dequeue until timed out
queue
.ToObservableItems(
sleep_for: TimeSpan.FromSeconds(0.3),
max_wait: TimeSpan.FromSeconds(1)
)
.Subscribe(
x => Console.WriteLine($"{x.WorkId}"),
e => Console.Error.WriteLine(e),
() => Console.WriteLine("No more items")
);
}
```
↓
```text
131473231919577487
131473231921304305
No more items
```
## Making IObservable durable
```c#
// post some items
using (var queue = new PersistentQueueWrapper("q1"))
{
Observable
.Range(0, 2)
.Select(_ => NewWorkItem())
.Persistent(queue, TimeSpan.FromMilliseconds(0));
}
// post some more items and observe the previously enqueued ones
using (var queue = new PersistentQueueWrapper("q1"))
{
Observable
.Interval(TimeSpan.FromSeconds(1))
.Take(3)
.Select(_ => NewWorkItem())
.Persistent(queue, TimeSpan.FromMilliseconds(100))
.Subscribe(item => Console.WriteLine(item.WorkId))
;
}
```
## Using
* [DiskQueue](https://github.com/i-e-b/DiskQueue) for persistent queue
* [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) for serialization
later, using [sharpqueue](https://github.com/sharptools/sharpqueue)
## Ideas
* Hide the queue lifetime from the observables
* Use another queue as example