簡體   English   中英

如何將 GCP PubSub 消息的“數據”部分處理為 HashMap?

[英]How to process "data" part of GCP PubSub message into a HashMap?

我收到如下 pubsub 消息:

{
  "data": {
    "systemId": "system-1",
    "userId": "userId-1",
    "departmentId": "090",
    "enrolmentDateTime": "2022-08-19T15:44:29.080Z",
    "event_type": "REGISTRATION"
  }
}

我想在基於“event_type”的 springboot 應用程序中進一步處理此消息。 我怎樣才能從這條消息中獲取“event_type”並將其用於比較? 有什么建議么?

例如,我想進行這樣的處理:

if(event_type.equals("REGISTRATION")) { registrationHandler.handle(message); else { }

我已經嘗試將 PubSubMessage 轉換為字符串,然后使用 ObjectMapper 將其進一步轉換為 map 為 HashMap,但這給了我“數據”作為鍵和 json 部分的 rest 作為值。

public void process(final PubsubMessage message) throws ConsumerException {
    String data = message.getData().toStringUtf8();

    try {
        ObjectMapper mapper = new ObjectMapper();
        HashMap<String, String> dataMap = mapper.readValue(data, HashMap.class);
        } ....

您可以使用類型化的 object,而不是使用Map ,例如:

PubSubData.java文件:

public class PubSubData {
    private String systemId;
    private String userId;
    private String departmentId;
    private String enrolmentDateTime;
    private String event_type;

    public PubSubData() {
    }

    public String getSystemId() {
        return systemId;
    }

    public void setSystemId(String systemId) {
        this.systemId = systemId;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getDepartmentId() {
        return departmentId;
    }

    public void setDepartmentId(String departmentId) {
        this.departmentId = departmentId;
    }

    public String getEnrolmentDateTime() {
        return enrolmentDateTime;
    }

    public void setEnrolmentDateTime(String enrolmentDateTime) {
        this.enrolmentDateTime = enrolmentDateTime;
    }

    public String getEvent_type() {
        return event_type;
    }

    public void setEvent_type(String event_type) {
        this.event_type = event_type;
    }
}

PubSubResult.java文件:

public class PubSubResult {
    private PubSubData data;

    public PubSubResult() {
    }

    public PubSubData getData() {
        return data;
    }

    public void setData(PubSubData data) {
        this.data = data;
    }
}

將數據從PubsubMessage反序列化為PubSubResult object 的單元測試示例:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.google.protobuf.ByteString;
import com.google.pubsub.v1.PubsubMessage;
import org.junit.Test;

public class MyTest {

    private static final ObjectMapper OBJECT_MAPPER;

    static {
        final ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);

        OBJECT_MAPPER = mapper;
    }


    @Test
    public void testDeserializePubSubData() {
        final String data = "{\n" +
                "  \"data\": {\n" +
                "    \"systemId\": \"system-1\",\n" +
                "    \"userId\": \"userId-1\",\n" +
                "    \"departmentId\": \"090\",\n" +
                "    \"enrolmentDateTime\": \"2022-08-19T15:44:29.080Z\",\n" +
                "    \"event_type\": \"REGISTRATION\"\n" +
                "  }\n" +
                "}";

        final PubsubMessage message = PubsubMessage.newBuilder()
                .setData(ByteString.copyFrom(data.getBytes()))
                .build();

        final String dataResult = message.getData().toStringUtf8();

        final PubSubResult resultData = deserialize(dataResult);
        
        // Access to the event type.
        final String eventType = resultData.getData().getEvent_type();
    }

    private PubSubResult deserialize(final String value) {
        try {
            return OBJECT_MAPPER.readValue(value, PubSubResult.class);
        } catch (JsonProcessingException e) {
            throw new IllegalStateException("Error !!", e);
        }
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM