Intershop7:如何正确使用NumberSequenceProvider

时间:2017-03-28 09:56:21

标签: intershop enfinity

我正在研究最新最好的Intershop 7.8.0.3,并且正在尝试实现一种新功能,该功能可生成一个独特的,人类可读的SKU。我的第一个想法是使用NumberSeriesProvider来实现该功能。但是,不幸的是,这个类被标记为已弃用,显然已被NumberSequenceProvider取代。遗憾的是,此功能存在巨大的文档空白。

到目前为止一切顺利。 NumberSequenceProvider还提供了一个方法nextValue(sequenceid)来提供下一个序列条目。我的问题是如何定义sequenceid。我已经看到有一个方法createSequence(...)可以用来这样做。此方法将序列添加到数据库,并将sequenceid存储在本地sequenceNumberGenerators缓存中。在没有调用createSequence(...)方法的情况下,序列是 - 据我所知 - 永远不可用于nextValue(sequenceId)方法,因此调用此方法将导致错误。

我不明白这应该如何在具有多个应用程序服务器的生产场景中工作。实际上我需要在每个服务器上调用createSequence(...)方法,以使序列在本地sequenceNumberGenerators缓存中可用。这种方法总是尝试在数据库中创建序列,如果序列已在先前的启动或并行应用程序服务器上创建,则会导致捕获异常。

它应该如何运作?

谢谢你,以及最好的问候

1 个答案:

答案 0 :(得分:1)

AFAIK一旦创建 - 以编程方式或通过DBInit创建 - 序列将保留在数据库中。它由oracle sequenceBASICSERIESENTRY表中的一行表示。服务器重新启动后序列将可用,无需重新创建它。

在服务器上调用下一个val将保留“系列”数字。这将在同步方法中发生 - 例如从50到100的数字将被保留并保存在内存中(同步),直到生成器耗尽间隔。之后,服务器将尝试从数据库中请求另一个系列。这是一个相当古老的优化,旨在减少数据库调用的数量。在每个服务器重新启动时,将再次调用数据库,以便保留新的系列。

以下是服务器在某些情况下的行为方式,例如,使用序列号生成器创建订单时。

场景1:单台服务器 - 创建3个订单,重新启动服务器,创建3个新订单。

可能的结果:订单号可能是50,51,52,100,101,102

场景2:并行服务器创建订单。

可能的时间结果:订单号可能是100,101,50,102,51,52

请注意,您可能有1到N个应用程序服务器,但只有一个DB来管理序列。

<强>更新 样品用法:

步骤1)创建序列

@Inject
private NumberSequenceProvider nsp;

public void createSeq()
{
    nsp.createSequence(
                    "SO_1234567890",
                    "0000000",
                    "ABC",
                    1,
                    1,
                    Long.MAX_VALUE,
                    1,
                    false,
                    false,
                    50
                    );
}

以下是DB中发生的事情:

SELECT * FROM BASICSERIESENTRY WHERE IDENTIFIER = 'SO_1234567890'

IDENTIFIER      NUMBERPATTERN    SEQUENCENAME                   OCA
--------------- ---------------- ------------------------------ ---------------------- 
SO_1234567890   0000000          ABC                            0


SELECT *
FROM user_sequences 
WHERE sequence_name = 'ABC';

SEQUENCE_NAME                  MIN_VALUE              MAX_VALUE              INCREMENT_BY           CYCLE_FLAG ORDER_FLAG CACHE_SIZE             LAST_NUMBER            
------------------------------ ---------------------- ---------------------- ---------------------- ---------- ---------- ---------------------- ---------------------- 
ABC                            1                      9223372036854775807    1                      N          N          50                     1         

步骤2)重启服务器

第3步:试一试

String seq = Stream.
            generate(() -> nsp.nextValue("SO_1234567890")).
            limit(5).
            collect(Collectors.joining(", "));

System.out.println("SEQUENCE: " + seq);

输出:

SEQUENCE: 0000001, 0000002, 0000003, 0000004, 0000005    

故障排除:

1)NumberSequenceProvider在报告任何Oracle错误时非常讨厌。因此,请检查错误日志中是否存在以下错误:ORA-04006: START WITH cannot be less than MINVALUE

2)激活提供程序实现的调试日志,并检查相关的调试消息(请参阅注释)。