Как разработать интеграцию ценообразования для Hybris с приложением SAP ERP для B2B

Если в ERP есть модуль ценообразования, который рассчитывает цену в режиме реального времени для каждого пользователя, есть ли способ получить ее без ущерба для производительности?


person racha11    schedule 22.05.2017    source источник
comment
Я бы сказал, просто внедрите некоторый кеш, чтобы избежать большого количества обращений к вашей ERP.   -  person alain.janinm    schedule 23.05.2017


Ответы (1)


Вы можете сохранить кэш, чтобы избежать множественных обращений к системе ERP.

Вот пример кода, который вы можете попробовать реализовать кешированием:

CustomCache.java

public class CustomCache
{

    @Resource(name = customCacheRegion)
    protected CacheAccess customCacheAccess;

    //Fetch result from cache
    public ResultData readCachedData(final B2BUnitModel customer, final Date date)
    {
       return (ResultData) customCacheAccess.get(createCacheKey(customer, date));
    }

    //Update result to cache
    public void cacheResult(final B2BUnitModel customer, final Date date,
        final ResultData resultData)
    {

       try
       {
          customCacheAccess.put(createCacheKey(customer, date), resultData);

       }
       catch (final SAPHybrisCacheException e)
       {
        //error
       }
    }

    protected CustomCacheKey createCacheKey(final B2BUnitModel customer, final Date date)
    {
       return new CustomCacheKey(customer, date);
    }

}

Кэшировать КЛЮЧ –

  public class CustomCacheKey extends AbstractCacheKey
  {
        private final B2BUnitModel customer;

        private final Date date; 

        @Override
        public int hashCode()
        {
            final int prime = 31;
            int result = super.hashCode();
            result = prime * result + ((customer == null) ? 0 : customer.hashCode());
            return result;
        }

        @Override
        public boolean equals(final Object obj)
        {
           if (obj == null)
           {
              return false;
           }

           if (!super.equals(obj))
           {
               return false;
           }

           final CustomCacheKey customCacheKey = (CustomCacheKey ) obj;
           if (customer == null)
           {
                if (customCacheKey.customer != null)
                {
                   return false;
                }
           }
           else if (!customer.equals(customCacheKey.customer))
           {
               return false;
           }

           if (date == null)
           {
               if (customCacheKey.date != null)
               {
                 return false;
           }
        }
        else if (!DateUtils.isSameDay(date, customCacheKey.date))
        {
           return false;
        }

        return true;
     }
}

*-spring.xml --

 <bean id="customCacheRegion" parent="sapCoreCacheRegion">
    <constructor-arg name="name"
        value="customCacheRegion" />
    <constructor-arg name="maxEntries" value="10000" />
    <constructor-arg name="evictionPolicy" value="FIFO" />
    <constructor-arg name="statsEnabled" value="true" />
    <constructor-arg name="exclusiveComputation" value="false" />
    <constructor-arg name="ttlSeconds" value="300" />
</bean>

<bean
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject" ref="cacheRegionsList" />
    <property name="targetMethod" value="add" />
    <property name="arguments">
        <ref bean="customCacheRegion" />
    </property>
</bean>

Таким образом, Cache — это своего рода карта, на которой вы можете определить пару ключ-значение и получить кэшированное значение из самого ключа.

Наконец, на уровне обслуживания перед вызовом системы ERP просто проверьте, доступны ли данные для конкретного клиента (или какого-либо другого условия в вашем случае) в кеше или нет. Если он доступен, просто извлеките его непосредственно из кеша, в противном случае вызовите систему ERP и обновите результат в кеше.

person Free-Minded    schedule 23.05.2017
comment
Спасибо, Шрештт Бхатт. Это действительно помогает мне. - person racha11; 24.05.2017
comment
@racha11 racha11 Не могли бы вы принять этот ответ, если он работает :) - person Free-Minded; 24.05.2017
comment
что, если тот же пользователь изменит записи/продукт, как отличить, должен ли он вернуть последние кэшированные цены или должен вызвать ERP? - person static void main; 09.06.2017
comment
@staticvoidmain Нам нужно переопределить метод equals(), чтобы добавить все возможные уникальные условия, чтобы при изменении какой-либо записи/продукта метод equals() просто возвращал false, из-за чего ключ не существует в карте кеша и попадал в Звонок в ЭРП. - person Free-Minded; 09.06.2017