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。您可以在 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
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 文件夹。