标签: java-failsafe

如何在将数据发送到另一个应用程序时实施重试策略?

我正在处理将数据发送到的应用程序zeromq.以下是我的应用程序:

  • 我有一个类SendToZeroMQ将数据发送到zeromq.
  • 将相同的数据添加到retryQueue同一个类中,以便以后可以在未收到确认的情况下重试.它使用带有maximumSize限制的guava缓存.
  • 有一个单独的线程从zeromq接收先前发送的数据的确认,如果没有收到确认,SendToZeroMQ则将重试发送相同的数据.如果收到确认,那么我们将把它删除,retryQueue以便不能再次重试.

想法很简单,我必须确保我的重试策略正常工作,这样我就不会丢失我的数据.这是非常罕见的,但如果我们没有收到acknolwedgements.

我正在考虑构建两种类型,RetryPolicies但我无法理解如何在这里构建与我的程序相对应的:

  • RetryNTimes: 在此,它将在每次重试之间以特定的睡眠重试N次,之后,它将丢弃记录.
  • ExponentialBackoffRetry:在此,它将指数级地继续重试.我们可以设置一些最大重试限制,然后它将不会重试并将丢弃记录.

下面是我的SendToZeroMQ类,它将数据发送到zeromq,也从后台线程每30秒重试一次并启动ResponsePollerrunnable,它会一直运行:

public class SendToZeroMQ {
  private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);
  private final Cache<Long, byte[]> retryQueue =
      CacheBuilder
          .newBuilder()
          .maximumSize(10000000)
          .concurrencyLevel(200)
          .removalListener(
              RemovalListeners.asynchronous(new CustomListener(), executorService)).build();

  private static class Holder {
    private static final SendToZeroMQ INSTANCE = new SendToZeroMQ();
  }

  public static SendToZeroMQ getInstance() {
    return Holder.INSTANCE;
  }

  private SendToZeroMQ() {
    executorService.submit(new ResponsePoller());
    // retry …
Run Code Online (Sandbox Code Playgroud)

java multithreading design-patterns guava java-failsafe

12
推荐指数
1
解决办法
926
查看次数

为什么 CopyOnWriteArrayList 的写入和读取操作都需要副本?

来自这篇文章,它说:

\n
\n

当我们\n使用任何修改方法\xe2\x80\x93(例如add()或remove()\xe2\x80\x93)时,\nCopyOnWriteArrayList的整个内容都会被复制到新的\n内部副本中。

\n

由于这个简单的事实,我们可以以安全的方式迭代列表,\n即使发生并发修改也是如此。

\n

当我们在 CopyOnWriteArrayList 上调用 iterator() 方法时,我们会返回一个由 CopyOnWriteArrayList 内容的不可变快照备份的迭代器。

\n

它的内容是创建迭代器时 ArrayList 内数据的精确副本。\n 即使与此同时,某个线程从列表中添加或删除元素,该修改也会创建数据的新副本,该副本将用于从该列表进行任何进一步的数据查找。

\n
\n

接下来要问自己的简单问题是为什么两者都是?基本上,根据我的理解,写入操作是在新副本上进行的,而读取操作是在集合的克隆上完成的。

\n

例如,如果在新副本上完成写入,则意味着我可以迭代“原始”集合 - 这意味着它不会受到影响。那么为什么要增加在另一个副本(快照)中存储元素的开销呢?或者相反的方向,如果我将元素存储在副本(快照)中,为什么当我实际上是在克隆而不是“原始”集合上迭代时需要在副本上进行写入(意味着快照永远不会改变)?

\n

我希望这个问题是合法的,因为我确实检查了互联网上所有可能的来源,但没有一篇文章帮助我消除了这种困惑。我在这里缺少什么?

\n

java iterator clone copyonwritearraylist java-failsafe

3
推荐指数
1
解决办法
825
查看次数