Apache Camel의 Java 프로그래밍 시작 안내서

7962 단어 CamelJava
Apache Camel은 매우 실용적인 규칙 엔진 라이브러리로 서로 다른 원본에서 온 사건과 정보를 처리할 수 있다.다른 프로토콜, 예를 들어 VM, HTTP, FTP, JMS, 심지어 파일 시스템에서 메시지를 전달할 수 있고 조작 논리와 전달 논리를 분리할 수 있습니다. 이것은 메시지의 내용에 더욱 집중할 수 있습니다.
이 글에서 저는 Java 언어 (비Groovy) 의 Apache Camel 입문 프레젠테이션을 제공할 것입니다.
먼저 Maven 프로젝트의pom을 만듭니다.xml.
 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
 
<modelVersion>4.0.0</modelVersion>
<groupId>camel-spring-demo</groupId>
<artifactId>camel-spring-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
 
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<camel.version>2.11.1</camel.version>
</properties>
 
<dependencies>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
</dependencies>
 
</project>
여기서 우리는 camel-core만 썼다.jar 패키지는 실제로 당신이 사용할 수 있는 실용적인 구성 요소를 많이 제공합니다.로그 기록의 목적에서 나는 slf4j-simple을 사용하여 로그 기록의 실현을 실현했고 우리는 컨트롤러에서 출력을 볼 수 있었다.
다음에 우리는 단지 하나의 루트 유형을 구성할 수 있을 뿐이다.경로는 Camel에서 메시지를 한쪽에서 다른 한쪽으로 어떻게 전달하는지에 대한 명령 정의와 같다.src/main/java/camelcoredemo/TimerRouteBuilder를 만들 것입니다.java 파일, 1초마다 프로세서에 메시지를 보내서 간단하게 출력합니다.
 

package camelcoredemo;
 
import org.slf4j.*;
import org.apache.camel.*;
import org.apache.camel.builder.*;
 
public class TimerRouteBuilder extends RouteBuilder {
static Logger LOG = LoggerFactory.getLogger(TimerRouteBuilder.class);
public void configure() {
from("timer://timer1?period=1000")
.process(new Processor() {
public void process(Exchange msg) {
LOG.info("Processing {}", msg);
}
});
}
}
이상은 이 예시의 전부입니다. 지금 컴파일하여 실행합니다.

bash> mvn compile
bash> mvn exec:java -Dexec.mainClass=org.apache.camel.main.Main -Dexec.args='-r camelcoredemo.TimerRouteBuilder'

여기에서 우리는 자바 클래스의main 입구를 작성하지 않았습니다. 우리는 RouteBuilder의 클래스 이름을 매개 변수로 org에 간단하게 전달할 뿐입니다.apache.camel.main.ain, 그러면 라우팅이 자동으로 로드됩니다.
CamelContext 제어
Camel을 시작하면 CamelContext 객체를 만듭니다. 이 객체는 Camel을 실행하는 방법에 대한 많은 정보를 가지고 있으며, 우리가 만든 Route에 대한 정의도 포함되어 있습니다.현재 CamelContext를 통해 더 많은 제어를 얻고 싶다면, 메인 코드를 작성해야 합니다.나는 여기서 간단한 예를 하나 들겠다.
 

package camelcoredemo;
 
 
 
 
import org.slf4j.*;
import org.apache.camel.*;
import org.apache.camel.impl.*;
import org.apache.camel.builder.*;
 
 
 
 
public class TimerMain {
static Logger LOG = LoggerFactory.getLogger(TimerMain.class);
public static void main(String[] args) throws Exception {
new TimerMain().run();
}
void run() throws Exception {
final CamelContext camelContext = new DefaultCamelContext();
camelContext.addRoutes(createRouteBuilder());
camelContext.setTracing(true);
camelContext.start();
 
 
 
 
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
camelContext.stop();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
 
 
 
 
waitForStop();
}
RouteBuilder createRouteBuilder() {
return new TimerRouteBuilder();
}
void waitForStop() {
while (true) {
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {
break;
}
}
}
}
createRouteBuilder () 방법에서 기존 TimerRouteBuilder 클래스를 다시 사용한 것을 볼 수 있습니다.현재 우리의 메인 클래스는 언제 CamelContext를 만들고, 시작하고, 정지하는지에 대해 완전한 통제를 가지고 있다.context (camelContext) 대상은 Route 레벨이 아니라 Camel을 설정하는 방법을 전역적으로 제어할 수 있습니다.그것의 JavaDoc 링크는 모든 setter 방법을 제공합니다. 무엇을 할 수 있는지 연구할 수 있습니다.
한 가지 주의해야 할 것은, 우리도 우리의 메인 클래스에 소량의 설정 코드를 제공해야 한다는 것이다.우선 우아하게 닫는 문제를 처리해야 하기 때문에 자바 닫기 리셋 함수를 추가해서 context의stop () 방법을 호출합니다.그 다음에context가 시작된 후에 우리는 스레드 막힘을 추가해야 한다.만약 시동이 걸린 후에 당신이 메인 라인을 막지 않는다면, 그것은 시동이 걸린 후에 간단하게 퇴출될 것이다. 그러면 아무 소용이 없을 것이다.Ctrl + C 키를 눌러 프로세스를 종료할 때까지 Camel을 서비스처럼 실행합니다.
시작 CamelContext의 마스터 클래스 개선
위의 예처럼 메인 클래스 설정 코드를 너무 많이 처리하고 싶지 않으면,camel-core가 제공하는 org를 간단하게 계승할 수 있습니다.apache.camel.main.Main 클래스를 대체합니다.이 클래스를 이용하면 context를 자동으로 설정할 수 있을 뿐만 아니라, 프로세스가 얼마나 실행되는지, 추적을 활성화하고, 사용자 정의 루트 클래스를 불러오는 등 모든 추가 명령행 특성을 얻을 수 있습니다.
다음 예제를 재구성했습니다. 코드는 다음과 같습니다.
 

package camelcoredemo;
 
import org.slf4j.*;
import org.apache.camel.builder.*;
import org.apache.camel.main.Main;
 
public class TimerMain2 extends Main {
static Logger LOG = LoggerFactory.getLogger(TimerMain2.class);
public static void main(String[] args) throws Exception {
TimerMain2 main = new TimerMain2();
main.enableHangupSupport();
main.addRouteBuilder(createRouteBuilder());
main.run(args);
}
static RouteBuilder createRouteBuilder() {
return new TimerRouteBuilder();
}
}
현재 TimerMain 2류의 코드는 이전의 코드보다 더 적습니다. 이전의 기능과 같아야 합니다.
 

bash> mvn compile
bash> mvn exec:java -Dexec.mainClass=camelcoredemo.TimerMain2 -Dexec.args='-t'
-t 옵션을 제시하면 Route 추적을 저장합니다.-h를 사용하면 사용 가능한 모든 옵션을 볼 수 있습니다.
Camel 등록 메커니즘으로 bean 추가
이전 TimerRouteBuilder 예에서 코드에 익명 Processor를 만들었습니다.현재 몇 개의 다른 Processor를 함께 놓고 싶다면, Camel의 등록 메커니즘을 사용하여 bean을 추가하는 방식은 코드의 혼란을 더욱 줄일 수 있습니다.Camel은 프로세스를 bean으로registry 공간에 주입하고 bean 구성 요소로 호출할 수 있도록 합니다.다음은 내 재구성 코드입니다.
 

package camelcoredemo;
 
import org.slf4j.*;
import org.apache.camel.*;
import org.apache.camel.builder.*;
import org.apache.camel.main.Main;
 
public class TimerBeansMain extends Main {
static Logger LOG = LoggerFactory.getLogger(TimerBeansMain.class);
public static void main(String[] args) throws Exception {
TimerBeansMain main = new TimerBeansMain();
main.enableHangupSupport();
main.bind("processByBean1", new Bean1());
main.bind("processAgainByBean2", new Bean2());
main.addRouteBuilder(createRouteBuilder());
main.run(args);
}
static RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() {
from("timer://timer1?period=1000")
.to("bean:processByBean1")
.to("bean:processAgainByBean2");
}
};
}
 
// Processor beans
static class Bean1 implements Processor {
public void process(Exchange msg) {
LOG.info("First process {}", msg);
}
}
static class Bean2 implements Processor {
public void process(Exchange msg) {
LOG.info("Second process {}", msg);
}
}
}
현재 루트 클래스는 더욱 간결하고 명확해졌으며, 동시에 처리 코드도 독립된 클래스로 재구성되었다.업무 논리를 실현하기 위해 복잡한 루트를 작성해야 할 때, 이런 방식은 코드를 더욱 잘 조직하고 테스트하는 데 도움을 줄 수 있다.레고 블록처럼 복용할 수 있는 POJO bean을 구축할 수 있습니다. Camel의registry space 역시 다른 많은 용도로 사용할 수 있습니다. 예를 들어 추가 기능을 가진 endpoint 구성 요소를 사용자 정의하거나 정보를 등록하거나 라인 탱크를 대체하여 정책 내의 일을 실현할 수 있습니다.
위의 Route 예는 소위 Java DSL로 구성되어 있으며 가독성이 높기 때문에 IDE가 제공하는 지원으로 Route에 사용할 수 있는 모든 방법을 볼 수 있습니다.
나는 이 문장이 네가 Camel의 탐색 단계를 뛰어넘는 데 도움을 줄 수 있기를 바란다.

좋은 웹페이지 즐겨찾기