Tiamat은 정지 장소 등록부입니다. 노르웨이 및 기타 지역에서 전국적으로 사용됩니다. Tiamat은 Spring Boot, Hibernate, Postgis, Jersey 및 Jackson과 같은 기술을 사용하여 만들어졌습니다.
정류장 및 기타 엔터티를 http://netex-cen.eu/ 형식으로 내보내기를 지원합니다. 내보내기에는 다양한 옵션이 있습니다.
Tiamat은 정지 장소, 지형적 장소, 경로 링크, 관세 구역 등에 대한 풍부한 GraphQL API를 제공하며 NeTEx 내보내기 API와 동일한 매개변수를 지원합니다. 또한 돌연변이를 지원합니다. 따라서 엔터티를 업데이트하거나 생성할 수 있습니다. 부두나 정류장 병합과 같은 기능을 허용하는 graphql 프로세스(이름이 지정된 함수)도 있습니다.
Tiamat용 프런트엔드를 사용할 수 있습니다. 이름은 압주(Abzu)입니다. https://github.com/entur/abzu를 참조하세요.
Tiamat은 Hazelcast 메모리 그리드를 사용하여 kubernetes의 다른 인스턴스와 통신합니다. 이는 여러 인스턴스를 실행할 수 있음을 의미합니다.
정류장을 가져오고 새로운 ID를 정류장에 할당한 후 tiamat는 매핑 테이블에 이전 ID를 유지합니다. 이전 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
그러면 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
Tiamat은 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 Cloud Storage에 업로드합니다. 시작되면 작업 ID를 다시 받게 됩니다. 작업이 완료되면 내보낸 데이터를 다운로드할 수 있습니다.
동기 내보내기의 매개변수 대부분은 비동기 내보내기에서도 작동합니다!
curl https://api.dev.entur.io/stop-places/v1/netex/export/initiate
전문가 팁: 출력을 컬에서 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는 자체 NSR ID를 사용하여 수정된 NeTEx 구조를 반환합니다. 원본 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에 지시해야 합니다. env 변수를 설정하면 됩니다.
-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이 시작될 때 실행됩니다.
resources/db/migrations
폴더의 이동 경로 문서에 따라 새 파일을 만듭니다. 이 스키마 변경이 필요한 코드 변경과 함께 마이그레이션을 커밋합니다. 명명 규칙을 따릅니다.
tiamat과 관련된 다양한 쿼리와 스크립트는 여기에 수집되어 있습니다: https://github.com/entur/tiamat-scripts
Tiamat은 CircleCI를 사용하여 구축되었습니다. .circleci 폴더를 참조하세요.