SOAP-Webservice, der Messstellenpunkte im Index aktualisiert

Beschreibung

MeLo´s und MaLo´s werden durch diesen SOAP-Webservice im Meldepunktindex aktualisiert. Es wird ein MeLo oder eine MaLo übermittelt und ein Update (auf letzte geschriebene/written) ausgeführt , sollte dieser bereits vorhanden sein. Es wird Service_Ended angepasst und der neue Index-Eintrag addiert. Beispiel Request

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://nextlevel.com/webservices/systemsplit">
	<soapenv:Header/>
	<soapenv:Body>
		<sys:addMeteringlocationList>
			<sys:meteringLocationList>
				<sys:minimalMeteringLocation>
					<sys:meteringLocationNr>12345678911</sys:meteringLocationNr>
					<sys:mandant>MAN4</sys:mandant>
					<sys:system>SYS4</sys:system>
					<sys:startTime>2022-08-15T00:00:00Z</sys:startTime>
					<sys:endTime>2099-12-31T00:00:00Z</sys:endTime>
				</sys:minimalMeteringLocation>
			</sys:meteringLocationList>
		</sys:addMeteringlocationList>
	</soapenv:Body>
</soapenv:Envelope>

in MP-index existierende, gleiche ext_ui

davor:

ext_ui mandant system service_started service_ended wtritten  
12345678911 MAN SYS 20220515000000 20990515000000 20220525133541 -
12345678911 MAN1 SYS1 20220615000000 20990515000000 20220625133541 -
12345678911 MAN2 SYS2 20220715000000 20990515000000 20220725133541 <- aktuelste, letzt geschriebene

danach:

ext_ui mandant system service_started service_ended wtritten  
12345678911 MAN2 SYS2 20220715000000 20220814000000 20220727133541 -> Zeit würde updated
12345678911 MAN4 SYS4 20220815000000 20991231000000 20220727133541 -> neu Eintrag

Ist der Eintrag nicht im Meldepunktindex vorhanden, so wird dieser hinzugefügt (vergleichbar mit ADD).

Bitte wenden Sie sich an unser Support- oder Beratungsteam, falls Sie Interesse(Erweiterung) an diesem Tool haben.

Technical documentation

Der externe Webservice wird über einen SOAP-Request mit Basic-Authentication kontaktiert. Die Antwort wird in eine Erweiterung geschrieben. Microservice funktioniert vollstendig erst ab B2B-Version ab 2022.06.15 (SNAPSHOT)

Configuration

Die Konfiguration für Datenbank und Authentifizierung erfolgt in einer YAML-Datei. Bitte speichern Sie die Datei sicher.

Example:

server.port: 9000
server.address: 0.0.0.0

b2b:
  api-url-get: http://localhost:8080/b2bbp-engine/api/reporting-points
  api-url-get-size: 100
  user: admin
  password: b2bbp

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/postgres
    username: postgres
    password: postgres
  main:
    banner-mode: off
    allow-circular-references: true
  client.user: admin
  client.password: admin
  jpa:
    hibernate:
      ddl-auto: update

Indizierung der übergebenen Daten

Zur tatsächlichen Indizierung ist ein Index Service notwendig.

Index Service

Service Property:

B3P_ENABLE_UPDATE_BEFORE_ADD_IN_INDEX true

Running Doker

Beispiel docker-compose.yml:

version: '3.7'

services:

  nli-b2b-meteringpoints-to-index-wsdl:
    image: docker-nob-erf.next-level-apps.com/b2b/nli-b2b-meteringpoints-to-index-wsdl:2024-08-28-02
    container_name: meteringpoints-to-index
    restart: always
    ports:
      - "8090:9000"
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://host.docker.internal:5432/postgres
      - SPRING_DATASOURCE_USERNAME=postgres
      - SPRING_DATASOURCE_PASSWORD=postgres
      - SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT=org.hibernate.dialect.PostgreSQLDialect

      - B2B_APIURLGET=http://host.docker.internal:8080/b2bbp-engine/api/reporting-points
#      - B2B_APIURLGETSIZE=100
      - B2B_USER=admin
      - B2B_PASSWORD=b2bbp
    volumes:
      - ./config/postgresql-42.3.3.jar:/workspace/BOOT-INF/lib/postgresql-42.3.3.jar
      - ./logs/:/workspace/logs

Inhalt von “config” -> Datenbanktreiber.jar

Aufruf dann von SoapUI(z.B.)

http://localhost:8090/webservices/systemsplit

mit:

passwort admin
user admin

oder in docker-compose

User/Password setzen über

SPRING_CLIENT_USER=admin
SPRING_CLIENT_PASSWORD=geheimesPasswort

Running

Diese Anwendung erfordert Java 11 oder eine neuere Version .

Die Anwendung kann auf verschiedene Arten ausgeführt werden. Es muss jedoch immer Datenbanktreiber und application.yml abgelegt werden. Zum Beispiel:

bin
    start.bat
conf
    application.yml
lib
    Datenbanktreiber.jar
    application.jar

Ordner “bin”, “conf” und “lib” erstellen Inhalt von “bin”: start.bat -> bat-Datei enthält den Befehl zur Ausführung der Anwendung(Windows):

java -cp ../lib/nli-b2b-meteringpoints-to-index-wsdl-0.0.1-SNAPSHOT.jar -Dloader.path="<path>/lib" org.springframework.boot.loader.PropertiesLauncher --spring.config.location="<path>/conf/application.yml

Inhalt von “conf” -> application.yml (im Befehl beim Start der Anwendung setzen, um die Basis application.yml zu überschreiben) Inhalt von “lib” -> Datenbanktreiber.jar, application.jar

WSDL File

Diese WSDL-Datei kann verwendet werden, um den Soap-Update-Request zu erzeugen.

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://nextlevel.com/webservices/systemsplit"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://nextlevel.com/webservices/systemsplit"
             name="SystemsplitService"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">

    <types>
        <xsd:schema xmlns:tns="http://nextlevel.com/webservices/systemsplit" targetNamespace="http://nextlevel.com/webservices/systemsplit"
                    attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0">

            <xsd:complexType name="MeteringLocationNr">
                <xsd:simpleContent>
                    <xsd:extension base="xsd:string"></xsd:extension>
                </xsd:simpleContent>
            </xsd:complexType>

            <xsd:complexType name="MeteringLocationList">
                <xsd:sequence maxOccurs="unbounded" minOccurs="0">
                    <xsd:element name="minimalMeteringLocation" type="tns:MinimalMeteringLocation">
                        <xsd:annotation>
                            <xsd:documentation>List of MinimalMeteringLocation, may be empty.
                            </xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:complexType>

            <xsd:complexType name="MinimalMeteringLocation">
                <xsd:sequence maxOccurs="1" minOccurs="1">
                    <xsd:element name="meteringLocationNr" type="tns:MeteringLocationNr"></xsd:element>
                    <xsd:element name="mandant" type="xsd:string"></xsd:element>
                    <xsd:element name="system" type="xsd:string"></xsd:element>
                    <xsd:element name="startTime" type="xsd:dateTime">
                        <xsd:annotation>
                            <xsd:documentation>The inclusive start time of the time range for which
                                to meteringlocation holds.
                            </xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="endTime" type="xsd:dateTime">
                        <xsd:annotation>
                            <xsd:documentation>The inclusive end time for the meteringlocation to hold.
                                Must be larger or equal to startTime!
                            </xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:complexType>

            <xsd:element name="addMeteringlocation">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="minimalMeteringLocation" type="tns:MinimalMeteringLocation"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="addMeteringlocationList">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="meteringLocationList" type="tns:MeteringLocationList"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="updateMeteringlocation">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="minimalMeteringLocation" type="tns:MinimalMeteringLocation"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

            <xsd:complexType name="AddressLocation">
                <xsd:sequence maxOccurs="1" minOccurs="1">
                    <xsd:element name="address" type="xsd:string"></xsd:element>
                    <xsd:element name="mandant" type="xsd:string"></xsd:element>
                    <xsd:element name="system" type="xsd:string"></xsd:element>
                    <xsd:element name="startTime" type="xsd:dateTime">
                        <xsd:annotation>
                            <xsd:documentation>The inclusive start time of the time range for which
                                to addresslocation holds.
                            </xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="endTime" type="xsd:dateTime">
                        <xsd:annotation>
                            <xsd:documentation>The inclusive end time for the addresslocation to hold.
                                Must be larger or equal to startTime!
                            </xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:complexType>

            <xsd:element name="addAddressLocation">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="addressLocation" type="tns:AddressLocation"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

            <xsd:complexType name="BalanceDistrict">
                <xsd:sequence maxOccurs="1" minOccurs="1">
                    <xsd:element name="balanceDistrict" type="xsd:string"></xsd:element>
                    <xsd:element name="mandant" type="xsd:string"></xsd:element>
                    <xsd:element name="system" type="xsd:string"></xsd:element>
                    <xsd:element name="startTime" type="xsd:dateTime">
                        <xsd:annotation>
                            <xsd:documentation>The inclusive start time of the time range for
                                the validity of the balance district.
                            </xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="endTime" type="xsd:dateTime">
                        <xsd:annotation>
                            <xsd:documentation>The inclusive end time for the balance district.
                                Must be larger or equal to startTime!
                            </xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:complexType>

            <xsd:complexType name="BalancedMeteringLocationList">
                <xsd:sequence maxOccurs="unbounded" minOccurs="0">
                    <xsd:element name="balanceMeteringLocation" type="tns:BalancedMeteringLocation">
                        <xsd:annotation>
                            <xsd:documentation>List of BalanceMeteringLocation, may be empty.
                            </xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:complexType>

            <xsd:complexType name="BalancedMeteringLocation">
                <xsd:sequence maxOccurs="1" minOccurs="1">
                    <xsd:element name="meteringLocationNr" type="tns:MeteringLocationNr"></xsd:element>
                    <xsd:element name="mandant" type="xsd:string"></xsd:element>
                    <xsd:element name="system" type="xsd:string"></xsd:element>

                    <xsd:element name="startBalanceTime" type="xsd:dateTime">
                        <xsd:annotation>
                            <xsd:documentation>The inclusive start time of the time range for which
                                to meteringlocation holds.
                            </xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="endBalanceTime" type="xsd:dateTime">
                        <xsd:annotation>
                            <xsd:documentation>The inclusive end time for the meteringlocation to hold.
                                Must be larger or equal to startTime!
                            </xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="startTime" type="xsd:dateTime">
                        <xsd:annotation>
                            <xsd:documentation>The inclusive start time of the time range for which
                                to meteringlocation holds.
                            </xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="endTime" type="xsd:dateTime">
                        <xsd:annotation>
                            <xsd:documentation>The inclusive end time for the meteringlocation to hold.
                                Must be larger or equal to startTime!
                            </xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:complexType>

            <xsd:element name="addBalanceDistrict">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="balanceDistrict" type="tns:BalanceDistrict"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="addBalancedMeteringLocation">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="balancedMeteringLocation" type="tns:BalancedMeteringLocation"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="SystemsplitServiceFault" type="xsd:string"/>

        </xsd:schema>
    </types>

    <message name="addAddressLocationRequest">
        <part name="params" element="tns:addAddressLocation">
            <documentation></documentation>
        </part>
    </message>
    <message name="addAddressLocationResponse">
        <part name="params" element="xsd:string">
            <documentation></documentation>
        </part>
    </message>

    <message name="addBalanceDistrictRequest">
        <part name="params" element="tns:addBalanceDistrict">
            <documentation></documentation>
        </part>
    </message>
    <message name="addBalanceDistrictResponse">
        <part name="params" element="xsd:string">
            <documentation></documentation>
        </part>
    </message>

    <message name="addMeteringlocationRequest">
        <part name="params" element="tns:addMeteringlocation">
            <documentation></documentation>
        </part>
    </message>
    <message name="addMeteringlocationResponse">
        <part name="params" element="xsd:string">
            <documentation></documentation>
        </part>
    </message>

    <message name="updateMeteringlocationRequest">
        <part name="params" element="tns:updateMeteringlocation">
            <documentation></documentation>
        </part>
    </message>
    <message name="updateMeteringlocationResponse">
        <part name="params" element="xsd:string">
            <documentation></documentation>
        </part>
    </message>

    <message name="addMeteringlocationListRequest">
        <part name="params" element="tns:addMeteringlocationList">
            <documentation></documentation>
        </part>
    </message>
    <message name="addMeteringlocationListResponse">
        <part name="params" element="xsd:string">
            <documentation></documentation>
        </part>
    </message>

    <message name="addBalancedMeteringLocationRequest">
        <part name="params" element="tns:addBalancedMeteringLocation">
            <documentation></documentation>
        </part>
    </message>
    <message name="addBalancedMeteringLocationResponse">
        <part name="params" element="xsd:string">
            <documentation></documentation>
        </part>
    </message>
    <message name="getMeteringPointFromIndexRequest">
        <part name="meteringPointId" type="xsd:string">
            <documentation></documentation>
        </part>
    </message>
    <message name="getMeteringPointFromIndexResponse">
        <part name="messageResponse" type="tns:BalancedMeteringLocation">
            <documentation></documentation>
        </part>
    </message>
    <message name="getMeteringPointsFromIndexRequest">
        <part name="meteringPointId" type="xsd:string">
            <documentation></documentation>
        </part>
    </message>
    <message name="getMeteringPointsFromIndexResponse">
        <part name="messageResponse" type="tns:BalancedMeteringLocationList">
            <documentation></documentation>
        </part>
    </message>

    <message name="SystemsplitServiceException">
        <part name="message" element="tns:SystemsplitServiceFault">
            <documentation>An internal exception of the b2bbp engine occurred.
            </documentation>
        </part>
    </message>

    <portType name="SystemsplitService">
        <documentation>This message service provides an interface to the NLI-Systemsplit-Component.
            Specifically it provides methods to modify the systemsplit-index.
        </documentation>
        <operation name="updateMeteringlocation">
            <documentation>Method to update a meteringlocation from the meteringpoint-index.</documentation>
            <input message="tns:updateMeteringlocationRequest"></input>
            <output message="tns:updateMeteringlocationResponse"></output>
            <fault name="SystemsplitServiceFault" message="tns:SystemsplitServiceException">
                <documentation></documentation>
            </fault>
        </operation>
        <operation name="addMeteringlocation">
            <documentation>Method to add a meteringlocation to the meteringpoint-index.</documentation>
            <input message="tns:addMeteringlocationRequest"></input>
            <output message="tns:addMeteringlocationResponse"></output>
            <fault name="SystemsplitServiceFault" message="tns:SystemsplitServiceException">
                <documentation></documentation>
            </fault>
        </operation>
        <operation name="addMeteringlocationList">
            <documentation>Method to add a List of meteringlocation to the meteringpoint-index.</documentation>
            <input message="tns:addMeteringlocationListRequest"></input>
            <output message="tns:addMeteringlocationListResponse"></output>
            <fault name="SystemsplitServiceFault" message="tns:SystemsplitServiceException">
                <documentation></documentation>
            </fault>
        </operation>
        <operation name="getMeteringPointsFromIndex">
            <documentation>Method to get information of meteringpoint if it exists in the meteringpoint index</documentation>
            <input message="tns:getMeteringPointsFromIndexRequest"></input>
            <output message="tns:getMeteringPointsFromIndexResponse"></output>
            <fault name="SystemsplitServiceFault" message="tns:SystemsplitServiceException">
                <documentation></documentation>
            </fault>
        </operation>
    </portType>


    <binding name="SystemsplitServiceBinding" type="tns:SystemsplitService">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="updateMeteringlocation">
            <soap:operation soapAction="http://nextlevel.com/webservices/systemsplit/updateMeteringlocation"/>
            <input>
                <soap:body use="literal" namespace="http://nextlevel.com/webservices/systemsplit"/>
            </input>
            <output>
                <soap:body use="literal" namespace="http://nextlevel.com/webservices/systemsplit"/>
            </output>
            <fault name="SystemsplitServiceFault">
                <soap:fault use="literal" name="SystemsplitServiceFault"/>
            </fault>
        </operation>
        <operation name="addMeteringlocation">
            <soap:operation soapAction="http://nextlevel.com/webservices/systemsplit/addMeteringlocation"/>
            <input>
                <soap:body use="literal" namespace="http://nextlevel.com/webservices/systemsplit"/>
            </input>
            <output>
                <soap:body use="literal" namespace="http://nextlevel.com/webservices/systemsplit"/>
            </output>
            <fault name="SystemsplitServiceFault">
                <soap:fault use="literal" name="SystemsplitServiceFault"/>
            </fault>
        </operation>
        <operation name="addMeteringlocationList">
            <soap:operation soapAction="http://nextlevel.com/webservices/systemsplit/addMeteringlocationList"/>
            <input>
                <soap:body use="literal" namespace="http://nextlevel.com/webservices/systemsplit"/>
            </input>
            <output>
                <soap:body use="literal" namespace="http://nextlevel.com/webservices/systemsplit"/>
            </output>
            <fault name="SystemsplitServiceFault">
                <soap:fault use="literal" name="SystemsplitServiceFault"/>
            </fault>
        </operation>
        <operation name="getMeteringPointsFromIndex">
            <soap:operation soapAction="http://nextlevel.com/webservices/systemsplit/getMeteringPointsFromIndex"/>
            <input>
                <soap:body use="literal" namespace="http://nextlevel.com/webservices/systemsplit"/>
            </input>
            <output>
                <soap:body use="literal" namespace="http://nextlevel.com/webservices/systemsplit"/>
            </output>
            <fault name="SystemsplitServiceFault">
                <soap:fault use="literal" name="SystemsplitServiceFault"/>
            </fault>
        </operation>
    </binding>

    <service name="SystemsplitService">
        <port name="SystemsplitServicePort" binding="tns:SystemsplitServiceBinding">
            <soap:address location="http://localhost:9000/webservices/systemsplit"/>
        </port>
    </service>
</definitions>

SOAP-Request and Authentication

Die SOAP-Anfragen können in der SOAP-UI generiert werden, wenn die WSDL-Datei dem Soap-Projekt hinzugefügt wird.

Gerade wird es wss-password-type nicht unterschtutzt!!! nur Basic Security

Der konfigurierte Benutzer und das Passwort in der application.yml können in den Properties der Anfragen gesetzt werden:

Die Authentifizierungsdaten können aber auch im Header der Anfrage gesetzt werden. Dies kann ebenfalls in der SOAP-UI erfolgen:

Eine Anfrage (ohne Authentifizierungs-Header, Daten werden in Property gesetzt) ist wie folgt aufgebaut:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://nextlevel.com/webservices/systemsplit">
	<soapenv:Header/>
	<soapenv:Body>
		<sys:addMeteringlocationList>
			<sys:meteringLocationList>
				<sys:minimalMeteringLocation>
					<sys:meteringLocationNr>12345678911</sys:meteringLocationNr>
					<sys:mandant>MAN</sys:mandant>
					<sys:system>SYS</sys:system>
					<sys:startTime>2019-08-15T00:00:00Z</sys:startTime>
					<sys:endTime>2023-07-15T00:00:00Z</sys:endTime>
				</sys:minimalMeteringLocation>
			</sys:meteringLocationList>
		</sys:addMeteringlocationList>
	</soapenv:Body>
</soapenv:Envelope>

Anzeigefehler der Dokumentensuche im Indexmanagement nach Durchführung des Updates (nur alte UI)

Es gibt nach durchführen des Updates einen Anzeigefehler in der Dokumentensuche im Indexmanagement, was jedoch keinen Einfluss auf die Verarbeitung hat. Workaround: Nach dem Update könnte man eine Optimierung vornehmen: http://b2bbp.next-level-help.org/b2b_cust_DeleteIndexJob.html

Alte Implementierung in b2b

Alte Implementierung in b2b (teilweise) webservice

Tags:
View Me   Edit Me