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