Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chronice-queue performance on win os seems very slow. #96

Closed
bwzhang2011 opened this issue Nov 3, 2014 · 9 comments
Closed

chronice-queue performance on win os seems very slow. #96

bwzhang2011 opened this issue Nov 3, 2014 · 9 comments

Comments

@bwzhang2011
Copy link

Hi,peter. while I try to use the persistQueue with reactor(https://github.com/reactor/reactor) integration with chronice-queue (just pay some time to look at the class IndexedChronicleQueuePersistor which located in reactor.queue package). I made some simple wrapper class for testing and the performance is very slow in win os. just like

import java.io.IOException;

import net.openhft.chronicle.ChronicleConfig;
import reactor.io.Buffer;
import reactor.io.encoding.Codec;
import reactor.io.encoding.kryo.KryoCodec;
import reactor.queue.IndexedChronicleQueuePersistor;
import reactor.queue.PersistentQueue;
import reactor.queue.QueuePersistor;

import com.zjht.channel.component.util.string.RandomHelper;
import com.zjht.channel.spi.msg.transfer.ChannelTransferMsg;
import com.zjht.channel.spi.util.FilePathHelper;

public class TestPersistQueue {

public static void main(String[] args) throws Exception {
    PersistentQueue<ChannelTransferMsg> transferQueue = new PersistentQueue<ChannelTransferMsg>(getTransferMsgPersitor());

    System.out.println("before poll1 queue===" + transferQueue.isEmpty());

    long t1 = System.currentTimeMillis();

    for (int i = 0; i < 1000; i++) {
        transferQueue.offer(ChannelTransferMsg.createTransferMsg(RandomHelper.randomNumeric().getBytes()));
    }

    long t2 = System.currentTimeMillis();

    while (!transferQueue.isEmpty()) {
        ChannelTransferMsg transferMsg = transferQueue.poll();

        System.out.println("1===" + transferMsg.toString());
    }

    long t3 = System.currentTimeMillis();

    System.out.println("offer cost==={" + (t2 - t1) + "}ms,poll cost==={" + (t3 - t2) + "}ms");

    System.out.println("after poll1 queue===" + transferQueue.isEmpty());

    while (!transferQueue.isEmpty()) {
        ChannelTransferMsg transferMsg = transferQueue.poll();

        System.out.println("2========" + transferMsg.toString());
    }

    System.out.println("after poll2 queue===" + transferQueue.isEmpty());
}

private static QueuePersistor<ChannelTransferMsg> getTransferMsgPersitor() throws IOException {
    String basePath = FilePathHelper.getUserDirPath() + "/" + "persist";

    System.out.println("basePath===" + basePath);

    IndexedChronicleQueuePersistor<ChannelTransferMsg> indexChronicePersistor = new IndexedChronicleQueuePersistor<ChannelTransferMsg>(
            basePath, getReactorCodec(), false, true, ChronicleConfig.DEFAULT.clone());

    return indexChronicePersistor;
}

private static Codec<Buffer, ChannelTransferMsg, ChannelTransferMsg> getReactorCodec() {
    return new KryoCodec<ChannelTransferMsg, ChannelTransferMsg>();
}

}

here comes the test result in my notebook(windows xp 32bit and JDK1.7.0_65):
offer cost==={312}ms,poll cost==={109}ms
after poll1 queue===true
after poll2 queue===true

so would you mind sparing sometime to locate where my problem for I did think the performance should not reduce so heavily if compared with in-memory way.

@peter-lawrey
Copy link
Member

I am not so familiar with the reactor library but will look into it
tomorrow.

Can you provide a complete example as the reactor configuration doesn't
mean much to me. With chronicle queue alone you should be able to get one
million messages in a fraction a second even on windows. (Depending on the
message size)

Note: we don't support win xp for free (as Microsoft doesn't) but will make
sure it works ok on other versions of windows and it might be ok on win xp.

Note2: Microsoft are withdrawing sale of versions before windows 8.1 and in
fact we don't have anything before this version.
On 03/11/2014 9:45 PM, "bwzhang2012" notifications@github.com wrote:

Hi,peter. while I try to use the persistQueue with reactor(
https://github.com/reactor/reactor) integration with chronice-queue (just
pay some time to look at the class IndexedChronicleQueuePersistor which
located in reactor.queue package). I made some simple wrapper class for
testing and the performance is very slow in win os. just like

import java.io.IOException;

import net.openhft.chronicle.ChronicleConfig;
import reactor.io.Buffer;
import reactor.io.encoding.Codec;
import reactor.io.encoding.kryo.KryoCodec;
import reactor.queue.IndexedChronicleQueuePersistor;
import reactor.queue.PersistentQueue;
import reactor.queue.QueuePersistor;

import com.zjht.channel.component.util.string.RandomHelper;
import com.zjht.channel.spi.msg.transfer.ChannelTransferMsg;
import com.zjht.channel.spi.util.FilePathHelper;

public class TestPersistQueue {

public static void main(String[] args) throws Exception {
PersistentQueue transferQueue = new PersistentQueue(getTransferMsgPersitor());

System.out.println("before poll1 queue===" + transferQueue.isEmpty());

long t1 = System.currentTimeMillis();

for (int i = 0; i < 1000; i++) {
    transferQueue.offer(ChannelTransferMsg.createTransferMsg(RandomHelper.randomNumeric().getBytes()));
}

long t2 = System.currentTimeMillis();

while (!transferQueue.isEmpty()) {
    ChannelTransferMsg transferMsg = transferQueue.poll();

    System.out.println("1===" + transferMsg.toString());
}

long t3 = System.currentTimeMillis();

System.out.println("offer cost==={" + (t2 - t1) + "}ms,poll cost==={" + (t3 - t2) + "}ms");

System.out.println("after poll1 queue===" + transferQueue.isEmpty());

while (!transferQueue.isEmpty()) {
    ChannelTransferMsg transferMsg = transferQueue.poll();

    System.out.println("2========" + transferMsg.toString());
}

System.out.println("after poll2 queue===" + transferQueue.isEmpty());

}

private static QueuePersistor getTransferMsgPersitor() throws IOException {
String basePath = FilePathHelper.getUserDirPath() + "/" + "persist";

System.out.println("basePath===" + basePath);

IndexedChronicleQueuePersistor<ChannelTransferMsg> indexChronicePersistor = new IndexedChronicleQueuePersistor<ChannelTransferMsg>(
        basePath, getReactorCodec(), false, true, ChronicleConfig.DEFAULT.clone());

return indexChronicePersistor;

}

private static Codec<Buffer, ChannelTransferMsg, ChannelTransferMsg> getReactorCodec() {
return new KryoCodec<ChannelTransferMsg, ChannelTransferMsg>();
}

}

here comes the test result in my notebook(windows xp 32bit and
JDK1.7.0_65):
offer cost==={312}ms,poll cost==={109}ms
after poll1 queue===true
after poll2 queue===true

so would you mind sparing sometime to locate where my problem for I did
think the performance should not reduce so heavily if compared with
in-memory way.


Reply to this email directly or view it on GitHub
#96.

@bwzhang2011
Copy link
Author

thanks for feed back. by the way, the configuration for reactor is the default one which is packaged in the jar like this:

A thread pool executor dispatcher, named threadPoolExecutor

reactor.dispatchers.threadPoolExecutor.type = threadPoolExecutor
reactor.dispatchers.threadPoolExecutor.size = 0

Backlog is how many Task objects to warm up internally

reactor.dispatchers.threadPoolExecutor.backlog = 2048

An event loop dispatcher, named eventLoop

reactor.dispatchers.ringBufferGroup.type = ringBufferGroup
reactor.dispatchers.ringBufferGroup.size = 0
reactor.dispatchers.ringBufferGroup.backlog = 2048

A ring buffer dispatcher, named ringBuffer

reactor.dispatchers.ringBuffer.type = ringBuffer
reactor.dispatchers.ringBuffer.backlog = 8192

A work queue dispatcher, named workQueue

reactor.dispatchers.workQueue.type = workQueue
reactor.dispatchers.workQueue.size = 0
reactor.dispatchers.workQueue.backlog = 2048

The dispatcher named ringBuffer should be the default dispatcher

reactor.dispatchers.default = ringBuffer

If windows support is not supported as well for free I would switch to linux for testing. for it actually performed very slow I didn't know why.

@peter-lawrey
Copy link
Member

Thank you for the break down. Nothing particularly odd here.

Are you able to produce a self contained test I could run so I can see if I
can work out what the problem is?

On 4 November 2014 05:21, bwzhang2012 notifications@github.com wrote:

thanks for feed back. by the way, the configuration for reactor is the
default one which is packaged in the jar like this:
A thread pool executor dispatcher, named threadPoolExecutor

reactor.dispatchers.threadPoolExecutor.type = threadPoolExecutor
reactor.dispatchers.threadPoolExecutor.size = 0
Backlog is how many Task objects to warm up internally

reactor.dispatchers.threadPoolExecutor.backlog = 2048
An event loop dispatcher, named eventLoop

reactor.dispatchers.ringBufferGroup.type = ringBufferGroup
reactor.dispatchers.ringBufferGroup.size = 0
reactor.dispatchers.ringBufferGroup.backlog = 2048
A ring buffer dispatcher, named ringBuffer

reactor.dispatchers.ringBuffer.type = ringBuffer
reactor.dispatchers.ringBuffer.backlog = 8192
A work queue dispatcher, named workQueue

reactor.dispatchers.workQueue.type = workQueue
reactor.dispatchers.workQueue.size = 0
reactor.dispatchers.workQueue.backlog = 2048
The dispatcher named ringBuffer should be the default dispatcher

reactor.dispatchers.default = ringBuffer

If windows support is not supported as well for free I would switch to
linux for testing. for it actually performed very slow I didn't know why.


Reply to this email directly or view it on GitHub
#96 (comment)
.

@bwzhang2011
Copy link
Author

sure. but you should find the dependency to run

import net.openhft.chronicle.ChronicleConfig;
import reactor.io.Buffer;
import reactor.io.encoding.Codec;
import reactor.io.encoding.kryo.KryoCodec;
import reactor.queue.IndexedChronicleQueuePersistor;
import reactor.queue.PersistentQueue;
import reactor.queue.QueuePersistor;

public class TestPersistQueue {

public static class Person implements java.io.Serializable {
    private static final long serialVersionUID = 1L;

    private String name;

    private String address;

    private byte[] info;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public byte[] getInfo() {
        return info;
    }

    public void setInfo(byte[] info) {
        this.info = info;
    }

    @Override
    public String toString() {
        return this.address + " " + this.name;
    }
}

public static void main(String[] args) throws Exception {
    PersistentQueue<Person> transferQueue = new PersistentQueue<Person>(getTransferMsgPersitor());

    System.out.println("before poll1 queue===" + transferQueue.isEmpty());

    long t1 = System.currentTimeMillis();

    Person person = null;
    for (int i = 0; i < 1000; i++) {
        person = getPerson(i);
        transferQueue.offer(person);
    }

    long t2 = System.currentTimeMillis();

    while (!transferQueue.isEmpty()) {
        Person _person = transferQueue.poll();

        System.out.println("1===" + _person.toString());
    }

    long t3 = System.currentTimeMillis();

    System.out.println("offer cost==={" + (t2 - t1) + "}ms,poll cost==={" + (t3 - t2) + "}ms");

    System.out.println("after poll1 queue===" + transferQueue.isEmpty());

    while (!transferQueue.isEmpty()) {
        Person _person = transferQueue.poll();

        System.out.println("2========" + _person.toString());
    }

    System.out.println("after poll2 queue===" + transferQueue.isEmpty());
}

private static Person getPerson(int i) {
    Person person = new Person();

    person.setAddress("address:" + i);

    person.setName("name:" + i);

    person.setInfo(String.valueOf(System.currentTimeMillis()).getBytes());

    return person;
}

private static QueuePersistor<Person> getTransferMsgPersitor() throws IOException {
    String basePath = System.getProperty("user.home") + "/" + "persist";

    System.out.println("basePath===" + basePath);

    IndexedChronicleQueuePersistor<Person> indexChronicePersistor = new IndexedChronicleQueuePersistor<Person>(basePath,
            getReactorCodec(), false, true, ChronicleConfig.DEFAULT.clone());

    return indexChronicePersistor;
}

private static Codec<Buffer, Person, Person> getReactorCodec() {
    return new KryoCodec<Person, Person>();
}

}

you could add such into your project. then you should download the reactor 、disruptor 、kryo(the left is the chronicle-queue related jar)in your classpath (or make some pom file to include that)

@peter-lawrey
Copy link
Member

I tried to work out what the maven pom.xml would look like but there
appears to be too many options as to what it could be.

http://search.maven.org/#search%7Cga%7C1%7Creactor

Can you provide a pom.xml which has the versions you are actually using?

On 4 November 2014 10:14, bwzhang2012 notifications@github.com wrote:

sure. but you should find the dependency to run

import net.openhft.chronicle.ChronicleConfig;
import reactor.io.Buffer;
import reactor.io.encoding.Codec;
import reactor.io.encoding.kryo.KryoCodec;
import reactor.queue.IndexedChronicleQueuePersistor;
import reactor.queue.PersistentQueue;
import reactor.queue.QueuePersistor;

public class TestPersistQueue {

public static class Person implements java.io.Serializable {
private static final long serialVersionUID = 1L;

private String name;

private String address;

private byte[] info;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public byte[] getInfo() {
    return info;
}

public void setInfo(byte[] info) {
    this.info = info;
}

@Override
public String toString() {
    return this.address + " " + this.name;
}

}

public static void main(String[] args) throws Exception {
PersistentQueue transferQueue = new PersistentQueue(getTransferMsgPersitor());

System.out.println("before poll1 queue===" + transferQueue.isEmpty());

long t1 = System.currentTimeMillis();

Person person = null;
for (int i = 0; i < 1000; i++) {
    person = getPerson(i);
    transferQueue.offer(person);
}

long t2 = System.currentTimeMillis();

while (!transferQueue.isEmpty()) {
    Person _person = transferQueue.poll();

    System.out.println("1===" + _person.toString());
}

long t3 = System.currentTimeMillis();

System.out.println("offer cost==={" + (t2 - t1) + "}ms,poll cost==={" + (t3 - t2) + "}ms");

System.out.println("after poll1 queue===" + transferQueue.isEmpty());

while (!transferQueue.isEmpty()) {
    Person _person = transferQueue.poll();

    System.out.println("2========" + _person.toString());
}

System.out.println("after poll2 queue===" + transferQueue.isEmpty());

}

private static Person getPerson(int i) {
Person person = new Person();

person.setAddress("address:" + i);

person.setName("name:" + i);

person.setInfo(String.valueOf(System.currentTimeMillis()).getBytes());

return person;

}

private static QueuePersistor getTransferMsgPersitor() throws IOException {
String basePath = System.getProperty("user.home") + "/" + "persist";

System.out.println("basePath===" + basePath);

IndexedChronicleQueuePersistor<Person> indexChronicePersistor = new IndexedChronicleQueuePersistor<Person>(basePath,
        getReactorCodec(), false, true, ChronicleConfig.DEFAULT.clone());

return indexChronicePersistor;

}

private static Codec<Buffer, Person, Person> getReactorCodec() {
return new KryoCodec<Person, Person>();
}

}

you could add such into your project. then you should download the reactor
、disruptor in your classpath (or make some pom file to include that)


Reply to this email directly or view it on GitHub
#96 (comment)
.

@peter-lawrey
Copy link
Member

While not a direct answer to your question, you might find this helpful.

You will notice that I warmed up the code before benchmarking it. This
uses Chronicle alone but you should get similar performance using Reactor.

Output
before poll1 queue
offer cost==={624}ms, poll cost==={479}ms for 1000000 entries.

To speed this up further I would use StringBuilder instead of String and
recycle the Person object. This would almost eliminate any garbage.


import net.openhft.chronicle.*;
import net.openhft.chronicle.tools.ChronicleTools;

import java.io.IOException;

public class TestChronicleQueue {

public static void main(String[] args) throws IOException {
    warmUp();
    String TMP = System.getProperty("user.home");
    String basePath = TMP + "/testChronicleQueue";
    // needed for a repeatable test.
    ChronicleTools.deleteOnExit(basePath);
    IndexedChronicle chronicle = new IndexedChronicle(basePath);
    ExcerptAppender appender = chronicle.createAppender();
    System.out.println("before poll1 queue");

    long t1 = System.currentTimeMillis();

    for (int i = 0; i < 1000000; i++) {
        Person person = getPerson(i);
        appender.startExcerpt();
        person.writeExternal(appender);
        appender.finish();
    }

    long t2 = System.currentTimeMillis();
    ExcerptTailer tailer = chronicle.createTailer();
    int count = 0;
    while (tailer.nextIndex()) {
        Person person = new Person();
        person.readExternal(tailer);
        count++;

        // don't time output as it's much slower than the queue

// System.out.println("1===" + person);
}

    long t3 = System.currentTimeMillis();

    System.out.println("offer cost==={" + (t2 - t1) + "}ms, poll

cost==={" + (t3 - t2) + "}ms for "+count+" entries.");
}

private static void warmUp() throws IOException {
    String TMP = System.getProperty("java.io.tmpdir");
    String basePath = TMP + "/warmupIndex";
    ChronicleTools.deleteOnExit(basePath);
    IndexedChronicle chronicle = new IndexedChronicle(basePath);
    ExcerptAppender appender = chronicle.createAppender();

    for (int i = 0; i < 12000; i++) {
        Person person = getPerson(i);
        appender.startExcerpt();
        person.writeExternal(appender);
        appender.finish();
    }

    ExcerptTailer tailer = chronicle.createTailer();
    while(tailer.nextIndex()) {
        Person person = new Person();
        person.readExternal(tailer);
    }

}

private static Person getPerson(int i) {
    Person person = new Person();

    person.setAddress("address:" + i);

    person.setName("name:" + i);

person.setInfo(String.valueOf(System.currentTimeMillis()).getBytes());

    return person;
}

}

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public class Person implements Externalizable {
private static final long serialVersionUID = 1L;

private String name;

private String address;

private byte[] info;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public byte[] getInfo() {
    return info;
}

public void setInfo(byte[] info) {
    this.info = info;
}

@Override
public String toString() {
    return this.address + " " + this.name;
}

@Override
public void writeExternal(ObjectOutput out) throws IOException {
    out.writeUTF(name);
    out.writeUTF(address);
    out.writeInt(info.length);
    out.write(info);
}

@Override
public void readExternal(ObjectInput in) throws IOException {
    name = in.readUTF();
    address = in.readUTF();
    byte[] info = new byte[in.readInt()];
    in.read(info);
    this.info = info;
}

}

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public class Person implements Externalizable {
private static final long serialVersionUID = 1L;

private String name;

private String address;

private byte[] info;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public byte[] getInfo() {
    return info;
}

public void setInfo(byte[] info) {
    this.info = info;
}

@Override
public String toString() {
    return this.address + " " + this.name;
}

@Override
public void writeExternal(ObjectOutput out) throws IOException {
    out.writeUTF(name);
    out.writeUTF(address);
    out.writeInt(info.length);
    out.write(info);
}

@Override
public void readExternal(ObjectInput in) throws IOException {
    name = in.readUTF();
    address = in.readUTF();
    byte[] info = new byte[in.readInt()];
    in.read(info);
    this.info = info;
}

}


4.0.0

<groupId>eg</groupId>
<artifactId>reactor-test</artifactId>
<version>0.1</version>

<dependencies>
    <dependency>
        <groupId>net.openhft</groupId>
        <artifactId>chronicle</artifactId>
        <version>3.2.5</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.6</version>
    </dependency>

</dependencies>

On 4 November 2014 10:41, Peter Lawrey peter.lawrey@gmail.com wrote:

I tried to work out what the maven pom.xml would look like but there
appears to be too many options as to what it could be.

http://search.maven.org/#search%7Cga%7C1%7Creactor

Can you provide a pom.xml which has the versions you are actually using?

On 4 November 2014 10:14, bwzhang2012 notifications@github.com wrote:

sure. but you should find the dependency to run

import net.openhft.chronicle.ChronicleConfig;
import reactor.io.Buffer;
import reactor.io.encoding.Codec;
import reactor.io.encoding.kryo.KryoCodec;
import reactor.queue.IndexedChronicleQueuePersistor;
import reactor.queue.PersistentQueue;
import reactor.queue.QueuePersistor;

public class TestPersistQueue {

public static class Person implements java.io.Serializable {
private static final long serialVersionUID = 1L;

private String name;

private String address;

private byte[] info;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public byte[] getInfo() {
    return info;
}

public void setInfo(byte[] info) {
    this.info = info;
}

@Override
public String toString() {
    return this.address + " " + this.name;
}

}

public static void main(String[] args) throws Exception {
PersistentQueue transferQueue = new PersistentQueue(getTransferMsgPersitor());

System.out.println("before poll1 queue===" + transferQueue.isEmpty());

long t1 = System.currentTimeMillis();

Person person = null;
for (int i = 0; i < 1000; i++) {
    person = getPerson(i);
    transferQueue.offer(person);
}

long t2 = System.currentTimeMillis();

while (!transferQueue.isEmpty()) {
    Person _person = transferQueue.poll();

    System.out.println("1===" + _person.toString());
}

long t3 = System.currentTimeMillis();

System.out.println("offer cost==={" + (t2 - t1) + "}ms,poll cost==={" + (t3 - t2) + "}ms");

System.out.println("after poll1 queue===" + transferQueue.isEmpty());

while (!transferQueue.isEmpty()) {
    Person _person = transferQueue.poll();

    System.out.println("2========" + _person.toString());
}

System.out.println("after poll2 queue===" + transferQueue.isEmpty());

}

private static Person getPerson(int i) {
Person person = new Person();

person.setAddress("address:" + i);

person.setName("name:" + i);

person.setInfo(String.valueOf(System.currentTimeMillis()).getBytes());

return person;

}

private static QueuePersistor getTransferMsgPersitor() throws IOException {
String basePath = System.getProperty("user.home") + "/" + "persist";

System.out.println("basePath===" + basePath);

IndexedChronicleQueuePersistor<Person> indexChronicePersistor = new IndexedChronicleQueuePersistor<Person>(basePath,
        getReactorCodec(), false, true, ChronicleConfig.DEFAULT.clone());

return indexChronicePersistor;

}

private static Codec<Buffer, Person, Person> getReactorCodec() {
return new KryoCodec<Person, Person>();
}

}

you could add such into your project. then you should download the
reactor 、disruptor in your classpath (or make some pom file to include
that)


Reply to this email directly or view it on GitHub
#96 (comment)
.

@bwzhang2011
Copy link
Author

peter thanks a lot for your feedback. I just test in in pure java lib way with those libs under lib directory. as I mentioned above the reactor is spring reactor while the access site is https://github.com/reactor/reactor. and excuse me for not found in the maven. and you could take a look at the code in spring way just access it: IndexedChronicleQueuePersistor. the obvious difference is the reactor will use the codec (like kryo: you could get it by accessing https://github.com/EsotericSoftware/kryo) to serialize it into the byteBuf (defined in reactor) and then make use of chronice to write it to the appender. others will resemble the same but your example did provide use some direct way to integrate chronice.

@peter-lawrey
Copy link
Member

We use maven to save time as we have to be efficient is how we work (there
is only 4 full time devs in the company)
You add it to your pom.xml so the version you need and it's dependencies
are imported.

I was considering adding this test to our automated build system, but there
is no simple way to automate what you suggest.

On 4 November 2014 13:55, bwzhang2012 notifications@github.com wrote:

peter thanks a lot for your feedback. I just test in in pure java lib way
with those libs under lib directory. as I mentioned above the reactor is
spring reactor while the access site is https://github.com/reactor/reactor.
and excuse me for not found in the maven. and you could take a look at the
code in spring way just access it: IndexedChronicleQueuePersistor. the
obvious difference is the reactor will use the codec (like kryo: you could
get it by accessing https://github.com/EsotericSoftware/kryo) to
serialize it into the byteBuf (defined in reactor) and then make use of
chronice to write it to the appender. others will resemble the same but
your example did provide use some direct way to integrate chronice.


Reply to this email directly or view it on GitHub
#96 (comment)
.

@bwzhang2011
Copy link
Author

Thanks a lot peter. and I will hand it to reactor team for their evaluation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants