تيامات هو سجل مكان التوقف. يتم استخدامه على المستوى الوطني في النرويج وأماكن أخرى. تم إنشاء Tiamat باستخدام تقنيات مثل Spring Boot وHibernate وPostgis وJersey وJackson.
يدعم تصدير أماكن التوقف والكيانات الأخرى إلى تنسيق http://netex-cen.eu/. هناك العديد من الخيارات للتصدير:
توفر Tiamat واجهة برمجة تطبيقات GraphQL غنية لأماكن التوقف والأماكن الطبوغرافية وروابط المسار ومناطق التعريفات وما إلى ذلك، وتدعم نفس المعلمات مثل واجهة برمجة تطبيقات تصدير NeTEx. كما أنه يدعم الطفرات. حتى تتمكن من تحديث أو إنشاء الكيانات. هناك أيضًا عمليات graphql (وظائف مسماة) تتيح وظائف مثل دمج الأرصفة أو أماكن التوقف.
الواجهة الأمامية لـ Tiamat متاحة. اسمه أبزو. انظر https://github.com/entur/abzu
تستخدم Tiamat شبكة ذاكرة Hazelcast للتواصل مع مثيلات أخرى في kubernetes. هذا يعني أنه يمكنك تشغيل مثيلات متعددة.
بعد استيراد أماكن التوقف وتعيين معرفات جديدة لأماكن التوقف، تحتفظ تيامات بالمعرفات القديمة في جدول التعيين. يتوفر جدول التعيين بين المعرفات القديمة والجديدة من خلال GraphQL API ونقطة نهاية REST.
تدعم تيامات البحث عن المراجع الخاصة بمناطق التعريفة والأماكن الطبوغرافية من تطابقات المضلعات وتعبئتها عند حفظ مكان التوقف.
يتم إصدار أماكن التوقف والكيانات الأخرى. هذا يعني أن لديك سجل الإصدارات الكامل لأماكن التوقف والشخص الذي أجرى هذه التغييرات. تتضمن Tiamat أيضًا أداة للفرق. يُستخدم هذا للمقارنة وإظهار الفرق بين نسختين من مكان التوقف (أو كيان آخر).
mvn clean install
أنت بحاجة إلى الدليل /deployments/data
مع حقوق المستخدم الذي يقوم بالإنشاء.
تستخدم تيامات حاويات الاختبار لإجراء اختبارات التكامل مع قاعدة بيانات حقيقية. لتشغيل الاختبارات المستندة إلى 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، انسخ المخطط الفارغ إلى قاعدة البيانات. يتم تعيين خصائص الربيع في 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. يجب أن يكون من الممكن تحديد معظم الخصائص في 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 لأماكن التوقف بفجوة أقل أو أكبر. كان سبب هذا التنفيذ هو الأنظمة القديمة ذات القيود المفروضة على الحد الأقصى لعدد الأرقام.
من الممكن التحكم فيما إذا كان يجب إنشاء المعرفات خارج تيامات أم لا. راجع فئة ValidPrefixList. يؤدي تعيين الخاصية netex.validPrefix
إلى إخبار Tiamat بإنشاء معرفات للكيانات الجديدة. يرجى ملاحظة أنه ليس من الممكن إجراء استيراد أولي (راجع نوع الاستيراد) عدة مرات بنفس المعرفات.
يتم بدء كل ذلك بواسطة مستمع كيان تم التعليق عليه باستخدام PrePersist
في فئة IdentifiedEntity
التي تسمى IdentifiedEntityListener
. يحدد NetexIdAssigner
ما إذا كان الكيان لديه معرف بالفعل أم لا. يقوم NetexIdProvider
إما بإرجاع معرف جديد أو التعامل مع المعرفات المطالب بها بشكل صريح إذا كانت البادئة المكونة متطابقة. راجع ValidPrefixList
للتعرف على تكوين البادئات الصالحة، والبادئات للمعرفات التي تم إنشاؤها في مكان آخر. تستخدم 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
. القيم المقبولة صحيحة أو خاطئة. إذا تم التعيين على "صحيح"، فسيتم إرجاع كافة إصدارات أماكن التوقف المطابقة. إذا تم التعيين على خطأ، فسيتم إرجاع الإصدار الأعلى حسب الرقم لمطابقة أماكن التوقف. لم يتم تمكين هذه المعلمة عند استخدام مقياس صلاحية الإصدار.
مطابقة أماكن التوقف فقط بدون موقع استخدم المعلمة: 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
نصيحة احترافية: قم بتوجيه الإخراج من الضفيرة إلى 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
، فأنت بحاجة للتأكد من أن لديك ذاكرة كافية متاحة لعملية جافا (في حالة مجموعات البيانات الكبيرة). هناك مشكلة أخرى وهي حجم مكدس الخيط، والذي قد يلزم زيادته عند التعامل مع واردات NeTEx الكبيرة حقًا. مثال:
export MAVEN_OPTS='-Xms256m -Xmx1712m -Xss256m -XX:NewSize=64m -XX:MaxNewSize=128m -Dfile.encoding=UTF-8'
يجب ألا يحتوي ملف NeTEx هذا على معرف NSR. (بادئة NSR قابلة للتكوين في فئة ValidPrefixList)
ستعيد Tiamat بنية NeTEx المعدلة بمعرفات NSR الخاصة بها. ستكون المعرفات الأصلية موجودة في قائمة القيم الأساسية في كل كائن.
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 متاحة على https://api.dev.entur.io/graphql-explorer/stop-places باستخدام GraphiQL : https://github.com/graphql/graphiql (استخدم على سبيل المثال Modify Headers
لمتصفح Chrome لإضافة حامل- رمز للطفرات)
لإنشاء قاعدة بيانات لتيامات، قم بتنزيل واستخدام أداة سطر أوامر flyway: https://flywaydb.org/documentation/commandline/
يتم تنفيذ عمليات الترحيل عند بدء تشغيل تيامات.
أنشئ ملفًا جديدًا وفقًا لوثائق مسار الطيران في المجلد resources/db/migrations
. قم بإجراء الترحيل مع تغييرات التعليمات البرمجية التي تتطلب تغيير المخطط هذا. اتبع اصطلاح التسمية.
تم جمع الاستفسارات والنصوص المختلفة المتعلقة تيامات هنا: https://github.com/entur/tiamat-scripts
تم تصميم Tiamat باستخدام CircleCI. راجع المجلد .circleci.