Как осуществить перевод средств между банковскими счетами в стиле DDD с помощью EventStore?

Часто нам нужно изменить подстроку с несколькими ключевыми словами, разбросанными по строкам, предшествующим подстроке. Рассмотрим элемент xml:

<TASK>
  <UID>21</UID>
  <Name>Architectural design</Name>
  <PercentComplete>81</PercentComplete>
</TASK>

Предположим, мы хотим изменить 81, на какое-то другое значение, скажем 40. Сначала определите .UID.21..UID., затем пропустите все символы, включая \n до .PercentCompleted.. Шаблон регулярного выражения и спецификация замены:

String hw = new String("<TASK>\n  <UID>21</UID>\n  <Name>Architectural design</Name>\n  <PercentComplete>81</PercentComplete>\n</TASK>");
String pattern = new String ("(<UID>21</UID>)((.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)");
String replaceSpec = new String ("$1$2$440$6");
//note that the group (<PercentComplete>) is $4 and the group ((.|\n)*?) is $2.

String  iw = hw.replaceFirst(pattern, replaceSpec);
System.out.println(iw);

<TASK>
  <UID>21</UID>
  <Name>Architectural design</Name>
  <PercentComplete>40</PercentComplete>
</TASK>

Подгруппа (.|\n), вероятно, является отсутствующей группой $3. Если мы сделаем его не захватывающим с помощью (?:.|\n), то $3 будет (<PercentComplete>). Таким образом, шаблон и replaceSpec также могут быть:

pattern = new String("(<UID>21</UID>)((?:.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)");
replaceSpec = new String("$1$2$340$5")

, и замена работает правильно, как и раньше.

0
задан Roman Weis 3 March 2019 в 10:25
поделиться

1 ответ

Можно ли записывать в два разных потока (учетная запись A и B) в одной транзакции, используя EventStore?

Начиная с V5 RC1 (декабрь 2018 г.), я не могу найти никаких доказательств того, что Хранилище событий поддерживает скоординированную запись в несколько потоков событий.

Предполагая, что ваша модель данных правильная, и что две учетные записи действительно принадлежат разным потокам: это означает, что у вас не жесткая граница транзакции для управления, а процесс.

Аналогия: рассмотрим банковский перевод. Как вы думаете, мы переводим деньги со счета в Bank of America на счет в Wells Fargo за одну транзакцию?

Более обычным подходом будет управление процесс передачи в собственном потоке, который отслеживает все, что произошло. Изменения в учетных записях по-прежнему происходят в их собственных потоках, изолированно друг от друга. Поток процесса отвечает за оркестровку - проверку подтверждений от других элементов.

Счастливый путь потока может выглядеть примерно так:

  1. Записать запрос на перевод в потоке процесса
  2. Записать снятие средств в потоке счета A
  3. [ 116] Запишите подтверждение снятия средств в потоке процесса
  4. . Запись депонирования средств в потоке счета B
  5. . Запишите подтверждение . депозит средств в потоке процесса
    • Запишите процесс, завершенный в потоке процесса

Но если вам действительно нужно изменить две учетные записи в в то же время , тогда вам нужно, чтобы они управлялись одним и тем же грубозернистым замком . Так как хранилище событий гарантирует блокировку только на уровне потока, вам потребуется пересмотреть модель данных.

0
ответ дан VoiceOfUnreason 3 March 2019 в 10:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: