Tiamat は停止場所レジスターです。ノルウェーやその他の場所で全国的に使用されています。 Tiamat は、Spring Boot、Hibernate、Postgis、Jersey、Jackson などのテクノロジーを使用して作成されています。
停止場所およびその他のエンティティの http://netex-cen.eu/ 形式へのエクスポートをサポートします。エクスポートには多くのオプションがあります。
Tiamat は、停留所、地形図、パス リンク、料金ゾーンなどに豊富な GraphQL API を提供し、NeTEx エクスポート API と同じパラメータをサポートします。突然変異もサポートします。したがって、エンティティを更新または作成できます。また、岸壁や停留所の結合などの機能を可能にするgraphqlプロセス(名前付き関数)もあります。
Tiamat のフロントエンドが利用可能です。その名はアブズ。 https://github.com/entur/abzu を参照してください。
Tiamat は Hazelcast メモリ グリッドを使用して、kubernetes の他のインスタンスと通信します。これは、複数のインスタンスを実行できることを意味します。
停止場所をインポートし、新しい ID を停止場所に割り当てた後、tiamat は古い ID をマッピング テーブルに保持します。古い ID と新しい ID の間のマッピング テーブルは、GraphQL API および REST エンドポイントを通じて利用できます。
Tiamat は、停車地を保存するときに、ポリゴンの一致から料金ゾーンと地形上の場所への参照を検索して入力することをサポートします。
停止場所とその他のエンティティはバージョン管理されます。これは、停車場所とその変更を行った人物の完全なバージョン履歴があることを意味します。 Tiamat には diff ツールも含まれています。これは、停止場所 (または他のエンティティ) の 2 つのバージョンの違いを比較して示すために使用されます。
mvn clean install
ビルドを実行するユーザーの権限を持つディレクトリ/deployments/data
必要です。
Tiamat はテストコンテナを使用して、実際のデータベースに対して統合テストを実行します。 Testcontainers ベースのテストを実行するには、Docker-API と互換性のあるコンテナ ランタイムが必要です。詳細については、https://www.testcontainers.org/supported_docker_environment/ を参照してください。
(デフォルトのプロファイルは application.properties で設定されます)
Docker compose で Tiamat を実行するには、docker-compose.yml ファイルが必要です。 docker-compose フォルダーに compose.yml ファイルがあります。
docker compose up
これにより、PostgreSQL と Hazelcast を使用して Tiamat が起動します。 http://localhost:1888 の Tiamat と http://localhost:5433 のデータベース、および http://localhost:8777/services/stop_places/graphql のgraphiql にアクセスできます。 tiamat の起動時に、空のスキーマをデータベース。 Spring プロパティは application.properties で設定されます。この設定ではセキュリティは無効になっています。
PostgreSQL で実行するには、外部 application.properties が必要です。以下は application.properties の例です。
spring.jpa.database=POSTGRESQL
spring.datasource.platform=postgres
spring.jpa.properties.hibernate.hbm2ddl.import_files_sql_extractor=org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
spring.jpa.hibernate.hbm2ddl.import_files_sql_extractor=org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
spring.jpa.hibernate.ddl-auto=none
spring.http.gzip.enabled=true
#spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.batch_versioned_data=true
spring.flyway.enabled=true
spring.flyway.table =schema_version
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
spring.jpa.hibernate.id.new_generator_mappings=true
spring.jpa.hibernate.use-new-id-generator-mappings=true
spring.jpa.properties.hibernate.cache.use_second_level_cache=false
spring.jpa.properties.hibernate.cache.use_query_cache=false
spring.jpa.properties.hibernate.cache.use_minimal_puts=false
spring.jpa.properties.hibernate.cache.region.factory_class=org.rutebanken.tiamat.hazelcast.TiamatHazelcastCacheRegionFactory
netex.import.enabled.types=MERGE,INITIAL,ID_MATCH,MATCH
hazelcast.performance.monitoring.enabled=true
hazelcast.performance.monitoring.delay.seconds=2
management.endpoints.web.exposure.include=info,env,metrics
management.endpoints.prometheus.enabled=true
management.metrics.endpoint.export.prometheus.enabled=true
spring.jpa.properties.hibernate.jdbc.batch_size=20
spring.jpa.properties.hibernate.default_batch_fetch_size=16
spring.jpa.properties.hibernate.generate_statistics=false
changelog.publish.enabled=false
jettyMaxThreads=10
jettyMinThreads=1
spring.datasource.hikari.maximumPoolSize=40
spring.datasource.hikari.leakDetectionThreshold=30000
tiamat.locals.language.default=eng
tariffZoneLookupService.resetReferences=true
debug=true
# Disable feature detection by this undocumented parameter. Check the org.hibernate.engine.jdbc.internal.JdbcServiceImpl.configure method for more details.
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false
# Because detection is disabled you have to set correct dialect by hand.
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect
tariffzoneLookupService.resetReferences=true
spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisDialect
spring.database.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5436/tiamat
spring.datasource.username=tiamat
spring.datasource.password=tiamat
#OAuth2 Resource Server
spring.security.oauth2.resourceserver.jwt.issuer-uri=https:http://localhost:8082/realms/entur
tiamat.oauth2.resourceserver.auth0.ror.jwt.audience=abzu
tiamat.oauth2.resourceserver.auth0.ror.claim.namespace=role_assignments
spring.cloud.gcp.pubsub.enabled=false
aspect.enabled=true
netex.id.valid.prefix.list={TopographicPlace:{'KVE','WOF','OSM','ENT','LAN'},TariffZone:{'*'},FareZone:{'*'},GroupOfTariffZones:{'*'}}
server.port=1888
blobstore.gcs.blob.path=exports
blobstore.gcs.bucket.name=tiamat-test
blobstore.gcs.credential.path=gcloud-storage.json
blobstore.gcs.project.id=carbon-1287
security.basic.enabled=false
management.security.enabled=false
authorization.enabled = true
rutebanken.kubernetes.enabled=false
async.export.path=/tmp
publicationDeliveryUnmarshaller.validateAgainstSchema=false
publicationDeliveryStreamingOutput.validateAgainstSchema=false
netex.validPrefix=NSR
netex.profile.version=1.12:NO-NeTEx-stops:1.4
blobstore.local.folder=/tmp/local-gcs-storage/tiamat/export
spring.profiles.active=local-blobstore,activemq
この構成で Tiamat を起動するには、 spring.config.locationを指定します。
java -jar -Dspring.config.location=/path/to/tiamat.properties --add-opens java.base/java.lang=ALL-UNNAMED -Denv=dev tiamat-0.0.2-SNAPSHOT.jar
ティアマトはHikariCPを使用しています。 spring.datasource.initializationFailFast=false
のように、ほとんどのプロパティは application.properties で指定できるはずです。詳細については、こちらをご覧ください。 https://github.com/brettwooldridge/HikariCP/wiki/Configuration http://stackoverflow.com/a/26514779 も参照してください。
docker run -it -d -p 5435:5432 --name postgress-13 -e POSTGRES_USER=tiamat -e POSTGRES_PASSWORD="tiamat" -e POSTGRES_INITDB_ARGS="-d" postgis/postgis:13-master
Tiamat の実装中、停止場所の NeTEx ID を多かれ少なかれギャップなく生成することが望まれていました。この実装の理由は、最大桁数の制限があるレガシー システムでした。
ID を Tiamat の外部で生成するかどうかを制御できます。 ValidPrefixList クラスを参照してください。 netex.validPrefix
プロパティを設定すると、Tiamat に新しいエンティティの ID を生成するように指示します。同じ ID を使用して初回インポート (ImportType を参照) を複数回実行することはできないことに注意してください。
これはすべて、 IdentifiedEntityListener
というクラスIdentifiedEntity
のPrePersist
アノテーションが付けられたエンティティ リスナーによって開始されます。 NetexIdAssigner
エンティティがすでに ID を持っているかどうかを判断します。 NetexIdProvider
、新しい ID を返すか、設定されたプレフィックスが一致する場合は明示的に要求された ID を処理します。有効なプレフィックスの構成と、他の場所で生成された ID のプレフィックスについては、 ValidPrefixList
参照してください。 GaplessIdGeneratorService
Hazelcast を使用してインスタンス間で状態を同期し、競合を回避します。
Tiamat と Abzu はどちらも Keycloak または Auth0 で使用するように設定されています。 Keycloakのセットアップ方法に関する詳細なガイドは、こちらでご覧いただけます。
パブリケーション配信のアンマーシャリングまたはマーシャリング時に、tiamat が受信および送信する NeTEx XML を検証するかどうかを構成できます。デフォルト値は true です。プロパティを false に設定すると無効化できます。
publicationDeliveryStreamingOutput.validateAgainstSchema=false
publicationDeliveryUnmarshaller.validateAgainstSchema=true
立ち寄り地や地形を直接 NeTEx 形式にエクスポートすることができます。これがエンドポイントです: https://api.dev.entur.io/stop-places/v1/netex
https://api.dev.entur.io/stop-places/v1/netex?q=Arne%20Garborgs%20vei
https://api.dev.entur.io/stop-places/v1/netex?q=3115
https://api.dev.entur.io/stop-places/v1/netex?stopPlaceType=RAIL_STATION
複数種類でも可能です。
https://api.dev.entur.io/stop-places/v1/netex?municipalityReference=KVE:TopographicPlace:1003
https://api.dev.entur.io/stop-places/v1/netex?countyReference=KVE:TopographicPlace:11
https://api.dev.entur.io/stop-places/v1/netex?size=1000
https://api.dev.entur.io/stop-places/v1/netex?page=1
返す NSR 停車地 ID のリストを指定できます。
https://api.dev.entur.io/stop-places/v1/netex?idList=NSR:StopPlace:3378&idList=NSR:StopPlace:123
allVersions
。受け入れられる値は true または false です。 true に設定すると、一致する停止場所のすべてのバージョンが返されます。 false に設定すると、一致する停止場所に対して、番号による最も高いバージョンが返されます。バージョン有効性パラメータを使用する場合、このパラメータは有効になりません。
場所を指定せずに停止場所のみを照合します。パラメーターを使用します: withoutLocationOnly=true
パラメータtopographicPlaceExportMode
、 NONE 、 RELEVANT 、またはALLに設定できます。 関連する地形的な場所は、エクスポートされた停止場所のリストから検索されます。
tariffZoneExportMode
パラメータはNONE 、 RELEVANT 、またはALLに設定できます。 エクスポートされた停車場所のリストから関連する料金ゾーンが見つかります。停止場所には料金ゾーン参照のリストがある可能性があるためです。
パラメータgroupOfStopPlacesExportMode
、 NONE 、 RELEVANT 、またはALLに設定できます。 エクスポートされた停止場所のリストから、関連する停止場所のグループを見つけることができます。
versionValidity
パラメーターは、どの停留所を返すかを制御します。
https://api.dev.entur.io/stop-places/v1/netex?tariffZoneExportMode=RELEVANT&topographicPlaceExportMode=RELEVANT&groupOfStopPlacesExportMode=NONE&q=Nesbru&versionValidity=CURRENT&municipalityReference=KVE:TopographicPlace:0220
現在のバージョンが有効で、クエリ「Nesbru」に一致し、自治体 0220 に存在する停車地を返します。関連する料金ゾーンと地形上の場所を取得します。
非同期エクスポートでは、エクスポートされたデータを Google クラウド ストレージにアップロードします。開始すると、ジョブ ID が返されます。ジョブが完了したら、エクスポートされたデータをダウンロードできます。
同期エクスポートのパラメーターのほとんどは、非同期エクスポートでも機能します。
curl https://api.dev.entur.io/stop-places/v1/netex/export/initiate
プロのヒント: 出力をcurlからxmllintにパイプして出力をフォーマットします。
curl https://api.dev.entur.io/stop-places/v1/netex/export/initiate | xmllint --format -
curl https://api.dev.entur.io/stop-places/v1/netex/export
curl https://api.dev.entur.io/stop-places/v1/netex/export/130116/content | zcat | xmllint --format - > export.xml
https://rutebanken.atlassian.net/browse/NRP-924 も参照してください。
postgresql で既存のデータをクリーンアップします (頻繁に使用する場合は合理化します)。
TRUNCATE stop_place CASCADE;
TRUNCATE quay CASCADE;
TRUNCATE topographic_place CASCADE;
これをspring:run
から実行している場合は、Java プロセスに使用できる十分なメモリがあることを確認する必要があります (大規模なデータ セットの場合)。もう 1 つの問題はスレッド スタック サイズです。非常に大きな NeTEx インポートに対処する場合は、スレッド スタック サイズを増やす必要がある場合があります。例:
export MAVEN_OPTS='-Xms256m -Xmx1712m -Xss256m -XX:NewSize=64m -XX:MaxNewSize=128m -Dfile.encoding=UTF-8'
この NeTEx ファイルには NSR ID を含めないでください。 (NSR プレフィックスはクラス ValidPrefixList で構成可能です)
Tiamat は、変更された NeTEx 構造を独自の NSR ID とともに返します。元の ID は、各オブジェクトのキー値リストに存在します。
curl -XPOST -H"Content-Type: application/xml" [email protected] http://localhost:1997/services/stop_places/netex
importType=INITIALを指定してインポートすると、並列ストリームが作成され、元のプロセスが生成されます。インポート中にユーザー認証がチェックされ、SecurityContextHolder にアクセスします。デフォルトでは、SecurityContextHolder は DEFAULT_LOCAL_STRATEGY を使用します。 INITIAL importType を使用する場合は、Spring に SecurityContextHolder に MODE_INHERITABLETHREADLOCAL を使用するように指示し、Spring が生成されたスレッドでセキュリティ コンテキストを複製できるようにする必要があります。これは、環境変数を設定して行うことができます。
-Dspring.security.strategy=MODE_INHERITABLETHREADLOCAL
そうでない場合、Spring が生成されたプロセスで認可をチェックしようとすると、アプリケーションはユーザーが認証されていないというエラーを引き起こす可能性があります。
GraphQL エンドポイントは以下で利用可能です
https://api.dev.entur.io/stop-places/v1/graphql
ヒント: GraphiQLを使用した https://api.dev.entur.io/graphql-explorer/stop-places で利用可能な GraphiQL UI : https://github.com/graphql/graphiql (ベアラーを追加するには、Chrome のModify Headers
などを使用します)突然変異のトークン)
tiamat のデータベースを作成するには、flyway コマンド ライン ツールをダウンロードして使用します: https://flywaydb.org/documentation/commandline/
マイグレーションは、tiamat の起動時に実行されます。
Flyway のドキュメントに従って、フォルダーresources/db/migrations
に新しいファイルを作成します。このスキーマ変更を必要とするコード変更とともに移行をコミットします。命名規則に従ってください。
tiamat に関連するさまざまなクエリとスクリプトがここに集められています: https://github.com/entur/tiamat-scripts
Tiamat は CircleCI を使用して構築されています。 .circleci フォルダーを参照してください。