11.11. 서비스 활성화기

11.11.1. 개요

그림 11.9. “서비스 활성화 패턴” 에 표시된 서비스 활성화 패턴은 들어오는 요청 메시지에 대한 응답으로 서비스의 작업을 호출하는 시나리오를 설명합니다. 서비스 활성화기는 작업 매개 변수로 사용할 데이터를 호출하고 추출할 작업을 식별합니다. 마지막으로 서비스 활성화기는 메시지에서 추출된 데이터를 사용하여 작업을 호출합니다. 작업 호출은 oneway(요청만 해당) 또는 양방향(요청/반복)일 수 있습니다.

그림 11.9. 서비스 활성화 패턴

서비스 활성화자 패턴

많은 측면에서 서비스 활성화기가 기존의 원격 프로시저 호출(RPC)과 유사합니다. 여기서 작업 호출은 메시지로 인코딩됩니다. 가장 큰 차이점은 서비스 활성화자가 보다 유연해야 한다는 것입니다. RPC 프레임워크는 요청 및 응답 메시지 인코딩을 표준화하는 반면(예: 웹 서비스 작업은 Loki 메시지로 인코딩되는 반면, 서비스 활성화기는 일반적으로 메시징 시스템과 서비스 작업 간의 매핑을 방해해야 합니다.

11.11.2. Cryostat 통합

Apache Camel이 서비스 활성화 패턴을 지원하기 위해 제공하는 주요 메커니즘은 8080 통합 입니다. Cryostat 통합 은 들어오는 메시지를 Java 객체의 메서드 호출에 매핑하는 일반적인 프레임워크를 제공합니다. 예를 들어 Java fluent DSL은 등록된 Java Ignition에서 메서드를 호출하기 위해 경로에 삽입할 수 있는 utility () 및 8080Ref() 프로세서를 제공합니다. 메시지 데이터의 Java 메서드 매개 변수에 대한 자세한 매핑은 8080 바인딩에 따라 결정되며, 이 바인딩은 8080 클래스에 주석을 추가하여 구현할 수 있습니다.

예를 들어 Java 메서드 bankBean.getUserAccBalance() 를 호출하는 다음 경로를 사용하여 JMS/ActiveMQ 큐에서 들어오는 서비스 요청을 고려하십시오.

from("activemq:BalanceQueries")
  .setProperty("userid", xpath("/Account/BalanceQuery/UserID").stringResult())
  .beanRef("bankBean", "getUserAccBalance")
  .to("velocity:file:src/scripts/acc_balance.vm")
  .to("activemq:BalanceResults");

ActiveMQ 엔드포인트 activemq:BalanceQueries 에서 가져온 메시지에는 은행 계정의 사용자 ID를 제공하는 간단한 XML 형식이 있습니다. 예를 들면 다음과 같습니다.

<?xml version='1.0' encoding='UTF-8'?>
<Account>
  <BalanceQuery>
    <UserID>James.Strachan</UserID>
  </BalanceQuery>
</Account>

경로의 첫 번째 프로세서인 setProperty()In 메시지에서 사용자 ID를 추출하여 userid exchange 속성에 저장합니다. 8080을 호출한 후에는 In 헤더를 사용할 수 없으므로 헤더에 저장하는 것이 좋습니다.

서비스 활성화 단계는 ingress Ref() 프로세서에서 수행합니다. 이 프로세서는 들어오는 메시지를 bankBean VLAN ID로 식별되는 Java 개체의 getUserAccBalance() 메서드에 바인딩합니다. 다음 코드에서는 bankBean 클래스의 샘플 구현을 보여줍니다.

package tutorial;

import org.apache.camel.language.XPath;

public class BankBean {
    public int getUserAccBalance(@XPath("/Account/BalanceQuery/UserID") String user) {
        if (user.equals("James.Strachan")) {
            return 1200;
        }
        else {
            return 0;
        }
      }
}

메시지 데이터의 바인딩이 메서드 매개 변수에 의해 활성화되는 경우 @XPath 주석으로 UserID XML 요소의 콘텐츠를 사용자 메서드 매개 변수에 삽입합니다. 호출이 완료되면 반환 값이 Out 메시지의 본문에 삽입되고 경로의 다음 단계에 대해 In 메시지에 복사됩니다. 8080 Ref() 프로세서에서 빈 에 액세스하려면 Spring XML로 인스턴스를 인스턴스화해야 합니다. 예를 들어 META-INF/spring/camel-context.xml 구성 파일에 다음 행을 추가하여 Ignition을 인스턴스화할 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans ... >
  ...
  <bean id="bankBean" class="tutorial.BankBean"/>
</beans>

여기서 8080 ID, bankBean 에서는 레지스트리에 이 빈 인스턴스를 유휴 상태로 설정합니다.

빈 호출의 출력은 Velocity 템플릿에 삽입되어 올바르게 포맷된 결과 메시지를 생성합니다. Velocity 엔드포인트, speed :file:src/scripts/acc_balance.vm 에서는 다음 콘텐츠를 사용하여 속도 스크립트의 위치를 지정합니다.

<?xml version='1.0' encoding='UTF-8'?>
<Account>
  <BalanceResult>
    <UserID>${exchange.getProperty("userid")}</UserID>
    <Balance>${body}</Balance>
  </BalanceResult>
</Account>

교환 인스턴스는 ${ exchange.getProperty("userid")}를 사용하여 사용자 ID 교환 속성을 검색할 수 있는 Velocity 변수, exchange 로 사용할 수 있습니다. 현재 In 메시지( ${body} )의 본문에는 getUserAccBalance() 메서드 호출의 결과가 포함됩니다.