Tiamat คือ Stop Place Register มีการใช้ในระดับประเทศในนอร์เวย์และที่อื่นๆ Tiamat ถูกสร้างขึ้นด้วยเทคโนโลยีเช่น Spring Boot, Hibernate, Postgis, Jersey และ Jackson
รองรับการส่งออกสถานที่หยุดและเอนทิตีอื่น ๆ เป็นรูปแบบ http://netex-cen.eu/ มีตัวเลือกมากมายสำหรับการส่งออก:
Tiamat จัดเตรียม GraphQL API ที่สมบูรณ์แบบสำหรับจุดหยุด สถานที่ภูมิประเทศ ลิงก์เส้นทาง เขตภาษี และอื่นๆ รองรับพารามิเตอร์เดียวกันกับ NeTEx Export API นอกจากนี้ยังสนับสนุนการกลายพันธุ์ เพื่อให้คุณสามารถอัปเดตหรือสร้างเอนทิตีได้ นอกจากนี้ยังมีกระบวนการ Graphql (ฟังก์ชันที่มีชื่อ) ซึ่งอนุญาตให้มีฟังก์ชันต่างๆ เช่น การรวมท่าเรือหรือจุดหยุด
มีส่วนหน้าสำหรับ Tiamat มันชื่ออับซู ดูhttps://github.com/entur/abzu
Tiamat ใช้ตารางหน่วยความจำ Hazelcast เพื่อสื่อสารกับอินสแตนซ์อื่นๆ ใน kubernetes ซึ่งหมายความว่าคุณสามารถเรียกใช้หลายอินสแตนซ์ได้
หลังจากนำเข้าสถานที่หยุดและกำหนด ID ใหม่ให้กับสถานที่แล้ว tiamat จะเก็บ ID เก่าไว้ในตารางการแมป ตารางการแมประหว่าง ID เก่าและใหม่มีให้ใช้งานผ่าน GraphQL API และตำแหน่งข้อมูล REST
Tiamat รองรับการค้นหาและเติมข้อมูลอ้างอิงไปยังโซนภาษีและสถานที่ภูมิประเทศจากการจับคู่รูปหลายเหลี่ยมเมื่อบันทึกจุดแวะพัก
สถานที่หยุดและเอนทิตีอื่นๆ เป็นเวอร์ชัน ซึ่งหมายความว่าคุณมีประวัติสถานที่หยุดเวอร์ชันเต็มและบุคคลที่ทำการเปลี่ยนแปลงเหล่านั้น Tiamat ยังมีเครื่องมือต่างอีกด้วย ใช้เพื่อเปรียบเทียบและแสดงความแตกต่างระหว่างจุดแวะพักสองเวอร์ชัน (หรือเอนทิตีอื่น)
mvn clean install
คุณต้องมีไดเร็กทอรี /deployments/data
ที่มีสิทธิ์สำหรับผู้ใช้ที่ดำเนินการบิลด์
Tiamat ใช้ testcontainers เพื่อรันการทดสอบการรวมกับฐานข้อมูลจริง หากต้องการรันการทดสอบตาม Testcontainers คุณต้องมีรันไทม์คอนเทนเนอร์ที่เข้ากันได้กับ Docker-API เพื่อดูรายละเอียดเพิ่มเติมที่ https://www.testcontainers.org/supported_docker_environment/
(โปรไฟล์เริ่มต้นถูกตั้งค่าไว้ใน application.properties)
หากต้องการรัน Tiamat ด้วย Docker compose คุณต้องมีไฟล์ docker-compose.yml ในโฟลเดอร์ docker-compose คุณจะพบไฟล์ compose.yml:
docker compose up
สิ่งนี้จะเริ่มต้น Tiamat ด้วย PostgreSQL และ Hazelcast และคุณสามารถเข้าถึง Tiamat บน http://localhost:1888 และฐานข้อมูลบน http://localhost:5433 และ graphiql บน http://localhost:8777/services/stop_places/graphql เมื่อเริ่มต้น 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 สำหรับจุดหยุดที่มีช่องว่างไม่มากก็น้อย เหตุผลของการดำเนินการนี้คือระบบเดิมที่มีการจำกัดจำนวนหลักสูงสุด
สามารถควบคุมได้ว่าควรสร้าง ID ภายนอก Tiamat หรือไม่ ดูคลาส ValidPrefixList การตั้งค่าคุณสมบัติ netex.validPrefix
บอกให้ Tiamat สร้าง ID สำหรับเอนทิตีใหม่ โปรดทราบว่าเป็นไปไม่ได้ที่จะทำการนำเข้าครั้งแรก (ดูประเภทการนำเข้า) หลายครั้งด้วยรหัสเดียวกัน
ทั้งหมดนี้เริ่มต้นโดยผู้ฟังเอนทิตีที่มีคำอธิบายประกอบด้วย PrePersist
ในคลาส IdentifiedEntity
ที่เรียกว่า IdentifiedEntityListener
NetexIdAssigner
จะกำหนดว่าเอนทิตีมี ID อยู่แล้วหรือไม่ NetexIdProvider
ส่งคืน ID ใหม่หรือจัดการ ID ที่อ้างสิทธิ์อย่างชัดแจ้งหากคำนำหน้าที่กำหนดค่าตรงกัน ดู ValidPrefixList
สำหรับการกำหนดค่าคำนำหน้าที่ถูกต้อง และคำนำหน้าสำหรับ ID ที่สร้างขึ้นที่อื่น GaplessIdGeneratorService
ใช้ Hazelcast เพื่อซิงค์สถานะระหว่างอินสแตนซ์และหลีกเลี่ยงข้อขัดแย้ง
ทั้ง Tiamat และ Abzu ได้รับการตั้งค่าให้ใช้กับ Keycloak หรือ Auth0 คำแนะนำโดยละเอียดเกี่ยวกับวิธีการตั้งค่า Keycloak สามารถพบได้ที่นี่
เป็นไปได้ที่จะกำหนดค่าว่า tiamat ควรตรวจสอบความถูกต้องของ NeTEx xml ขาเข้าและขาออกหรือไม่ เมื่อทำการยกเลิกการจัดเรียงหรือจัดเรียงการจัดส่งสิ่งพิมพ์ ค่าเริ่มต้นเป็นจริง สามารถปิดการใช้งานได้โดยตั้งค่าคุณสมบัติเป็นเท็จ
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 ที่จะส่งคืนได้
https://api.dev.entur.io/stop-places/v1/netex?idList=NSR:StopPlace:3378&idList=NSR:StopPlace:123
allVersions
ค่าที่ยอมรับได้เป็นจริงหรือเท็จ หากตั้งค่าเป็นจริง ระบบจะส่งคืนจุดหยุดที่ตรงกันทุกเวอร์ชัน หากตั้งค่าเป็นเท็จ ระบบจะส่งคืนเวอร์ชันสูงสุดตามหมายเลขสำหรับตำแหน่งหยุดที่ตรงกัน พารามิเตอร์นี้ไม่ได้เปิดใช้งานเมื่อใช้ parmaeter ความถูกต้องของเวอร์ชัน
จับคู่เฉพาะจุดหยุดที่ไม่มีตำแหน่ง ใช้พารามิเตอร์: 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 เมื่อเริ่มต้น คุณจะได้รับรหัสงานคืน เมื่องานเสร็จสิ้น คุณสามารถดาวน์โหลดข้อมูลที่ส่งออกได้
พารามิเตอร์ส่วนใหญ่จากการส่งออกแบบซิงโครนัสใช้ได้กับการส่งออกแบบอะซิงโครนัสเช่นกัน!
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 ของตัวเอง รหัสดั้งเดิมจะปรากฏในรายการค่าคีย์ในแต่ละออบเจ็กต์
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 ใช้ MODE_INHERITABLETHREADLOCAL สำหรับ SecurityContextHolder โดยอนุญาตให้ Spring ทำซ้ำบริบทความปลอดภัยในเธรดที่สร้าง ซึ่งสามารถทำได้โดยการตั้งค่าตัวแปร env :
-Dspring.security.strategy=MODE_INHERITABLETHREADLOCAL
ถ้าไม่เช่นนั้น แอปพลิเคชันอาจบ่นว่าผู้ใช้ไม่ได้รับการรับรองความถูกต้อง หาก Spring พยายามตรวจสอบการอนุญาตในกระบวนการวางไข่
จุดสิ้นสุด GraphQL พร้อมใช้งานบน
https://api.dev.entur.io/stop-places/v1/graphql
เคล็ดลับ: GraphiQL UI มีอยู่บน https://api.dev.entur.io/graphql-explorer/stop-places โดยใช้ GraphiQL : https://github.com/graphql/graphiql (ใช้เช่น Modify Headers
สำหรับ Chrome เพื่อเพิ่มผู้ถือ- โทเค็นสำหรับการกลายพันธุ์)
หากต้องการสร้างฐานข้อมูลสำหรับ tiamat ให้ดาวน์โหลดและใช้เครื่องมือบรรทัดคำสั่ง flyway: https://flywaydb.org/documentation/commandline/
การย้ายข้อมูลจะดำเนินการเมื่อ tiamat เริ่มต้นขึ้น
สร้างไฟล์ใหม่ตามเอกสารประกอบ flyway ในโฟลเดอร์ resources/db/migrations
ยืนยันการย้ายข้อมูลพร้อมกับการเปลี่ยนแปลงโค้ดที่จำเป็นต้องมีการเปลี่ยนแปลงสคีมานี้ ปฏิบัติตามแบบแผนการตั้งชื่อ
มีการเก็บรวบรวมข้อความค้นหาและสคริปต์ต่างๆ ที่เกี่ยวข้องกับ tiamat ไว้ที่นี่: https://github.com/entur/tiamat-scripts
Tiamat สร้างขึ้นโดยใช้ CircleCI ดูโฟลเดอร์ .circleci