如何从Java代码同步产品?

2020-09-15 17:36发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,专家!

我们想通过模型层(而不是Jalo)同步Java代码中的某些产品。 我们为所有目录建立了解决方案:

 最终CatalogVersionModel catalogVersion = catalogVersionService.getCatalogVersion(fromCatalog,STAGED);
          最终List 同步= catalogVersion.getSynchronizations();
          for(最终SyncItemJobModel syncItemJob:同步){
              最终SyncItemCronJobModel cronJob = modelService.create(CatalogVersionSyncCronJobModel.class);
              cronJob.setLogToDatabase(Boolean.FALSE);
              cronJob.setLogToFile(Boolean.FALSE);
              cronJob.setForceUpdate(Boolean.FALSE);
              cronJob.setJob(syncItemJob);
              modelService.save(cronJob);
              modelService.refresh(cronJob);
              LOGGER.info("正在生成cronjob:" + cronJob.getCode()+"以同步目录:" + fromCatalog);
              cronJobService.performCronJob(cronJob,true);

  

但是我们需要同步某些产品,而不是所有目录版本。 可能吗? 我们该怎么做?

谢谢。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,专家!

我们想通过模型层(而不是Jalo)同步Java代码中的某些产品。 我们为所有目录建立了解决方案:

 最终CatalogVersionModel catalogVersion = catalogVersionService.getCatalogVersion(fromCatalog,STAGED);
          最终List 同步= catalogVersion.getSynchronizations();
          for(最终SyncItemJobModel syncItemJob:同步){
              最终SyncItemCronJobModel cronJob = modelService.create(CatalogVersionSyncCronJobModel.class);
              cronJob.setLogToDatabase(Boolean.FALSE);
              cronJob.setLogToFile(Boolean.FALSE);
              cronJob.setForceUpdate(Boolean.FALSE);
              cronJob.setJob(syncItemJob);
              modelService.save(cronJob);
              modelService.refresh(cronJob);
              LOGGER.info("正在生成cronjob:" + cronJob.getCode()+"以同步目录:" + fromCatalog);
              cronJobService.performCronJob(cronJob,true);

  

但是我们需要同步某些产品,而不是所有目录版本。 可能吗? 我们该怎么做?

谢谢。

付费偷看设置
发送
8条回答
梦想连接
1楼 · 2020-09-15 17:57.采纳回答

我们通过将Configurator添加到Sync Job来创建了一个解决方案。 完整示例:

 最终CatalogVersion源= modelService.getSource(stagedCatalogVersionModel);
           最终CatalogVersion目标= modelService.getSource(onlineCatalogVersionModel);
           最终SyncItemJob syncJob = CatalogManager.getInstance()。getSyncJob(源,目标);
           最后的SyncItemCronJob syncnizeJob = syncJob.newExecution();
       最终列表itemPKs = new ArrayList();
        用于(最终ProductModel productModel:productModels)
        {
            最终产品sourceProduct = modelService.getSource(productModel);
            最终的ProductModel targetProductModel = findProductFromOnline(productModel);
            产品targetProduct = null;
            如果(targetProductModel!= null)
            {
                targetProduct = modelService.getSource(targetProductModel);
            }
            itemPKs.add(新PK []
            {sourceProduct.getPK(),targetProduct == null?  null:targetProduct.getPK()});
        }
     
        syncnizeJob.addPendingItems(itemPKs,false);
        syncnizeJob.setConfigurator(new SyncItemCronJob.Configurator()
        {
            @已弃用
            @Override
            公共无效configureCronjob(最终SyncItemCronJob syncItemCronJob,最终SyncItemCopyContext syncItemCopyContext)
            {
            }
     
            公共CompletionInfo getCompletionInfo()
            {
                返回新的SyncItemJob.CompletionInfo(&"配置完整版本sync&",0,0,0,0);
            }
        });
 
    syncJob.perform(synchronizeJob,true);

  

是的,谢谢您的帮助。

宇峰科技
2楼-- · 2020-09-15 17:54

您是救生员。 谢谢 !!

何必丶何苦呢
3楼-- · 2020-09-15 17:42

覆盖configureCronojob对我来说可以同步选定的产品syncnizeJob.setConfigurator(new SyncItemCronJob.Configurator(){

  @Override
  公共CompletionInfo getCompletionInfo()
  {
      返回新的SyncItemJob.CompletionInfo("配置完整版本同步",0,0,0,0);

  }

  @已弃用
  @Override
  公共无效configureCronjob(最终SyncItemCronJob arg0,最终SyncItemCopyContext arg1)
  {
      syncJob.addCatalogItemsToSync(synchronizeJob,items);
  }
  

});

N-Moskvin
4楼-- · 2020-09-15 17:45

您是救生员。 谢谢 !!

宇峰
6楼-- · 2020-09-15 18:04
< 实际上,即使为某些同步功能添加了服务层,同步过程仍在使用Jalo层。 可以使用这些类,也可以查看以下类: de.hybris.platform.cockpit.services.sync.impl.SynchronizationServiceImpl.performSynchronization(...)

希望有帮助。

干杯, 伊夫

宇峰Kouji
7楼-- · 2020-09-15 17:55

我尝试了两种方法:

1通过Jalo层进行同步:

 最终CatalogVersion源= modelService.getSource(stagedCatalogVersionModel);
      最终CatalogVersion目标= modelService.getSource(onlineCatalogVersionModel);
      最终SyncItemJob syncJob = CatalogManager.getInstance()。getSyncJob(源,目标);
      最后的SyncItemCronJob syncnizeJob = syncJob.newExecution();
      最终产品sourceProduct = modelService.getSource(sourceproductModel);
      最终产品targetProduct = modelService.getSource(targetProductModel);
      syncnizeJob.addPendingItem(sourceProduct,targetProduct);
      syncJob.perform(synchronizeJob,true);

  

结果:同步更新所有产品(不是sourceProduct)

2通过SynchronizationServiceImpl进行同步:

 最终CatalogVersion目标= modelService.getSource(onlineCatalogVersionModel);
      最终SyncItemJob syncJob = CatalogManager.getInstance()。getSyncJob(源,目标);
      最终List  synkPkJobs = new ArrayList ();
      synkPkJobs.add(syncJob.getPK()。toString());
      最后的SynchronizationServiceImpl同步服务=新的SynchronizationServiceImpl();
      syncService.performSynchronization(productModels,synkPkJobs,onlineCatalogVersionModel,syncJob.getCode());

  

结果:de.hybris.platform.cockpit.services.sync.impl.SynchronizationServiceImpl.performSynchronization(SynchronizationServiceImpl.java:242)处的异常java.lang.NullPointerException

有人可以分享工作示例中的一项产品吗?

谢谢。

一周热门 更多>