Часто нам нужно изменить подстроку с несколькими ключевыми словами, разбросанными по строкам, предшествующим подстроке. Рассмотрим элемент 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")
, и замена работает правильно, как и раньше.
Можно ли записывать в два разных потока (учетная запись A и B) в одной транзакции, используя EventStore?
blockquote>Начиная с V5 RC1 (декабрь 2018 г.), я не могу найти никаких доказательств того, что Хранилище событий поддерживает скоординированную запись в несколько потоков событий.
Предполагая, что ваша модель данных правильная, и что две учетные записи действительно принадлежат разным потокам: это означает, что у вас не жесткая граница транзакции для управления, а процесс.
Аналогия: рассмотрим банковский перевод. Как вы думаете, мы переводим деньги со счета в Bank of America на счет в Wells Fargo за одну транзакцию?
Более обычным подходом будет управление процесс передачи в собственном потоке, который отслеживает все, что произошло. Изменения в учетных записях по-прежнему происходят в их собственных потоках, изолированно друг от друга. Поток процесса отвечает за оркестровку - проверку подтверждений от других элементов.
Счастливый путь потока может выглядеть примерно так:
- Записать запрос на перевод в потоке процесса
- Записать снятие средств в потоке счета A
[ 116] Запишите подтверждение снятия средств в потоке процесса- . Запись депонирования средств в потоке счета B
- . Запишите подтверждение . депозит средств в потоке процесса
- Запишите процесс, завершенный в потоке процесса
Но если вам действительно нужно изменить две учетные записи в в то же время , тогда вам нужно, чтобы они управлялись одним и тем же грубозернистым замком . Так как хранилище событий гарантирует блокировку только на уровне потока, вам потребуется пересмотреть модель данных.