聞く:
クラウド イベントを Spring Boot と統合し、サンプルを作成して、イベント ソースとイベント ターゲットを実現します。
チャットGPT:
ここでは、イベント ソースとイベント ターゲットを実装する Spring Boot を使用した Cloud Events 統合の例を示します。
1. まず、Spring Cloud Stream と Cloud Events を使用するには、次の Maven 依存関係を追加する必要があります。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream</artifactId>
</dependency>
<dependency>
<groupId>io.cloudevents</groupId>
<artifactId>cloudevents-spring</artifactId>
<version>2.0.2</version>
</dependency>
</dependencies>
2. 次に、Source
Kafka トピックにイベントを送信するために、 というイベント ソースを作成します。
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;
import io.cloudevents.spring.messaging.CloudEventMessageUtils;
import io.cloudevents.CloudEvent;
import io.cloudevents.core.builder.CloudEventBuilder;
import io.cloudevents.core.provider.EventFormatProvider;
@Component
@EnableBinding(Source.class)
public class MyEventSource {
private final Source source;
public MyEventSource(Source source) {
this.source = source;
}
public void sendEvent(MyEventData data) {
// 创建CloudEvent
CloudEvent cloudEvent = CloudEventBuilder.v1()
.withId(UUID.randomUUID().toString())
.withType("my.event.type")
.withSource("/my/event/source")
.withData(data)
.build();
// 将CloudEvent转换为Spring消息
org.springframework.messaging.Message<CloudEvent> message = MessageBuilder.withPayload(cloudEvent)
.setHeader(CloudEventMessageUtils.ATTRIBUTES_CONTENT_TYPE, EventFormatProvider.getInstance().resolveFormatForEvent(cloudEvent).getMediaType())
.build();
// 发送Spring消息到Kafka主题
source.output().send(message);
}
}
3.MyEventData
イベント データを表すために呼び出される POJO クラスを作成します。
public class MyEventData {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
4. MyEventHandler
Kafka トピックをリッスンし、受信したイベントを処理する というイベント ターゲットを作成します。
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.stereotype.Component;
import io.cloudevents.CloudEvent;
import io.cloudevents.core.data.PojoCloudEventData;
import io.cloudevents.jackson.JsonCloudEventData;
import io.cloudevents.spring.messaging.CloudEventMessageUtils;
@Component
@EnableBinding(Sink.class)
public class MyEventHandler {
@StreamListener(Sink.INPUT)
public void handleEvent(CloudEvent cloudEvent) {
// 从CloudEvent中获取事件数据
MyEventData eventData = cloudEvent.getData() instanceof PojoCloudEventData ?
((PojoCloudEventData<MyEventData>) cloudEvent.getData()).get() :
new JsonCloudEventData<>(cloudEvent.getData().toBytes(), MyEventData.class).get();
// 处理事件
System.out.println("Received event with message: " + eventData.getMessage());
// 手动确认接收到事件
CloudEventMessageUtils.confirm(cloudEvent);
}
}
上記のコードは、@StreamListener
アノテーションを使用して Kafka トピック内のイベントをリッスンし、CloudEvent からイベント データを取得し (ここではPojoCloudEventData
とJsonCloudEventData
2 つのメソッドを使用します)、イベントを処理して、イベントの受信を手動で確認します。
5. 最後に、Spring Boot アプリケーションの構成ファイルで Kafka トピックとイベント シリアライザーを構成します。
spring:
cloud:
stream:
bindings:
output:
destination: my-topic
content-type: application/cloudevents+json
input:
destination: my-topic
content-type: application/cloudevents+json
kafka:
binder:
brokers: localhost:9092
default:
producer:
useNativeEncoding: true
headerMode: embeddedHeaders
valueSerde: io.cloudevents.jackson.JsonCloudEventDataSerde
上記構成では、 、output
がinput
それぞれイベントソース、イベントターゲットのKafkaトピックに対応します。content-type
に設定しますapplication/cloudevents+json
。これは、イベントのシリアル化に Cloud Events 仕様の JSON 形式を使用することを意味します。valueSerde
イベント データを JSON 形式にシリアル化するには、に設定しますJsonCloudEventDataSerde
。Cloud Events のネイティブ エンコーディングと埋め込みヘッダー モードを有効にするための設定useNativeEncoding
。headerMode
Spring Boot を使用した Cloud Events 統合の例を作成しました。これは、Kafka トピックとの間でイベントを送受信できるイベント ソースとイベント宛先を実装します。ニーズに応じてコードと構成を変更できます。