290.14. SAP 예
290.14.1. 예 1: SAP의 데이터
290.14.1. 개요
이 예제에서는 SAP에서 FlightCustomer
비즈니스 개체 데이터를 읽는 경로를 보여줍니다. 이 경로는 SAP 동기 RFC 대상 끝점을 사용하여 데이터를 검색하는 데 FlightCustomer
BAPI 메서드인 BAPI_FLCUST_GETLIST
를 호출합니다.
290.14.2. 라우팅을 위한 Java DSL
예제 경로의 Java DSL은 다음과 같습니다.
from("direct:getFlightCustomerInfo") .to("bean:createFlightCustomerGetListRequest") .to("sap-srfc-destination:nplDest:BAPI_FLCUST_GETLIST") .to("bean:returnFlightCustomerInfo");
290.14.3. 라우팅을 위한 XML DSL
동일한 경로에 대한 Spring DSL은 다음과 같습니다.
<route> <from uri="direct:getFlightCustomerInfo"/> <to uri="bean:createFlightCustomerGetListRequest"/> <to uri="sap-srfc-destination:nplDest:BAPI_FLCUST_GETLIST"/> <to uri="bean:returnFlightCustomerInfo"/> </route>
290.14.4. createFlightCustomerGetListRequest bean
createFlightCustomerGetListRequest
Quarkus는 후속 SAP 끝점의 RFC 호출에 사용된 교환 방법으로 SAP 요청 오브젝트를 빌드합니다. 다음 코드 조각은 요청 오브젝트를 빌드하는 일련의 작업을 보여줍니다.
public void create(Exchange exchange) throws Exception { // Get SAP Endpoint to be called from context. SapSynchronousRfcDestinationEndpoint endpoint = exchange.getContext().getEndpoint("sap-srfc-destination:nplDest:BAPI_FLCUST_GETLIST", SapSynchronousRfcDestinationEndpoint.class); // Retrieve bean from message containing Flight Customer name to // look up. BookFlightRequest bookFlightRequest = exchange.getIn().getBody(BookFlightRequest.class); // Create SAP Request object from target endpoint. Structure request = endpoint.getRequest(); // Add Customer Name to request if set if (bookFlightRequest.getCustomerName() != null && bookFlightRequest.getCustomerName().length() > 0) { request.put("CUSTOMER_NAME", bookFlightRequest.getCustomerName()); } } else { throw new Exception("No Customer Name"); } // Put request object into body of exchange message. exchange.getIn().setBody(request); }
290.14.5. returnFlightCustomerInfo bean
returnFlightCustomerInfo
Quarkus는 이전 SAP 끝점에서 수신하는 교환 방법으로 SAP 응답 오브젝트에서 데이터를 추출해야 합니다. 다음 코드 조각은 응답 개체에서 데이터를 추출하는 일련의 작업을 보여줍니다.
public void createFlightCustomerInfo(Exchange exchange) throws Exception { // Retrieve SAP response object from body of exchange message. Structure flightCustomerGetListResponse = exchange.getIn().getBody(Structure.class); if (flightCustomerGetListResponse == null) { throw new Exception("No Flight Customer Get List Response"); } // Check BAPI return parameter for errors @SuppressWarnings("unchecked") Table<Structure> bapiReturn = flightCustomerGetListResponse.get("RETURN", Table.class); Structure bapiReturnEntry = bapiReturn.get(0); if (bapiReturnEntry.get("TYPE", String.class) != "S") { String message = bapiReturnEntry.get("MESSAGE", String.class); throw new Exception("BAPI call failed: " + message); } // Get customer list table from response object. @SuppressWarnings("unchecked") Table<? extends Structure> customerList = flightCustomerGetListResponse.get("CUSTOMER_LIST", Table.class); if (customerList == null || customerList.size() == 0) { throw new Exception("No Customer Info."); } // Get Flight Customer data from first row of table. Structure customer = customerList.get(0); // Create bean to hold Flight Customer data. FlightCustomerInfo flightCustomerInfo = new FlightCustomerInfo(); // Get customer id from Flight Customer data and add to bean. String customerId = customer.get("CUSTOMERID", String.class); if (customerId != null) { flightCustomerInfo.setCustomerNumber(customerId); } ... // Put bean into body of exchange message. exchange.getIn().setHeader("flightCustomerInfo", flightCustomerInfo); }
290.14.2. 예 2: SAP에 데이터 작성
290.14.6. 개요
이 예에서는 SAP에서 FlightTrip
비즈니스 개체 인스턴스를 생성하는 경로를 보여줍니다. 경로는 대상 끝점을 사용하여 오브젝트를 생성하여 FlightTrip
BAPI 메서드 BAPI_FLTRIP_CREATE
를 호출합니다.
290.14.7. 라우팅을 위한 Java DSL
예제 경로의 Java DSL은 다음과 같습니다.
from("direct:createFlightTrip") .to("bean:createFlightTripRequest") .to("sap-srfc-destination:nplDest:BAPI_FLTRIP_CREATE?transacted=true") .to("bean:returnFlightTripResponse");
290.14.8. 라우팅을 위한 XML DSL
동일한 경로에 대한 Spring DSL은 다음과 같습니다.
<route> <from uri="direct:createFlightTrip"/> <to uri="bean:createFlightTripRequest"/> <to uri="sap-srfc-destination:nplDest:BAPI_FLTRIP_CREATE?transacted=true"/> <to uri="bean:returnFlightTripResponse"/> </route>
290.14.9. 트랜잭션 지원
SAP 엔드포인트의 URL에는 transacted
옵션이 true
로 설정되어 있습니다. 290.11절. “트랜잭션 지원” 에서 설명한 대로 이 옵션이 활성화되면 끝점은 RFC 호출을 호출하기 전에 SAP 트랜잭션 세션이 시작되었는지 확인합니다. 이 끝점의 RFC는 SAP에서 새 데이터를 생성하므로 SAP에서 경로를 영구적으로 변경하려면 이 옵션이 필요합니다.
290.14.10. 요청 매개변수 채우기
createFlightTripRequest
및 returnFlightTripResponse
빈은 요청 매개변수를 SAP 요청으로 채우고 SAP 응답에서 응답 매개 변수를 각각 추출하고 이전 예제에서 설명한 것과 동일한 작업 순서에 따라 각각 SAP 응답에서 응답 매개변수를 추출합니다.
290.14.3. 예 3: SAP에서 요청을 처리
290.14.11. 개요
이 예제에서는 경로에 의해 구현된 BOOK_FLIGHT
RFC로의 SAP 요청을 처리하는 경로를 보여줍니다. 또한, 이는 구성 요소의 XML 직렬화 지원을 보여줍니다. 이 지원을 통해 CryostatB를 사용하여 SAP 요청 개체 및 응답 개체를 사용자 지정 빈에 분리하고 마샬링합니다.
이 경로는 여행 에이전트를 대신하여 FlightTrip
비즈니스 개체를 생성합니다. FlightCustomer
. 이 경로는 먼저 SAP 서버 엔드포인트에서 수신한 SAP 요청 오브젝트를 사용자 지정 CryostatB 8080으로 묶습니다. 그런 다음 이 사용자 지정 8080은 트립션을 생성하는 데 필요한 여행 에이전트, 트래블 연결 및 여객 정보를 수집하는 3개의 하위 경로로 멀티 캐스트됩니다. 최종 하위 경로는 이전 예와 같이 SAP에서 여행 오브젝트를 생성합니다. 최종 하위 경로도 만들고 반환 하는 사용자 지정 CryostatB 8080은 SAP 응답 개체로 마샬링되고 서버 끝점에 의해 반환 됩니다.
290.14.12. 라우팅을 위한 Java DSL
예제 경로의 Java DSL은 다음과 같습니다.
DataFormat jaxb = new JaxbDataFormat("org.fusesource.sap.example.jaxb"); from("sap-srfc-server:nplserver:BOOK_FLIGHT") .unmarshal(jaxb) .multicast() .to("direct:getFlightConnectionInfo", "direct:getFlightCustomerInfo", "direct:getPassengerInfo") .end() .to("direct:createFlightTrip") .marshal(jaxb);
290.14.13. 라우팅을 위한 XML DSL
동일한 경로에 대한 XML DSL은 다음과 같습니다.
<route> <from uri="sap-srfc-server:nplserver:BOOK_FLIGHT"/> <unmarshal> <jaxb contextPath="org.fusesource.sap.example.jaxb"/> </unmarshal> <multicast> <to uri="direct:getFlightConnectionInfo"/> <to uri="direct:getFlightCustomerInfo"/> <to uri="direct:getPassengerInfo"/> </multicast> <to uri="direct:createFlightTrip"/> <marshal> <jaxb contextPath="org.fusesource.sap.example.jaxb"/> </marshal> </route>
290.14.14. BookFlightRequest bean
다음 목록에서는 직렬화된 형식의 SAP BOOK_FLIGHT
요청 오브젝트에서 요약하지 않는 CryostatB 8080을 보여줍니다.
@XmlRootElement(name="Request", namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT") @XmlAccessorType(XmlAccessType.FIELD) public class BookFlightRequest { @XmlAttribute(name="CUSTNAME") private String customerName; @XmlAttribute(name="FLIGHTDATE") @XmlJavaTypeAdapter(DateAdapter.class) private Date flightDate; @XmlAttribute(name="TRAVELAGENCYNUMBER") private String travelAgencyNumber; @XmlAttribute(name="DESTINATION_FROM") private String startAirportCode; @XmlAttribute(name="DESTINATION_TO") private String endAirportCode; @XmlAttribute(name="PASSFORM") private String passengerFormOfAddress; @XmlAttribute(name="PASSNAME") private String passengerName; @XmlAttribute(name="PASSBIRTH") @XmlJavaTypeAdapter(DateAdapter.class) private Date passengerDateOfBirth; @XmlAttribute(name="CLASS") private String flightClass; ... }
290.14.15. BookFlightResponse bean
다음 목록은 SAP BOOK_FLIGHT
응답 오브젝트의 직렬화된 형식으로 마샬링하는 CryostatB 8080을 보여줍니다.
@XmlRootElement(name="Response", namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT") @XmlAccessorType(XmlAccessType.FIELD) public class BookFlightResponse { @XmlAttribute(name="TRIPNUMBER") private String tripNumber; @XmlAttribute(name="TICKET_PRICE") private BigDecimal ticketPrice; @XmlAttribute(name="TICKET_TAX") private BigDecimal ticketTax; @XmlAttribute(name="CURRENCY") private String currency; @XmlAttribute(name="PASSFORM") private String passengerFormOfAddress; @XmlAttribute(name="PASSNAME") private String passengerName; @XmlAttribute(name="PASSBIRTH") @XmlJavaTypeAdapter(DateAdapter.class) private Date passengerDateOfBirth; @XmlElement(name="FLTINFO") private FlightInfo flightInfo; @XmlElement(name="CONNINFO") private ConnectionInfoTable connectionInfo; ... }
응답 오브젝트의 complex 매개변수 필드는 응답의 하위 요소로 직렬화됩니다.
290.14.16. FlightInfo bean
다음 목록에서는 복잡한 구조 매개변수 FLTINFO
의 직렬화된 형태로 마샬링하는 CryostatB 8080을 보여줍니다.
@XmlRootElement(name="FLTINFO", namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT") @XmlAccessorType(XmlAccessType.FIELD) public class FlightInfo { @XmlAttribute(name="FLIGHTTIME") private String flightTime; @XmlAttribute(name="CITYFROM") private String cityFrom; @XmlAttribute(name="DEPDATE") @XmlJavaTypeAdapter(DateAdapter.class) private Date departureDate; @XmlAttribute(name="DEPTIME") @XmlJavaTypeAdapter(DateAdapter.class) private Date departureTime; @XmlAttribute(name="CITYTO") private String cityTo; @XmlAttribute(name="ARRDATE") @XmlJavaTypeAdapter(DateAdapter.class) private Date arrivalDate; @XmlAttribute(name="ARRTIME") @XmlJavaTypeAdapter(DateAdapter.class) private Date arrivalTime; ... }
290.14.17. ConnectionInfoTable 8080
다음 목록은 복잡한 테이블 매개변수인 CONNINFO
의 직렬화된 형식으로 마샬링하는 CryostatB 8080을 보여줍니다.
CryostatB 8080의 루트 요소 유형의 이름은 _
Cryostat로 접미사가 지정된 행 구조 유형의 이름에 해당하며, Cryostat에는 행 요소 목록이 포함됩니다.
@XmlRootElement(name="CONNINFO_TABLE", namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT") @XmlAccessorType(XmlAccessType.FIELD) public class ConnectionInfoTable { @XmlElement(name="row") List<ConnectionInfo> rows; ... }
290.14.18. ConnectionInfo bean
다음 목록은 위의 테이블 행 요소의 직렬화된 형식으로 마샬링하는 CryostatB 8080을 보여줍니다.
@XmlRootElement(name="CONNINFO", namespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT") @XmlAccessorType(XmlAccessType.FIELD) public class ConnectionInfo { @XmlAttribute(name="CONNID") String connectionId; @XmlAttribute(name="AIRLINE") String airline; @XmlAttribute(name="PLANETYPE") String planeType; @XmlAttribute(name="CITYFROM") String cityFrom; @XmlAttribute(name="DEPDATE") @XmlJavaTypeAdapter(DateAdapter.class) Date departureDate; @XmlAttribute(name="DEPTIME") @XmlJavaTypeAdapter(DateAdapter.class) Date departureTime; @XmlAttribute(name="CITYTO") String cityTo; @XmlAttribute(name="ARRDATE") @XmlJavaTypeAdapter(DateAdapter.class) Date arrivalDate; @XmlAttribute(name="ARRTIME") @XmlJavaTypeAdapter(DateAdapter.class) Date arrivalTime; ... }