12.6. Apache Camel과의 통합

12.6.1. 개요

Apache Camel은 Cryostat 언어를 사용하여 OSGi 서비스를 쉽게 호출할 수 있는 방법을 제공합니다. 이 기능은 Apache Camel 애플리케이션을 OSGi 컨테이너에 배포할 때마다 자동으로 사용할 수 있으며 특별한 구성이 필요하지 않습니다.

12.6.2. 레지스트리 연결

Apache Camel 경로가 OSGi 컨테이너에 배포되면 CamelContext 에서 빈 인스턴스를 해결하기 위해 레지스트리 체인을 자동으로 설정합니다. 레지스트리 체인은 OSGi 레지스트리와 블루프린트 레지스트리로 구성됩니다. 이제 특정 8080 클래스 또는 빈 인스턴스를 참조하려고 하면 레지스트리에서 다음과 같이 빈을 확인합니다.

  1. 먼저 OSGi 레지스트리에서 8080을 조회합니다. 클래스 이름이 지정된 경우 OSGi 서비스의 인터페이스 또는 클래스와 일치하십시오.
  2. OSGi 레지스트리에 일치하는 항목이 없는 경우 블루프린트 레지스트리에 대체하십시오.

12.6.3. OSGi 서비스 인터페이스 샘플

단일 메서드인 getGreeting() 을 정의하는 다음 Java 인터페이스로 정의된 OSGi 서비스를 고려하십시오.

package org.fusesource.example.hello.boston;

public interface HelloBoston {
    public String getGreeting();
}

12.6.4. 샘플 서비스 내보내기

HelloBoston OSGi 서비스를 구현하는 번들을 정의할 때 다음 블루프린트 구성을 사용하여 서비스를 내보낼 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

  <bean id="hello" class="org.fusesource.example.hello.boston.HelloBostonImpl"/>

  <service ref="hello" interface="org.fusesource.example.hello.boston.HelloBoston"/>

</blueprint>

여기서 HelloBoston 인터페이스는 HelloBostonImpl 클래스에서 구현되어 있지 않다고 가정합니다.

12.6.5. Java DSL에서 OSGi 서비스 호출

HelloBoston OSGi 서비스가 포함된 번들을 배포한 후 Java DSL을 사용하여 Apache Camel 애플리케이션에서 서비스를 호출할 수 있습니다. Java DSL에서는 다음과 같이 Cryostat 언어를 통해 OSGi 서비스를 호출합니다.

from("timer:foo?period=5000")
  .bean(org.fusesource.example.hello.boston.HelloBoston.class, "getGreeting")
  .log("The message contains: ${body}")

8080 명령에서 첫 번째 인수는 OSGi 인터페이스 또는 클래스이며 OSGi 서비스 번들에서 내보낸 인터페이스와 일치해야 합니다. 두 번째 인수는 호출하려는 8080 메서드의 이름입니다. Quarkus 명령 구문에 대한 자세한 내용은 Apache Camel Development Guide Cryostat Integration 을 참조하십시오.

참고

이 방법을 사용하면 OSGi 서비스를 암시적으로 가져옵니다. 이 경우 OSGi 서비스를 명시적으로 가져올 필요가 없습니다.

12.6.6. XML DSL에서 OSGi 서비스 호출

XML DSL에서는 Cryostat 언어를 사용하여 HelloBoston OSGi 서비스를 호출할 수도 있지만 구문은 약간 다릅니다. XML DSL에서는 다음과 같이 method 요소를 사용하여 Cryostat 언어를 통해 OSGi 서비스를 호출합니다.

<beans ...>
  <camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
      <from uri="timer:foo?period=5000"/>
      <setBody>
          <method ref="org.fusesource.example.hello.boston.HelloBoston" method="getGreeting"/>
      </setBody>
      <log message="The message contains: ${body}"/>
    </route>
  </camelContext>
</beans>
참고

이 방법을 사용하면 OSGi 서비스를 암시적으로 가져옵니다. 이 경우 OSGi 서비스를 명시적으로 가져올 필요가 없습니다.