-
Notifications
You must be signed in to change notification settings - Fork 18
News and noteworthy
Philip Helger edited this page May 29, 2026
·
64 revisions
v0.9.1 - 2026-05-29
- Replaced the in-tree tracing facade (
APTrace,IAPSpan,EAPSpanKind,IAPTracerSPIinphoss-ap-api) with the newph-telemetrysubmodule from ph-commons 12.2.6.phoss-ap-otelnow provides the tracer via theITelemetryTracerSPIservice-loader contract instead of the in-tree SPI. Inbound / outbound / forwarding / MLS / scheduler / reporting code now usescom.helger.telemetry.Telemetrydirectly — no behavioural change, but consumers that only depended on the SPI now depend on ph-commons instead ofphoss-ap-api. - Updated dependencies:
- Parent POM 3.0.3 → 3.0.5
- ph-commons 12.2.5 → 12.2.6 (new
ph-telemetrysubmodule providing a vendor-neutral tracing facade;EErrorLevel.SUCCESSdeprecated in favour ofINFORMATION) - ph-web 11.4.0 → 11.4.1 (proxy configuration via
http.proxy.host/http.proxy.portno longer requireshttp.proxy.enabled=true;http.proxy.enablednow only acts as an explicit kill-switch) - phase4 4.5.0 → 4.5.1 (improved backwards compatibility around the AP TLS truststore default change and clearer error messages on TLS / PKIX failures pointing at the migration guide)
- ddd 0.8.7 → 0.8.8 (added value-provider entries for the French CTC Extended-CTC-FR profile on
cii,ubl2-invoiceandubl2-creditnote; added support for the French CTC CDAR D22B syntax) - peppol-reporting 4.1.3 → 4.1.4
- AWS SDK 2.44.4 → 2.45.0
- Flyway 12.6.1 → 12.6.2
- JAXB 4.0.8 → 4.0.9
- OpenTelemetry Instrumentation 2.27.0 → 2.28.1
- Sentry 8.41.0 → 8.43.0
- Apache MINA sshd-sftp 2.17.1 → 2.18.0
- Added OkHttp 5.3.2 as a centrally managed dependency for the OpenTelemetry OTLP exporter runtime
v0.9.0 - 2026-05-17
- Added support for secondary forwarders — fire-and-forget fan-out of every successfully forwarded inbound document to any number of additional endpoints.
Useful for duplicating from a TEST AP to both a Dev and a QA backend, or for adding a filesystem archive alongside an HTTP forward.
Configured via indexed keys
forwarding.secondary.{n}.mode/forwarding.secondary.{n}.*(up to 10 secondaries). Each secondary may use any supported mode (http_post_*,s3_link,sftp,filesystem) independently of the primary. Secondaries run only after the primary succeeded, have no retries, no SLA, no effect on the inbound transaction status, MLS response or circuit breaker; failures are logged only. Each dispatch is wrapped in aphoss.ap.inbound.forward.secondaryOpenTelemetry span. See #23 and Forwarding Process — Secondary Forwarders. - Added optional OpenTelemetry integration in the new
phoss-ap-otelmodule — emits metrics (failure counters, lifecycle counters and SLA histograms for forwarding / sending / MLS round-trip / scheduler cycles) and distributed traces across the inbound, outbound, MLS, SMP, verification, reporting, scheduler and archival flows. Disabled by default; enabled by settingotel.enabled=trueand configuring the standard OTel environment variables (e.g.OTEL_EXPORTER_OTLP_ENDPOINT). Adds two new SPIs inphoss-ap-api:IAPLifecycleEventSPI(positive lifecycle events, complementing the existing failure-sideIAPNotificationHandlerSPI) andIAPTracerSPI(tracing facade behindAPTrace/IAPSpan/EAPSpanKind, so in-tree modules record spans without depending on the OpenTelemetry API jar). See #33 - AS4 incoming duplicate detection is now backed by the configured database (PostgreSQL, MySQL, H2).
Survives restarts and is shared across multiple AP instances.
Adds Flyway V2 migration creating the
as4_duplicate_itemtable. See #19 - CRL downloads now use the dedicated
Phase4PeppolCRLHttpClientSettings(pre-tuned timeouts) from phase4 - Added new configuration property
peppol.revocation.soft-fail(defaultfalse) to globally enable certificate revocation soft-fail mode — when set, certificate validation succeeds even if the CRL/OCSP status cannot be determined (e.g. responder unreachable due to a network error). Maps toCertificateRevocationCheckerDefaults.setAllowSoftFail(boolean). -
/api/outbound/submit-sbdnow also runs Phorm validation whenverification.outbound.enabled=true, matching the behavior of/api/outbound/submitand/api/outbound/submit-auto. See #21 - thx @roiLeo - Added optional cleanup scheduler that periodically deletes archived inbound and outbound transactions (database row + document file)
whose
completed_dtis older than the configured retention. Operates only on archive tables; requires archival to be enabled. Configured via new propertiescleanup.scheduler.enabled(defaultfalse),cleanup.scheduler.interval(default24h),cleanup.scheduler.retention(default90d, minimum2d), andcleanup.scheduler.batch-size(default100). Adds Flyway V3 migration creating indexes oncompleted_dtof the archive tables. See #20 - thx @thordw - Switched all time-related configuration properties to use the duration grammar (e.g.
5s,1m 30s,2d 12h). The legacy.ms/.milliskeys continue to be honored for backwards compatibility (with a deprecation warning) and will be removed in v1.0.0. See Configuration Properties for the duration grammar. Affected properties:retry.sending.initial-backoff(.ms)retry.sending.max-backoff(.ms)retry.forwarding.initial-backoff(.ms)retry.forwarding.max-backoff(.ms)retry.scheduler.interval(.ms)circuit-breaker.open-duration(.ms)archival.scheduler.interval(.ms)dirsender.scan-interval(.ms)dirsender.initial-delay(.ms)shutdown.timeout(.ms)phossap.jdbc.pooling.max-wait(.millis)phossap.jdbc.pooling.between-evictions-runs(.millis)phossap.jdbc.pooling.min-evictable-idle(.millis)phossap.jdbc.pooling.remove-abandoned-timeout(.millis)phossap.jdbc.execution-time-warning(.ms)
-
GET /api/outbound/status/{sbdhInstanceID}andGET /api/inbound/status/{sbdhInstanceID}now accept the optional query parameterincludeArchive=true(defaultfalse). When set, the corresponding archive table is consulted if the transaction is no longer present in the active table. Adds the new DB API methodsIOutboundTransactionManager.getBySbdhInstanceIDIncludingArchive(String)andIInboundTransactionManager.getBySbdhInstanceIDIncludingArchive(String). See #29 - thx @Robcio35 - Removed the obsolete
&serverTimezone=UTCparameter from the default MySQL JDBC URL inapplication.properties— the parameter has been a no-op since MySQL Connector/J 8.x and emits a deprecation warning. See #18 - Fixed missing
returnstatement inPeppolReportingControllerthat caused the success response of the manual report trigger endpoint to be dropped, so a successful run was reported as an internal server error. See #25 - thx @gkoszegi - Updated dependencies:
v0.2.3 - 2026-04-19
- Updated to BouncyCastle 1.84 (fixing CVE-2026-5588, CVE-2025-14813 and CVE-2026-5598)
- Made sure all time related activities use UTC timezone only
v0.2.2 - 2026-04-12
- Recommendation to use phorm 2.0.3+ as it support to extract payloads from SBDH payloads
- Added support for custom S3 endpoints and path-style access across all three S3 integration points (storage, outbound, forwarding), enabling use of S3-compatible providers like MinIO or Garage. See #16
- Added new configuration properties:
storage.s3.endpoint,storage.s3.path-style-access,outbound.s3.endpoint,outbound.s3.path-style-access,forwarding.s3.endpoint,forwarding.s3.path-style-access - Added H2 support for integration tests, including a Flyway migration script for H2. See #17
- Switched JAXB runtime from
com.sun.xml.bind:jaxb-impltoorg.glassfish.jaxb:jaxb-runtime(the maintained coordinates). Pinnedjaxb-implto4.0.6because4.0.7contains a regression. - Added new configuration property
phossap.flyway.history-tablefor customizing the Flyway schema history table name (from ph-db 8.1.3) - Added new configuration properties
phossap.flyway.debug-modeandphossap.flyway.repair-modefor Flyway diagnostics and history table repair (from ph-db 8.2.0) - Updated dependencies:
- peppol-commons 12.4.0 → 12.4.1 (eDEC Code Lists v9.6;
PeppolMLSBuildernow has a customizable identifier factory) - phive 12.0.1 → 12.0.3 (avoid NPE; avoid infinite ZIP size handling; avoid automatic owner document selection)
- ph-db 8.1.2 → 8.2.0 (customizable Flyway history table name; customizable JDBC pooling parameters; Flyway debug and repair modes)
- ddd 0.8.2 → 0.8.5 (support for new Peppol TDD formats; ability to capture inner element; wrappers in result details)
- peppol-reporting 4.1.2 → 4.1.3
- peppol-ap-support 2.1.2 → 2.1.3
- AWS SDK 2.42.22 → 2.42.32
- Flyway 12.2.0 → 12.3.0
- Jackson 3.1.0 → 3.1.1
- Log4j 2.25.3 → 2.25.4
- peppol-commons 12.4.0 → 12.4.1 (eDEC Code Lists v9.6;
v0.2.1 - 2026-04-01
- Added MySQL 8.0+ as a supported database backend alongside PostgreSQL, including Flyway migration scripts for MySQL and MySQL JDBC driver dependency (#14)
- Fixed phase4 and SMP Client not sharing the same configuration sources
- Fixed missing
MLS_TOandMLS_TYPEparameters when passing outbound transaction as params - Fixed using the correct
MLS_TOvalue from the inbound transaction - Added field
database.typeto the status data
v0.2.0 - 2026-03-30
- Added new REST endpoint
POST /api/outbound/submit-auto/{senderID}/{receiverID}/{c1CountryCode}for submitting raw XML documents with automatic document type and process detection via the DDD (Document Details Determinator) library — no need to specifydocTypeIDorprocessID - Added
DDDHelperutility in phoss-ap-core for DDD integration - Added new
phoss-ap-dirsendermodule — optional directory-based batch sender that watches a directory for pre-built SBD XML files, submits them via the normal outbound pipeline, and moves processed files tosuccess/orerror/subdirectories with JSON result files. Includes crash-safepending/intermediate directory with startup recovery and periodic cleanup. - Added new configuration properties:
dirsender.enabled,dirsender.directory,dirsender.scan-interval.ms,dirsender.initial-delay.ms - Added new forwarding mode
filesystem— writes received SBDs to a local directory with a metadata JSON file alongside each document. Supportsflatandper-transactionlayout modes viaforwarding.filesystem.layout. Atomic write pattern (.tmp→ rename) prevents partial file reads. - Added support for custom HTTP headers on forwarding requests via
forwarding.http.headers.{n}.name/.valueindexed configuration — useful for Bearer tokens, API keys, or custom metadata headers - AS4 message dumps now include a
metadata.jsonfile with incoming message metadata (remote address, timestamps, unique ID, etc.) — applies to bothdirectionandgroupeddump modes - Changed default document storage paths from
/var/phoss-ap/inboundand/var/phoss-ap/outboundto${user.home}/phoss-ap/inboundand${user.home}/phoss-ap/outbound - The management status endpoint now includes the DDD library version
- Added
dddlibrary dependency (v0.8.2) for document type auto-detection
v0.1.3 - 2026-03-29
- Added configurable C4 country code determination modes via
forwarding.c4countrycode.modes— supportsreceiver_pid(derive from receiver participant ID scheme) andbusiness_card(look up from Peppol Directory Business Card via SMP). Multiple modes can be chained as a fallback sequence. The asynchronous reporting API always remains available as the final fallback. - Added new REST endpoint
GET /api/inbound/missing-c4-country-codeto list all forwarded transactions still missing a C4 country code - Added new REST endpoint
GET /api/inbound/missing-c4-country-code/{sbdhInstanceID}to check if a specific transaction is missing a C4 country code (200 = missing, 204 = already set, 404 = not found) - Added
c4CountryCodefield to theInboundTransactionResponseDTO — previously omitted from the JSON response - Added management status endpoint
GET /management/statusreturning non-sensitive configuration, version information, and runtime metadata as JSON (#13) - Added new configuration property
peppol.receiver-check.modewith valuesnone(default),smp, andsmlto explicitly control receiver check behavior. Thesmlmode uses dynamic per-participant SMP resolution via the SML (#12, requires phase4 4.4.2+) - Added new configuration property
peppol.dns.serversto specify custom DNS servers for Peppol NAPTR lookups - Added new configuration property
management.status.enabled(defaulttrue) to disable the status endpoint - Changed default
retry.sending.initial-backoff.msfrom 60 seconds to 180 seconds (3 minutes) - Fixed
HttpDocumentForwardernot applying configuredHttpClientSettings(proxy, timeouts, TLS) — the settings were loaded from configuration but never passed to theHttpClientManager - Updated dependencies:
- phase4 4.4.1 → 4.4.2
v0.1.2 - 2026-03-27
- Added new configuration property
mls.sending.enabled(defaulttrue) to globally disable all outbound MLS sending — useful for testing or during initial rollout - Added
"retry": "none"support inhttp_post_syncforwarding responses — the Receiver Backend can now suppress retry attempts for permanently unprocessable documents - Added new configuration property
archival.scheduler.batch-size(default100) to control how many transactions are archived per scheduler cycle; values < 1 are rejected at startup - Added new configuration property
retry.scheduler.batch-size(default50) to control how many transactions are retried per scheduler cycle; values < 1 are rejected at startup - Added MLS correlation tracking: incoming MLS responses now record the inbound transaction ID (
mls_inbound_transaction_id) for full audit trail - The
peppol.receiving.enabled=falseflag is now enforced — incoming AS4 messages are rejected immediately when receiving is disabled - Added logging configuration template in
application.propertieswith commented-out options for file output, daily rotation and retention - Improved error diagnostics: AS4 private key loading failures now include the attempted key alias in the error message
- Improved
Phase4PeppolSendingReportto always include the AS4 sending result code, even on failure - Fixed NPE in
OutboundOrchestratorwhen AS4 sending returns a negative result code without an accompanying exception - Fixed NPE in
OutboundOrchestratorerror message construction when exception is null - Fixed test backend to use configured country code for
http_post_asyncforwarding responses instead of hardcodingAT(#10) - Moved all client-relevant REST API DTOs from
phoss-ap-webappto newcom.helger.phoss.ap.api.dtopackage inphoss-ap-api, so that API clients can depend onphoss-ap-apialone without pulling in the webapp or Spring Boot-
OutboundS3SubmitRequest— S3 submission request body -
OutboundTransactionResponse— outbound transaction status (includesfromDomain()) -
InboundTransactionResponse— inbound transaction status (includesfromDomain()) -
ReportResponse— inbound reporting response -
MlsSlaReportResponse(with nestedMlsSlaEntryResponse) — MLS SLA compliance report
-
- Updated dependencies:
- Upgraded Jackson from 2.x to 3.1.0 (new
tools.jackson.coregroupId) - Spring Boot 4.0.3 → 4.0.5
- phase4 4.3.2 → 4.4.1
- peppol-commons 12.3.12 → 12.4.0
- ph-web 11.2.4 → 11.2.5
- Flyway 12.1.0 → 12.2.0
- AWS SDK 2.42.13 → 2.42.22
- Sentry 8.35.0 → 8.37.1
- JAXB 4.0.6 → 4.0.7
- commons-compress 1.28.0, commons-lang3 3.20.0
- Imported parent POMs for
ph-db,phase4andpeppol-reportingfor centralized dependency management
- Upgraded Jackson from 2.x to 3.1.0 (new
v0.1.1 - 2026-03-18
- Added S3 as an alternative document storage backend via
storage.mode=s3(newDocumentPayloadManagerS3implementation ofIDocumentPayloadManager) - Document paths in the database are now opaque strings — either absolute filesystem paths or
s3://bucket/keyURIs depending on the configured storage mode - Added new
EStorageModeenum (FILE_SYSTEM,S3) for type-safe storage mode configuration - Added new REST endpoint
POST /api/outbound/submit-s3for submitting outbound documents by S3 reference instead of inlining the payload - Added new
OutboundS3SubmitRequestJSON DTO for the S3 submission endpoint - Added configuration properties:
storage.mode,storage.s3.*(bucket, region, access-key-id, secret-access-key),outbound.s3.*(enabled, bucket, region, access-key-id, secret-access-key) - Changed
IDocumentPayloadManager.renameFile()return type fromFiletoStringto support non-filesystem storage backends -
storage.inbound.pathandstorage.outbound.pathare now used by all storage modes as base path components - Added AWS S3 SDK dependency to
phoss-ap-basicmodule
v0.1.0 - 2026-03-17
- Initial release as open-source
- Requires Java 21 or later
- Based on Spring Boot 4.x
- Uses phase4 4.x for AS4 message exchange
- Uses peppol-commons 12.x for Peppol identifiers, SMP client and MLS
- Uses peppol-reporting 4.x for Peppol Reporting
- PostgreSQL is the required backend database, schema managed via Flyway 12.x
- Inbound AS4 document reception with duplicate detection on AS4 Message ID and SBDH Instance Identifier
- Outbound document sending with automatic SMP lookup and SBDH creation
- Configurable document forwarding to backend systems via HTTP POST, AWS S3 or SFTP
- Retry with exponential backoff and per-endpoint circuit breaker (via Failsafe 3.x) for both sending and forwarding
- Optional document validation via external phive Validation Service
- MLS (Message Level Status) support with integrated SLA-1 and SLA-2 reporting
- Peppol Reporting with scheduled EUSR and TSR submission
- Automatic archival of completed transactions
- REST API for outbound submission, status queries and inbound reporting
- API token authentication
- Multi-instance safe via PostgreSQL
SKIP LOCKEDfor concurrent job processing - (Docker) Multi-stage Dockerfile with health check on
/actuator/health - (Docker) Docker Compose setup with PostgreSQL included
- Optional Sentry integration for error tracking
It is appreciated if you star the GitHub project if you like it.
Donation link: https://paypal.me/PhilipHelger
- Home
- News and noteworthy
- Running phoss AP
- Architecture Overview
- API Specification
- Configuration Properties
- Code Lists
- Database Design Notes
- Maven Module Structure
- Runtime Extensions
- OpenTelemetry Integration
- Security Considerations
- Peppol Specifics
- Testing Without Peppol Network
- Known Users
- Migrating from phase4-peppol-standalone
- Contributing