Counter
カウンタサービスは、ユニークなカウンタ値を生成するサービスです。トランザクション名の生成やアプリケーションで利用するオーダー番号やネットワークのVLAN番号の払い出しなどに使用できます。 カウンタの定義情報は以下のとおりです。
属性 | 概要 | 備考 |
---|---|---|
counter_type |
カウンタの種類を指定します。Number 、UUID 、Inventory の3つのタイプがあります。 |
Number は数値タイプで、最小値から最大値まで順に発行されます。最大値に達すると、最小値から再度払い出します。 UUID はuuidtype1で払い出されます。 Inventory は、Number と同様に、最小値から最大値まで順番に払い出されますが、在庫管理されるため、在庫がなくなり次第、 409 Conflict が返却されます。払い出されたカウンタを払い戻すことで新規の取得が可能になります。 |
counter_name |
カウンタを一意に識別する名前を指定します。 | - |
counter_format |
カウンタから返される値の形式を指定します。 | 値は$ で表されます。SO00000101 などの形式で払い出す場合は、SO$ を指定してください。数値の左0埋めについては後述する padding をTrue に設定する必要があります。 |
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))↵
... ↵
↵
[]