2016-06-27 3 views
1

У меня есть два издателя и один авторский сервер. Я использую обратную репликацию для Содержимого, для измененного содержимого. Итак, у меня есть и репликация вперед (Selfmade, потому что AEM havent).AEM Обратная репликация с двумя издателями

Проблема заключается в том, что репликация между издателем идет в бесконечном цикле. Так они повторяются, как играть в пинг-понг.

Что я могу сделать с игрой пинг-понга издателей?

Я использую CQ 6.1, Java 1.7

enter image description here

+0

Что вы подразумеваете под самодельным агентом прямой репликации - это настраиваемый код или просто настроенный агент репликации по умолчанию? – nateyolles

+0

Как настраивается агент репликации, созданный автором для своих триггеров? У вас включены триггеры «Входящие» или «Входящие»? – nateyolles

+0

Его стандартная самовозбуждающая репликация для пользовательского контента, потому что у AEM нет Workflow для этого (я не знаю почему). У меня нет триггеров, проверенных на true. –

ответ

1

Я нашел решение.

Опции
  1. Set Replication -> Часы PrintScreen
  2. Адаптировать WorkflowSession в классе Session для репликации
  3. Закрыть Sessionafter репликации
  4. Не закрывать Workflow Session
  5. Clean Исходящего издателей в CRX (/ вар/replication/outbox) [каждый раз, если что-то не работает]
  6. Создать пусковую установку для обратной репликации Создать & Изменено (с условием: cq: distribute! =)
  7. Создать для запуска вперед репликации Создание & 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 -> пусковые

enter image description here

+0

Я думаю, что в прежнем проекте мы «просто» добавили свойство, чтобы проверить, были ли данные уже реплицированы. Но это также означает создание пользовательских рабочих процессов ... это всего лишь комментарий. –

+0

Я сделал исправление. Не закрывайте сессию рабочего процесса! –

 Смежные вопросы

  • Нет связанных вопросов^_^