Я нашел решение.
Опции
- Set Replication -> Часы PrintScreen
- Адаптировать WorkflowSession в классе Session для репликации
- Закрыть Sessionafter репликации
- Не закрывать Workflow Session
- Clean Исходящего издателей в CRX (/ вар/replication/outbox) [каждый раз, если что-то не работает]
- Создать пусковую установку для обратной репликации Создать & Изменено (с условием: cq: distribute! =)
- Создать для запуска вперед репликации Создание & Modified (пример кода)
Потому что есть более чем на одну позицию вперед репликатора, я сделал Абстрактный класс . Если вы его не используете, поместите все в один класс
Внимание: с ReplicationOption setSynchronous (true), репликация была прекрасна для тиражирования от издателя до издателя. Но , потому что у меня есть страница администрирования автора, я должен не учитывать этот атрибут . Поскольку изменения на Auhtor не были скопированы на в publishe
@Component(immediate = true)
@Service(value = WorkflowProcess.class)
public class ReplicateUsergeneratedContentToPublishWorkflow extends AbstractAuthorToPublishWorkflow implements WorkflowProcess{
// OSGI properties
@Property(value = "This workflow replicate usergenerated content from author to publisher")
static final String DESCRIPTION = Constants.SERVICE_DESCRIPTION;
@Property(value = "Titel")
static final String VENDOR = Constants.SERVICE_VENDOR;
@Property(value = "Replicate the usergenerated content from one publisher via author to the ohter publisher")
static final String LABEL = "process.label";
private static final Logger LOGGER = LoggerFactory.getLogger(ReplicateUsergeneratedContentToPublishWorkflow.class);
@Reference
private ResourceResolverFactory resolverFactory;
@Reference
protected Replicator replicator;
@Reference
private SlingRepository repository;
@Reference
SlingSettingsService slingSettingsService;
@Override
public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap metaDataMap) throws WorkflowException {
Session session = null;
SimpleCredentials administrator = new SimpleCredentials("username", "password".toCharArray());
try {
java.util.Set<String> runModes = slingSettingsService.getRunModes();
session = repository.login(administrator);
//the replication need to check the payload
String payload = workItem.getWorkflowData().getPayload().toString();
Node node = null;
if (session.itemExists(payload)) {
node = (Node) session.getItem(payload);
}
activateNode(node, workflowSession, replicator);
//save all changes
session.save();
} catch (PathNotFoundException e) {
LOGGER.error("path not found", e);
workflowSession.terminateWorkflow(null);
} catch (ReplicationException e) {
LOGGER.error("error replicating content node", e);
workflowSession.terminateWorkflow(null);
} catch (RepositoryException e) {
LOGGER.error("error reading path to content node", e);
workflowSession.terminateWorkflow(null);
}finally{
if(session != null){
session.logout();
}
}
}
}
public abstract class AbstractAuthorToPublishWorkflow implements WorkflowProcess {
protected void activateNode(Node node, WorkflowSession workflowSession, Replicator replicator) throws RepositoryException, ReplicationException {
ReplicationOptions replicationOptions = new ReplicationOptions();
replicationOptions.setSuppressStatusUpdate(true);
replicationOptions.setSuppressVersions(true);
//replicationOptions.setSynchronous(true);
//the property cq:distribute is settet if the node should be replicated from publisher to author (set it in your own code)
if (node != null) {
node.setProperty("cq:distribute", (Value) null);
//important use WorkflowSession and adapt it to Session class, replication is going to an endless loop, if you doing it without WorkflowSession
replicator.replicate(workflowSession.adaptTo(Session.class), ReplicationActionType.ACTIVATE, node.getPath(), replicationOptions);
}
}
}
Специально для этого пользователя и группы вперед репликации, не вмешиваются в действие Деактивировать UserAdmin на автора
//Important that you don't interfer the Deactivate Action from useradmin
//do nothing if the action is deactivate!
if(!userNode.getProperty("cq:lastReplicationAction").getString().equals("Deactivate")) {
activateNode(userNode, workflowSession, replicator);
//save all changes
session.save();
}
И для в кодере я был модифицирован узел в авторе, я добавляю это
//quickfix
//FrameworkUtil.getBundle(NodeManageDAO.class).getBundleContext()
BundleContext bundleContext = FrameworkUtil.getBundle(PhotoNodeManagerDAO.class).getBundleContext();
ServiceReference serviceReference = bundleContext.getServiceReference(SlingSettingsService.class.getName());
SlingSettingsService slingSettingsService = (SlingSettingsService)bundleContext.getService(serviceReference);
Set<String> runmode= slingSettingsService.getRunModes();
//just in author mode
if(runmode.contains("author")) {
//attention replication from author is not working without nullable/delete the cq:distribute property
node.setProperty("cq:distribute", (Value)null);
}
Если у вас есть обновленная модель рабочего процесса, вам придется перезапустить рабочий процесс и очистить отказы и трупные от старых конфигураций репликации. Очистите автора и каждого отдельного издателя, перейдите к crx в/etc/workflow/launcher/config.
Для обратного репликатора на издателя задайте также условие: cq: распространять!=
и на каждой части в коде, где вы меняете узлы, добавьте следующие три свойства
node.setProperty("cq:distribute", ValueFactoryImpl.getInstance().createValue("true"));
node.setProperty("cq:lastModifiedBy", ValueFactoryImpl.getInstance().createValue(session.getUserID()));
node.setProperty("cq:lastModified", ValueFactoryImpl.getInstance().createValue(Calendar.getInstance()));
session.save();
образец Пусковые [authorserver] /etc/workflow.html -> пусковые
Что вы подразумеваете под самодельным агентом прямой репликации - это настраиваемый код или просто настроенный агент репликации по умолчанию? – nateyolles
Как настраивается агент репликации, созданный автором для своих триггеров? У вас включены триггеры «Входящие» или «Входящие»? – nateyolles
Его стандартная самовозбуждающая репликация для пользовательского контента, потому что у AEM нет Workflow для этого (я не знаю почему). У меня нет триггеров, проверенных на true. –