Counter

カウンタサービスは、ユニークなカウンタ値を生成するサービスです。トランザクション名の生成やアプリケーションで利用するオーダー番号やネットワークのVLAN番号の払い出しなどに使用できます。 カウンタの定義情報は以下のとおりです。

属性 概要 備考
counter_type カウンタの種類を指定します。
NumberUUIDInventoryの3つのタイプがあります。
Number は数値タイプで、最小値から最大値まで順に発行されます。最大値に達すると、最小値から再度払い出します。
UUIDはuuidtype1で払い出されます。
Inventoryは、Numberと同様に、最小値から最大値まで順番に払い出されますが、在庫管理されるため、
在庫がなくなり次第、409 Conflict が返却されます。払い出されたカウンタを払い戻すことで新規の取得が可能になります。
counter_name カウンタを一意に識別する名前を指定します。 -
counter_format カウンタから返される値の形式を指定します。 値は$で表されます。SO00000101 などの形式で払い出す場合は、SO$を指定してください。
数値の左0埋めについては後述するpaddingTrueに設定する必要があります。
min_num カウンタの最小値を指定します。 -
max_num カウンタの最大値を指定します。 -
padding ゼロパディングモードを指定します。 counter_formatの例に示されているSO00000101のように、ゼロが埋め込まれた値を取得する場合は、Trueを指定します。
counter_script スクリプトを使用して、カウンタで払い出された数値をもとに値をカスタマイズできます。 変数v に割り当てられたカウンタ値が格納されているため、開発者はスクリプト内でv を書き換えることで自由にカスタマイズできます。

counter_scriptの記述例

# Example of giving the last two digits of the year and the month
today = datetime.datetime.utcnow() 
v = "{y}{p}{m}{v}".format(y=today.year-2000, p="0" if today.month < 10 else "", m=today.month, v=v)


Counter組込みオブジェクトを利用した操作

カウンタはCounter組込みオブジェクトにより以下の操作が提供されます。

  • allocate: カウンタ値を取得します。

  • release: カウンタ値を解放します。このアクションは、Inventoryタイプでのみ可能です。

  • expand: カウンタプールのサイズを拡張します。最小値は現在のサイズより大きくすることはできません。最大値は現在のサイズより小さくすることはできません。このアクションは、Inventoryタイプでのみ可能です。

  • shrink: カウンタプールのサイズを縮小します。最小値は現在のサイズより小さくすることはできません。最大値は現在のサイズより大きくすることはできません。このアクションは、Inventoryタイプでのみ可能です。

使用例

>>> r = await Counter.allocate("orderNumber")↵
... print(r)↵
... ↵
SO00000002↵
>>>

Note

カウンタを払い戻しする例など、詳細はDocs » リファレンス » ビルトインオブジェクトを参照してください。

APIを利用したカウンター操作

以下のようにAPIを利用して作成することも可能です。
InventoryタイプのみPUT methodで変更できます。その際、command, min_num, max_num, counter_nameを全て指定する必要があります。

>>> r = await callout(path="/counters", method="POST", body={"counter_type": "inventory", "counter_name": "test_counter", "counter_format": "$", "min_num": 1, "max_num": 100, "padding": True})↵
... print(r.code)↵
... ↵
↵
204
>>> r = await callout(path=f"/counters?counter_name=test_counter")↵
... print(json.dumps(json.loads(r.body), indent=4))↵
... ↵
↵
[
    {
        "counter_name": "test_counter",
        "counter_type": "number",
        "counter_format": "$",
        "counter_script": null,
        "max_num": 100,
        "min_num": 1,
        "padding": true,
        "__FILE__": "test_counter.yml",
        "version": 1,
        "update": "2024-07-04T15:10:58.172324+09:00",
        "current": 0
    }
]
>>> r = await callout("/counters?counter_name=test_counter", method="PUT", body={"command":"expand", "min_num":0, "max_num":1000, "counter_name":"test2_counter"})↵
... print(r.code)↵
... ↵
↵
204
>>> r = await callout(path=f"/counters?counter_name=test_counter")↵
... print(json.dumps(json.loads(r.body), indent=4))↵
... ↵
↵
[
    {
        "counter_name": "test_counter",
        "counter_type": "inventory",
        "counter_format": "$",
        "counter_script": null,
        "max_num": 1000,
        "min_num": 0,
        "padding": true,
        "__FILE__": "test_counter.yml",
        "version": 1,
        "update": "2024-07-05T14:16:33.614603+09:00",
        "inventory": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
        "utilization_rate": 0.0
    }
]
>>> r = await callout(path=f"/counters?counter_name=test_counter", method="DELETE")
... print(r.code)↵
... ↵
↵
204
>>> r = await callout(path=f"/counters?counter_name=test_counter")↵
... print(json.dumps(json.loads(r.body), indent=4))↵
... ↵
↵
[]