Java中的持久阻塞队列?

时间:2013-03-07 22:26:25

标签: java concurrency persistent-storage blockingqueue

TL; DR;我需要知道是否存在具有性能的持久阻塞队列的lib。

我有一个经典的生产者/消费者计划。他们共享一个LinkedBlockingQueue来共享数据,我在消费者中使用BlockingQueue#take方法,因为我需要他们永远等待新元素。

问题是我有很多数据,我不能丢失它们。即使在消费者停止之后,生产者也可以坚持生成一些数据。我正在考虑实现我的BlockingQueue ta后面使用H2来在达到某个阈值后存储/获取数据。我的主要问题是我需要性能,我需要按照创建的顺序使用元素。

是否有一个持久阻塞队列的实现,我可以用于这样的事情?如果没有,那么我可以通过什么方式来实现这样的目标呢?

4 个答案:

答案 0 :(得分:3)

您可以尝试ActiveMQ。 ActiveMQ可以写入您的文件系统,因此如果生产者生成的元素多于消费者可以带来的元素,则要么有很多阻塞(无论队列的上限是什么)还是过多的数据(如果没有上限)到队列)。

答案 1 :(得分:3)

我会使用ActiveMQ lib和Spring JMS,这是一个用法示例

启动经纪人

BrokerService broker = new BrokerService();
broker.addConnector("tcp://localhost:61616");
broker.start();

阅读消息

ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");
JmsTemplate t = new JmsTemplate(cf);
Message msg = t.receive();

发送消息

ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");
JmsTemplate t = new JmsTemplate(cf);
t.send("test", new MessageCreator() {
  public Message createMessage(Session session) throws JMSException {
    return session.createTextMessage("test");
  }
});

答案 2 :(得分:1)

您是否遇到过Amazon SQS无限制的队列而且速度非常快,它可以保证秩序。您希望将数据持续多长时间?

答案 3 :(得分:0)

您可以使用任何JMS实现来支持多余的传入数据。这是一个生产者消耗问题,为此专门设计了jms。