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 之間的對應表可透過 GraphQL API 和 REST 端點取得。
Tiamat 支援在保存停靠地點時從多邊形匹配中尋找和填充對關稅區和地形地點的引用。
停靠點和其他實體都有版本控制。這意味著您擁有停靠點的完整版本歷史記錄以及進行這些更改的人。 Tiamat 還包括一個 diff 工具。這用於比較和顯示停靠點(或其他實體)的兩個版本之間的差異。
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
這將啟動 Tiamat 以及 PostgreSQL 和 Hazelcast。 and you can access Tiamat on http://localhost:1888 and the database on http://localhost:5433 and graphiql on http://localhost:8777/services/stop_places/graphql , At start up tiamat copy empty schema to the資料庫. 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
Tiamat 正在使用 HikariCP。大多數屬性應該可以在 application.properties 中指定,例如spring.datasource.initializationFailFast=false
。更多資訊請點這裡。 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。實施此實施的原因是遺留系統對最大位數有限制。
可以控制是否應在 Tiamat 外部產生 ID。請參閱 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 進程(如果資料集很大)。另一個問題是執行緒堆疊大小,在處理非常大的 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 在產生的執行緒中複製 Security Context。這可以透過設定環境變數來完成:
-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 (使用例如Modify Headers
添加承載者-突變的標記)
若要為 tiamat 建立資料庫,請下載並使用 Flyway 命令列工具:https://flywaydb.org/documentation/commandline/
tiamat 啟動時會執行遷移。
根據資料夾resources/db/migrations
中的 Flyway 文件建立一個新檔案。提交遷移以及需要此架構變更的程式碼變更。遵循命名約定。
這裡收集了與 tiamat 相關的各種查詢和腳本:https://github.com/entur/tiamat-scripts
Tiamat 是使用 CircleCI 建構的。請參閱 .circleci 資料夾。