You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2024/03/29 09:10:57 UTC

(camel) branch main updated: CAMEL-20625: Create a camel-google-pubsub-lite component (#13630)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 68661a84041 CAMEL-20625: Create a camel-google-pubsub-lite component (#13630)
68661a84041 is described below

commit 68661a84041fb4b6f730c8eaafef4e7f46be496c
Author: Stanislav Deviatov <de...@gmail.com>
AuthorDate: Fri Mar 29 10:10:51 2024 +0100

    CAMEL-20625: Create a camel-google-pubsub-lite component (#13630)
    
    * CAMEL-20625: Initial implementation
    
    * CAMEL-20625: Minor fixes based on review feedback
    
    * CAMEL-20625: docs updated
    
    * CAMEL-20625: docs updated (since field from 4.5 to 4.6)
---
 bom/camel-bom/pom.xml                              |   5 +
 catalog/camel-allcomponents/pom.xml                |   5 +
 .../camel-google/camel-google-pubsub-lite/pom.xml  |  78 +++++++
 .../pubsub/GooglePubsubEndpointUriFactory.java     |  85 +++++++
 .../GooglePubsubComponentConfigurer.java           |  84 +++++++
 .../pubsublite/GooglePubsubEndpointConfigurer.java | 116 ++++++++++
 .../pubsublite/GooglePubsubEndpointUriFactory.java |  85 +++++++
 .../GooglePubsubLiteComponentConfigurer.java       |  97 ++++++++
 .../GooglePubsubLiteEndpointConfigurer.java        | 117 ++++++++++
 .../GooglePubsubLiteEndpointUriFactory.java        |  84 +++++++
 .../google/pubsublite/google-pubsub-lite.json      |  60 +++++
 .../services/org/apache/camel/component.properties |   7 +
 .../org/apache/camel/component/google-pubsub       |   2 +
 .../org/apache/camel/component/google-pubsub-lite  |   2 +
 .../camel/configurer/google-pubsub-component       |   2 +
 .../apache/camel/configurer/google-pubsub-endpoint |   2 +
 .../camel/configurer/google-pubsub-lite-component  |   2 +
 .../camel/configurer/google-pubsub-lite-endpoint   |   2 +
 .../apache/camel/urifactory/google-pubsub-endpoint |   2 +
 .../camel/urifactory/google-pubsub-lite-endpoint   |   2 +
 .../component/google/pubsublite/google-pubsub.json |  62 +++++
 .../main/docs/google-pubsub-lite-component.adoc    | 113 ++++++++++
 .../pubsublite/GooglePubsubLiteComponent.java      | 249 +++++++++++++++++++++
 .../pubsublite/GooglePubsubLiteConstants.java      |  46 ++++
 .../pubsublite/GooglePubsubLiteConsumer.java       | 128 +++++++++++
 .../pubsublite/GooglePubsubLiteEndpoint.java       | 233 +++++++++++++++++++
 .../pubsublite/GooglePubsubLiteProducer.java       | 120 ++++++++++
 .../google/pubsublite/consumer/Acknowledge.java    |  40 ++++
 .../pubsublite/consumer/CamelMessageReceiver.java  |  75 +++++++
 .../serializer/DefaultGooglePubsubSerializer.java  |  35 +++
 .../serializer/GooglePubsubSerializer.java         |  34 +++
 .../pubsublite/GooglePubsubLiteComponentTest.java  |  66 ++++++
 .../pubsublite/GooglePubsubLiteConsumerTest.java   |  83 +++++++
 .../pubsublite/GooglePubsubLiteProducerTest.java   | 107 +++++++++
 .../src/test/resources/log4j.properties            |  37 +++
 .../src/test/resources/simple.properties           |  20 ++
 components/camel-google/pom.xml                    |   1 +
 .../ROOT/examples/json/google-pubsub-lite.json     |   1 +
 docs/components/modules/ROOT/nav.adoc              |   1 +
 .../ROOT/pages/google-pubsub-lite-component.adoc   |   1 +
 parent/pom.xml                                     |   5 +
 41 files changed, 2296 insertions(+)

diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index 3096006e3bb..e69f820f73b 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -842,6 +842,11 @@
         <artifactId>camel-google-pubsub</artifactId>
         <version>4.6.0-SNAPSHOT</version>
       </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-google-pubsub-lite</artifactId>
+        <version>4.5.0-SNAPSHOT</version>
+      </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
         <artifactId>camel-google-secret-manager</artifactId>
diff --git a/catalog/camel-allcomponents/pom.xml b/catalog/camel-allcomponents/pom.xml
index 4c60e8db8e1..bdc0392a553 100644
--- a/catalog/camel-allcomponents/pom.xml
+++ b/catalog/camel-allcomponents/pom.xml
@@ -712,6 +712,11 @@
             <artifactId>camel-google-pubsub</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-google-pubsub-lite</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-google-secret-manager</artifactId>
diff --git a/components/camel-google/camel-google-pubsub-lite/pom.xml b/components/camel-google/camel-google-pubsub-lite/pom.xml
new file mode 100644
index 00000000000..05b7d270b61
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/pom.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<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>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-google-parent</artifactId>
+        <version>4.5.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-google-pubsub-lite</artifactId>
+    <packaging>jar</packaging>
+    <name>Camel :: Google :: PubSub Lite</name>
+    <description>Camel Component for Google Cloud Platform PubSub Lite</description>
+
+    <properties>
+        <schemeName>google-pubsub-lite</schemeName>
+        <componentName>GooglePubSubLite</componentName>
+        <componentPackage>org.apache.camel.component.google.pubsublite</componentPackage>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>com.google.cloud</groupId>
+                <artifactId>libraries-bom</artifactId>
+                <version>${google-cloud-bom-version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-support</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.cloud</groupId>
+            <artifactId>google-cloud-pubsub</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.google.code.findbugs</groupId>
+                    <artifactId>jsr305</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.google.cloud</groupId>
+            <artifactId>google-cloud-pubsublite</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointUriFactory.java b/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointUriFactory.java
new file mode 100644
index 00000000000..e3efb4ff570
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointUriFactory.java
@@ -0,0 +1,85 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.google.pubsub;
+
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.spi.EndpointUriFactory;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+public class GooglePubsubEndpointUriFactory extends org.apache.camel.support.component.EndpointUriFactorySupport implements EndpointUriFactory {
+
+    private static final String BASE = ":projectId:destinationName";
+
+    private static final Set<String> PROPERTY_NAMES;
+    private static final Set<String> SECRET_PROPERTY_NAMES;
+    private static final Set<String> MULTI_VALUE_PREFIXES;
+    static {
+        Set<String> props = new HashSet<>(17);
+        props.add("ackMode");
+        props.add("authenticate");
+        props.add("bridgeErrorHandler");
+        props.add("concurrentConsumers");
+        props.add("destinationName");
+        props.add("exceptionHandler");
+        props.add("exchangePattern");
+        props.add("lazyStartProducer");
+        props.add("loggerId");
+        props.add("maxAckExtensionPeriod");
+        props.add("maxMessagesPerPoll");
+        props.add("messageOrderingEnabled");
+        props.add("projectId");
+        props.add("pubsubEndpoint");
+        props.add("serializer");
+        props.add("serviceAccountKey");
+        props.add("synchronousPull");
+        PROPERTY_NAMES = Collections.unmodifiableSet(props);
+        SECRET_PROPERTY_NAMES = Collections.emptySet();
+        MULTI_VALUE_PREFIXES = Collections.emptySet();
+    }
+
+    @Override
+    public boolean isEnabled(String scheme) {
+        return "google-pubsub".equals(scheme);
+    }
+
+    @Override
+    public String buildUri(String scheme, Map<String, Object> properties, boolean encode) throws URISyntaxException {
+        String syntax = scheme + BASE;
+        String uri = syntax;
+
+        Map<String, Object> copy = new HashMap<>(properties);
+
+        uri = buildPathParameter(syntax, uri, "projectId", null, true, copy);
+        uri = buildPathParameter(syntax, uri, "destinationName", null, true, copy);
+        uri = buildQueryParameters(uri, copy, encode);
+        return uri;
+    }
+
+    @Override
+    public Set<String> propertyNames() {
+        return PROPERTY_NAMES;
+    }
+
+    @Override
+    public Set<String> secretPropertyNames() {
+        return SECRET_PROPERTY_NAMES;
+    }
+
+    @Override
+    public Set<String> multiValuePrefixes() {
+        return MULTI_VALUE_PREFIXES;
+    }
+
+    @Override
+    public boolean isLenientProperties() {
+        return false;
+    }
+}
+
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubComponentConfigurer.java b/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubComponentConfigurer.java
new file mode 100644
index 00000000000..4c25fdde63a
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubComponentConfigurer.java
@@ -0,0 +1,84 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.google.pubsublite;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class GooglePubsubComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        GooglePubsubLiteComponent target = (GooglePubsubLiteComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "autowiredenabled":
+        case "autowiredEnabled": target.setAutowiredEnabled(property(camelContext, boolean.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "publishercachesize":
+        case "publisherCacheSize": target.setPublisherCacheSize(property(camelContext, int.class, value)); return true;
+        case "publishercachetimeout":
+        case "publisherCacheTimeout": target.setPublisherCacheTimeout(property(camelContext, int.class, value)); return true;
+        case "publisherterminationtimeout":
+        case "publisherTerminationTimeout": target.setPublisherTerminationTimeout(property(camelContext, int.class, value)); return true;
+        case "serviceaccountkey":
+        case "serviceAccountKey": target.setServiceAccountKey(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "authenticate": return boolean.class;
+        case "autowiredenabled":
+        case "autowiredEnabled": return boolean.class;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return boolean.class;
+        case "endpoint": return java.lang.String.class;
+        case "lazystartproducer":
+        case "lazyStartProducer": return boolean.class;
+        case "publishercachesize":
+        case "publisherCacheSize": return int.class;
+        case "publishercachetimeout":
+        case "publisherCacheTimeout": return int.class;
+        case "publisherterminationtimeout":
+        case "publisherTerminationTimeout": return int.class;
+        case "serviceaccountkey":
+        case "serviceAccountKey": return java.lang.String.class;
+        case "synchronouspullretryablecodes":
+        case "synchronousPullRetryableCodes": return java.lang.String.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        GooglePubsubLiteComponent target = (GooglePubsubLiteComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "autowiredenabled":
+        case "autowiredEnabled": return target.isAutowiredEnabled();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        case "publishercachesize":
+        case "publisherCacheSize": return target.getPublisherCacheSize();
+        case "publishercachetimeout":
+        case "publisherCacheTimeout": return target.getPublisherCacheTimeout();
+        case "publisherterminationtimeout":
+        case "publisherTerminationTimeout": return target.getPublisherTerminationTimeout();
+        case "serviceaccountkey":
+        case "serviceAccountKey": return target.getServiceAccountKey();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubEndpointConfigurer.java b/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubEndpointConfigurer.java
new file mode 100644
index 00000000000..2fd3ff32d81
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubEndpointConfigurer.java
@@ -0,0 +1,116 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.google.pubsublite;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.google.pubsublite.serializer.GooglePubsubSerializer;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class GooglePubsubEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        GooglePubsubLiteEndpoint target = (GooglePubsubLiteEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "ackmode":
+        case "ackMode": target.setAckMode(property(camelContext, GooglePubsubLiteConstants.AckMode.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "concurrentconsumers":
+        case "concurrentConsumers": target.setConcurrentConsumers(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "exceptionhandler":
+        case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true;
+        case "exchangepattern":
+        case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "loggerid":
+        case "loggerId": target.setLoggerId(property(camelContext, java.lang.String.class, value)); return true;
+        case "maxackextensionperiod":
+        case "maxAckExtensionPeriod": target.setMaxAckExtensionPeriod(property(camelContext, int.class, value)); return true;
+        case "maxmessagesperpoll":
+        case "maxMessagesPerPoll": target.setMaxMessagesPerPoll(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "pubsubendpoint":
+        case "pubsubEndpoint": target.setPubsubEndpoint(property(camelContext, java.lang.String.class, value)); return true;
+        case "serializer": target.setSerializer(property(camelContext, GooglePubsubSerializer.class, value)); return true;
+        case "serviceaccountkey":
+        case "serviceAccountKey": target.setServiceAccountKey(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public String[] getAutowiredNames() {
+        return new String[]{"serializer"};
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "ackmode":
+        case "ackMode": return GooglePubsubLiteConstants.AckMode.class;
+        case "authenticate": return boolean.class;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return boolean.class;
+        case "concurrentconsumers":
+        case "concurrentConsumers": return java.lang.Integer.class;
+        case "exceptionhandler":
+        case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class;
+        case "exchangepattern":
+        case "exchangePattern": return org.apache.camel.ExchangePattern.class;
+        case "lazystartproducer":
+        case "lazyStartProducer": return boolean.class;
+        case "loggerid":
+        case "loggerId": return java.lang.String.class;
+        case "maxackextensionperiod":
+        case "maxAckExtensionPeriod": return int.class;
+        case "maxmessagesperpoll":
+        case "maxMessagesPerPoll": return java.lang.Integer.class;
+        case "messageorderingenabled":
+        case "messageOrderingEnabled": return boolean.class;
+        case "pubsubendpoint":
+        case "pubsubEndpoint": return java.lang.String.class;
+        case "serializer": return GooglePubsubSerializer.class;
+        case "serviceaccountkey":
+        case "serviceAccountKey": return java.lang.String.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        GooglePubsubLiteEndpoint target = (GooglePubsubLiteEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "ackmode":
+        case "ackMode": return target.getAckMode();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "concurrentconsumers":
+        case "concurrentConsumers": return target.getConcurrentConsumers();
+        case "exceptionhandler":
+        case "exceptionHandler": return target.getExceptionHandler();
+        case "exchangepattern":
+        case "exchangePattern": return target.getExchangePattern();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        case "loggerid":
+        case "loggerId": return target.getLoggerId();
+        case "maxackextensionperiod":
+        case "maxAckExtensionPeriod": return target.getMaxAckExtensionPeriod();
+        case "maxmessagesperpoll":
+        case "maxMessagesPerPoll": return target.getMaxMessagesPerPoll();
+        case "pubsubendpoint":
+        case "pubsubEndpoint": return target.getPubsubEndpoint();
+        case "serializer": return target.getSerializer();
+        case "serviceaccountkey":
+        case "serviceAccountKey": return target.getServiceAccountKey();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubEndpointUriFactory.java b/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubEndpointUriFactory.java
new file mode 100644
index 00000000000..60e53be840c
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubEndpointUriFactory.java
@@ -0,0 +1,85 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.google.pubsublite;
+
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.spi.EndpointUriFactory;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+public class GooglePubsubEndpointUriFactory extends org.apache.camel.support.component.EndpointUriFactorySupport implements EndpointUriFactory {
+
+    private static final String BASE = ":projectId:destinationName";
+
+    private static final Set<String> PROPERTY_NAMES;
+    private static final Set<String> SECRET_PROPERTY_NAMES;
+    private static final Set<String> MULTI_VALUE_PREFIXES;
+    static {
+        Set<String> props = new HashSet<>(17);
+        props.add("ackMode");
+        props.add("authenticate");
+        props.add("bridgeErrorHandler");
+        props.add("concurrentConsumers");
+        props.add("destinationName");
+        props.add("exceptionHandler");
+        props.add("exchangePattern");
+        props.add("lazyStartProducer");
+        props.add("loggerId");
+        props.add("maxAckExtensionPeriod");
+        props.add("maxMessagesPerPoll");
+        props.add("messageOrderingEnabled");
+        props.add("projectId");
+        props.add("pubsubEndpoint");
+        props.add("serializer");
+        props.add("serviceAccountKey");
+        props.add("synchronousPull");
+        PROPERTY_NAMES = Collections.unmodifiableSet(props);
+        SECRET_PROPERTY_NAMES = Collections.emptySet();
+        MULTI_VALUE_PREFIXES = Collections.emptySet();
+    }
+
+    @Override
+    public boolean isEnabled(String scheme) {
+        return "google-pubsub-lite".equals(scheme);
+    }
+
+    @Override
+    public String buildUri(String scheme, Map<String, Object> properties, boolean encode) throws URISyntaxException {
+        String syntax = scheme + BASE;
+        String uri = syntax;
+
+        Map<String, Object> copy = new HashMap<>(properties);
+
+        uri = buildPathParameter(syntax, uri, "projectId", null, true, copy);
+        uri = buildPathParameter(syntax, uri, "destinationName", null, true, copy);
+        uri = buildQueryParameters(uri, copy, encode);
+        return uri;
+    }
+
+    @Override
+    public Set<String> propertyNames() {
+        return PROPERTY_NAMES;
+    }
+
+    @Override
+    public Set<String> secretPropertyNames() {
+        return SECRET_PROPERTY_NAMES;
+    }
+
+    @Override
+    public Set<String> multiValuePrefixes() {
+        return MULTI_VALUE_PREFIXES;
+    }
+
+    @Override
+    public boolean isLenientProperties() {
+        return false;
+    }
+}
+
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteComponentConfigurer.java b/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteComponentConfigurer.java
new file mode 100644
index 00000000000..b4c1603ba16
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteComponentConfigurer.java
@@ -0,0 +1,97 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.google.pubsublite;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class GooglePubsubLiteComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        GooglePubsubLiteComponent target = (GooglePubsubLiteComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "autowiredenabled":
+        case "autowiredEnabled": target.setAutowiredEnabled(property(camelContext, boolean.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "consumerbytesoutstanding":
+        case "consumerBytesOutstanding": target.setConsumerBytesOutstanding(property(camelContext, long.class, value)); return true;
+        case "consumermessagesoutstanding":
+        case "consumerMessagesOutstanding": target.setConsumerMessagesOutstanding(property(camelContext, long.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "publishercachesize":
+        case "publisherCacheSize": target.setPublisherCacheSize(property(camelContext, int.class, value)); return true;
+        case "publishercachetimeout":
+        case "publisherCacheTimeout": target.setPublisherCacheTimeout(property(camelContext, int.class, value)); return true;
+        case "publisherterminationtimeout":
+        case "publisherTerminationTimeout": target.setPublisherTerminationTimeout(property(camelContext, int.class, value)); return true;
+        case "serviceaccountkey":
+        case "serviceAccountKey": target.setServiceAccountKey(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "autowiredenabled":
+        case "autowiredEnabled": return boolean.class;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return boolean.class;
+        case "consumerbytesoutstanding":
+        case "consumerBytesOutstanding": return long.class;
+        case "consumermessagesoutstanding":
+        case "consumerMessagesOutstanding": return long.class;
+        case "lazystartproducer":
+        case "lazyStartProducer": return boolean.class;
+        case "publishercachesize":
+        case "publisherCacheSize": return int.class;
+        case "publishercachetimeout":
+        case "publisherCacheTimeout": return int.class;
+        case "publisherterminationtimeout":
+        case "publisherTerminationTimeout": return int.class;
+        case "serviceaccountkey":
+        case "serviceAccountKey": return java.lang.String.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        GooglePubsubLiteComponent target = (GooglePubsubLiteComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "autowiredenabled":
+        case "autowiredEnabled": return target.isAutowiredEnabled();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "consumerbytesoutstanding":
+        case "consumerBytesOutstanding": return target.getConsumerBytesOutstanding();
+        case "consumermessagesoutstanding":
+        case "consumerMessagesOutstanding": return target.getConsumerMessagesOutstanding();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        case "publishercachesize":
+        case "publisherCacheSize": return target.getPublisherCacheSize();
+        case "publishercachetimeout":
+        case "publisherCacheTimeout": return target.getPublisherCacheTimeout();
+        case "publisherterminationtimeout":
+        case "publisherTerminationTimeout": return target.getPublisherTerminationTimeout();
+        case "serviceaccountkey":
+        case "serviceAccountKey": return target.getServiceAccountKey();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteEndpointConfigurer.java b/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteEndpointConfigurer.java
new file mode 100644
index 00000000000..1f15869cabb
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteEndpointConfigurer.java
@@ -0,0 +1,117 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.google.pubsublite;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class GooglePubsubLiteEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        GooglePubsubLiteEndpoint target = (GooglePubsubLiteEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "ackmode":
+        case "ackMode": target.setAckMode(property(camelContext, org.apache.camel.component.google.pubsublite.GooglePubsubLiteConstants.AckMode.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "concurrentconsumers":
+        case "concurrentConsumers": target.setConcurrentConsumers(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "exceptionhandler":
+        case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true;
+        case "exchangepattern":
+        case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "loggerid":
+        case "loggerId": target.setLoggerId(property(camelContext, java.lang.String.class, value)); return true;
+        case "maxackextensionperiod":
+        case "maxAckExtensionPeriod": target.setMaxAckExtensionPeriod(property(camelContext, int.class, value)); return true;
+        case "maxmessagesperpoll":
+        case "maxMessagesPerPoll": target.setMaxMessagesPerPoll(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "pubsubendpoint":
+        case "pubsubEndpoint": target.setPubsubEndpoint(property(camelContext, java.lang.String.class, value)); return true;
+        case "serializer": target.setSerializer(property(camelContext, org.apache.camel.component.google.pubsublite.serializer.GooglePubsubSerializer.class, value)); return true;
+        case "serviceaccountkey":
+        case "serviceAccountKey": target.setServiceAccountKey(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public String[] getAutowiredNames() {
+        return new String[]{"serializer"};
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "ackmode":
+        case "ackMode": return org.apache.camel.component.google.pubsublite.GooglePubsubLiteConstants.AckMode.class;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return boolean.class;
+        case "concurrentconsumers":
+        case "concurrentConsumers": return java.lang.Integer.class;
+        case "exceptionhandler":
+        case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class;
+        case "exchangepattern":
+        case "exchangePattern": return org.apache.camel.ExchangePattern.class;
+        case "lazystartproducer":
+        case "lazyStartProducer": return boolean.class;
+        case "loggerid":
+        case "loggerId": return java.lang.String.class;
+        case "maxackextensionperiod":
+        case "maxAckExtensionPeriod": return int.class;
+        case "maxmessagesperpoll":
+        case "maxMessagesPerPoll": return java.lang.Integer.class;
+        case "pubsubendpoint":
+        case "pubsubEndpoint": return java.lang.String.class;
+        case "serializer": return org.apache.camel.component.google.pubsublite.serializer.GooglePubsubSerializer.class;
+        case "serviceaccountkey":
+        case "serviceAccountKey": return java.lang.String.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        GooglePubsubLiteEndpoint target = (GooglePubsubLiteEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "ackmode":
+        case "ackMode": return target.getAckMode();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "concurrentconsumers":
+        case "concurrentConsumers": return target.getConcurrentConsumers();
+        case "exceptionhandler":
+        case "exceptionHandler": return target.getExceptionHandler();
+        case "exchangepattern":
+        case "exchangePattern": return target.getExchangePattern();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        case "loggerid":
+        case "loggerId": return target.getLoggerId();
+        case "maxackextensionperiod":
+        case "maxAckExtensionPeriod": return target.getMaxAckExtensionPeriod();
+        case "maxmessagesperpoll":
+        case "maxMessagesPerPoll": return target.getMaxMessagesPerPoll();
+        case "pubsubendpoint":
+        case "pubsubEndpoint": return target.getPubsubEndpoint();
+        case "serializer": return target.getSerializer();
+        case "serviceaccountkey":
+        case "serviceAccountKey": return target.getServiceAccountKey();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteEndpointUriFactory.java b/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteEndpointUriFactory.java
new file mode 100644
index 00000000000..9a48d901dcc
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteEndpointUriFactory.java
@@ -0,0 +1,84 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.google.pubsublite;
+
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.spi.EndpointUriFactory;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+public class GooglePubsubLiteEndpointUriFactory extends org.apache.camel.support.component.EndpointUriFactorySupport implements EndpointUriFactory {
+
+    private static final String BASE = ":projectId:location:destinationName";
+
+    private static final Set<String> PROPERTY_NAMES;
+    private static final Set<String> SECRET_PROPERTY_NAMES;
+    private static final Set<String> MULTI_VALUE_PREFIXES;
+    static {
+        Set<String> props = new HashSet<>(15);
+        props.add("ackMode");
+        props.add("bridgeErrorHandler");
+        props.add("concurrentConsumers");
+        props.add("destinationName");
+        props.add("exceptionHandler");
+        props.add("exchangePattern");
+        props.add("lazyStartProducer");
+        props.add("location");
+        props.add("loggerId");
+        props.add("maxAckExtensionPeriod");
+        props.add("maxMessagesPerPoll");
+        props.add("projectId");
+        props.add("pubsubEndpoint");
+        props.add("serializer");
+        props.add("serviceAccountKey");
+        PROPERTY_NAMES = Collections.unmodifiableSet(props);
+        SECRET_PROPERTY_NAMES = Collections.emptySet();
+        MULTI_VALUE_PREFIXES = Collections.emptySet();
+    }
+
+    @Override
+    public boolean isEnabled(String scheme) {
+        return "google-pubsub-lite".equals(scheme);
+    }
+
+    @Override
+    public String buildUri(String scheme, Map<String, Object> properties, boolean encode) throws URISyntaxException {
+        String syntax = scheme + BASE;
+        String uri = syntax;
+
+        Map<String, Object> copy = new HashMap<>(properties);
+
+        uri = buildPathParameter(syntax, uri, "projectId", null, true, copy);
+        uri = buildPathParameter(syntax, uri, "location", null, true, copy);
+        uri = buildPathParameter(syntax, uri, "destinationName", null, true, copy);
+        uri = buildQueryParameters(uri, copy, encode);
+        return uri;
+    }
+
+    @Override
+    public Set<String> propertyNames() {
+        return PROPERTY_NAMES;
+    }
+
+    @Override
+    public Set<String> secretPropertyNames() {
+        return SECRET_PROPERTY_NAMES;
+    }
+
+    @Override
+    public Set<String> multiValuePrefixes() {
+        return MULTI_VALUE_PREFIXES;
+    }
+
+    @Override
+    public boolean isLenientProperties() {
+        return false;
+    }
+}
+
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/org/apache/camel/component/google/pubsublite/google-pubsub-lite.json b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/org/apache/camel/component/google/pubsublite/google-pubsub-lite.json
new file mode 100644
index 00000000000..ed46412b597
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/org/apache/camel/component/google/pubsublite/google-pubsub-lite.json
@@ -0,0 +1,60 @@
+{
+  "component": {
+    "kind": "component",
+    "name": "google-pubsub-lite",
+    "title": "Google Pubsub Lite",
+    "description": "Send and receive messages to\/from Google Cloud Platform PubSub Lite Service.",
+    "deprecated": false,
+    "firstVersion": "4.5.0",
+    "label": "cloud,messaging",
+    "javaType": "org.apache.camel.component.google.pubsublite.GooglePubsubLiteComponent",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-google-pubsub-lite",
+    "version": "4.5.0-SNAPSHOT",
+    "scheme": "google-pubsub-lite",
+    "extendsScheme": "",
+    "syntax": "google-pubsub-lite:projectId:location:destinationName",
+    "async": false,
+    "api": false,
+    "consumerOnly": false,
+    "producerOnly": false,
+    "lenientProperties": false,
+    "remote": true
+  },
+  "componentProperties": {
+    "serviceAccountKey": { "index": 0, "kind": "property", "displayName": "Service Account Key", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The Service account key that can be used as credentials for the PubSub Lite publisher\/subscriber. It can be loaded by default from classpath, but you can prefix with classpath:, file:, or http: to load the resourc [...]
+    "bridgeErrorHandler": { "index": 1, "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming messages, or the like [...]
+    "consumerBytesOutstanding": { "index": 2, "kind": "property", "displayName": "Consumer Bytes Outstanding", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "description": "How many milliseconds should each producer stay alive in the cache. Must be greater than the allowed size of the largest message (1 MiB)." },
+    "consumerMessagesOutstanding": { "index": 3, "kind": "property", "displayName": "Consumer Messages Outstanding", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "description": "The number of messages that may be outstanding to the client. Must be 0." },
+    "lazyStartProducer": { "index": 4, "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail [...]
+    "publisherCacheSize": { "index": 5, "kind": "property", "displayName": "Publisher Cache Size", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "Maximum number of producers to cache. This could be increased if you have producers for lots of different topics." },
+    "publisherCacheTimeout": { "index": 6, "kind": "property", "displayName": "Publisher Cache Timeout", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "How many milliseconds should each producer stay alive in the cache." },
+    "autowiredEnabled": { "index": 7, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching t [...]
+    "publisherTerminationTimeout": { "index": 8, "kind": "property", "displayName": "Publisher Termination Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "How many milliseconds should a producer be allowed to terminate." }
+  },
+  "headers": {
+    "CamelGooglePubsubMessageId": { "index": 0, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ID of the message, assigned by the server when the message is published.", "constantName": "org.apache.camel.component.google.pubsublite.GooglePubsubLiteConstants#MESSAGE_ID" },
+    "CamelGooglePubsubMsgAckId": { "index": 1, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ID used to acknowledge the received message.", "constantName": "org.apache.camel.component.google.pubsublite.GooglePubsubLiteConstants#ACK_ID" },
+    "CamelGooglePubsubPublishTime": { "index": 2, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "com.google.protobuf.Timestamp", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The time at which the message was published", "constantName": "org.apache.camel.component.google.pubsublite.GooglePubsubLiteConstants#PUBLISH_TIME" },
+    "CamelGooglePubsubAttributes": { "index": 3, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The attributes of the message.", "constantName": "org.apache.camel.component.google.pubsublite.GooglePubsubLiteConstants#ATTRIBUTES" },
+    "CamelGooglePubsubOrderingKey": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "If non-empty, identifies related messages for which publish order should be respected.", "constantName": "org.apache.camel.component.google.pubsublite.GooglePubsubLiteConstants#ORDERING_KEY" }
+  },
+  "properties": {
+    "projectId": { "index": 0, "kind": "path", "displayName": "Project Id", "group": "common", "label": "common", "required": true, "type": "integer", "javaType": "java.lang.Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Google Cloud PubSub Lite Project Id" },
+    "location": { "index": 1, "kind": "path", "displayName": "Location", "group": "common", "label": "common", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Google Cloud PubSub Lite location" },
+    "destinationName": { "index": 2, "kind": "path", "displayName": "Destination Name", "group": "common", "label": "common", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Destination Name. For the consumer this will be the subscription name, while for the producer this will be the topic name." },
+    "loggerId": { "index": 3, "kind": "parameter", "displayName": "Logger Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Logger ID to use when a match to the parent route required" },
+    "serviceAccountKey": { "index": 4, "kind": "parameter", "displayName": "Service Account Key", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The Service account key that can be used as credentials for the PubSub publisher\/subscriber. It can be loaded by default from classpath, but you can prefix with classpath:, file:, or http: to load the resource fr [...]
+    "ackMode": { "index": 5, "kind": "parameter", "displayName": "Ack Mode", "group": "consumer", "label": "consumer", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.pubsublite.GooglePubsubLiteConstants.AckMode", "enum": [ "AUTO", "NONE" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "AUTO", "description": "AUTO = exchange gets ack'ed\/nack'ed on completion. NONE = downstream process has to ack\/nack explicitly" },
+    "concurrentConsumers": { "index": 6, "kind": "parameter", "displayName": "Concurrent Consumers", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1", "description": "The number of parallel streams consuming from the subscription" },
+    "maxAckExtensionPeriod": { "index": 7, "kind": "parameter", "displayName": "Max Ack Extension Period", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 3600, "description": "Set the maximum period a message ack deadline will be extended. Value in seconds" },
+    "maxMessagesPerPoll": { "index": 8, "kind": "parameter", "displayName": "Max Messages Per Poll", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1", "description": "The max number of messages to receive from the server in a single API call" },
+    "bridgeErrorHandler": { "index": 9, "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming  [...]
+    "exceptionHandler": { "index": 10, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...]
+    "exchangePattern": { "index": 11, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
+    "lazyStartProducer": { "index": 12, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...]
+    "pubsubEndpoint": { "index": 13, "kind": "parameter", "displayName": "Pubsub Endpoint", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Pub\/Sub endpoint to use. Required when using message ordering, and ensures that messages are received in order even when multiple publishers are used" },
+    "serializer": { "index": 14, "kind": "parameter", "displayName": "Serializer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.pubsublite.serializer.GooglePubsubSerializer", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "description": "A custom GooglePubsubLiteSerializer to use for serializing message payloads in the producer" }
+  }
+}
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/component.properties
new file mode 100644
index 00000000000..933d88c4f26
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+components=google-pubsub google-pubsub-lite
+groupId=org.apache.camel
+artifactId=camel-google-pubsub-lite
+version=4.5.0-SNAPSHOT
+projectName=Camel :: Google :: PubSub Lite
+projectDescription=Camel Component for Google Cloud Platform PubSub Lite
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/component/google-pubsub b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/component/google-pubsub
new file mode 100644
index 00000000000..3b3f57129b4
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/component/google-pubsub
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.google.pubsub.GooglePubsubComponent
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/component/google-pubsub-lite b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/component/google-pubsub-lite
new file mode 100644
index 00000000000..8628708ac77
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/component/google-pubsub-lite
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.google.pubsublite.GooglePubsubLiteComponent
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/configurer/google-pubsub-component b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/configurer/google-pubsub-component
new file mode 100644
index 00000000000..44ffc4d6e7e
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/configurer/google-pubsub-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.google.pubsub.GooglePubsubComponentConfigurer
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/configurer/google-pubsub-endpoint b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/configurer/google-pubsub-endpoint
new file mode 100644
index 00000000000..f6573913a8c
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/configurer/google-pubsub-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.google.pubsub.GooglePubsubEndpointConfigurer
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/configurer/google-pubsub-lite-component b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/configurer/google-pubsub-lite-component
new file mode 100644
index 00000000000..2098d5baf7e
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/configurer/google-pubsub-lite-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.google.pubsublite.GooglePubsubLiteComponentConfigurer
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/configurer/google-pubsub-lite-endpoint b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/configurer/google-pubsub-lite-endpoint
new file mode 100644
index 00000000000..d0d1f7b602f
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/configurer/google-pubsub-lite-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.google.pubsublite.GooglePubsubLiteEndpointConfigurer
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/urifactory/google-pubsub-endpoint b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/urifactory/google-pubsub-endpoint
new file mode 100644
index 00000000000..f7c70fcf15e
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/urifactory/google-pubsub-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.google.pubsub.GooglePubsubEndpointUriFactory
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/urifactory/google-pubsub-lite-endpoint b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/urifactory/google-pubsub-lite-endpoint
new file mode 100644
index 00000000000..1b1604aa9ee
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/services/org/apache/camel/urifactory/google-pubsub-lite-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.google.pubsublite.GooglePubsubLiteEndpointUriFactory
diff --git a/components/camel-google/camel-google-pubsub-lite/src/generated/resources/org/apache/camel/component/google/pubsublite/google-pubsub.json b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/org/apache/camel/component/google/pubsublite/google-pubsub.json
new file mode 100644
index 00000000000..f2346a7c513
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/generated/resources/org/apache/camel/component/google/pubsublite/google-pubsub.json
@@ -0,0 +1,62 @@
+{
+  "component": {
+    "kind": "component",
+    "name": "google-pubsub",
+    "title": "Google Pubsub",
+    "description": "Send and receive messages to\/from Google Cloud Platform PubSub Service.",
+    "deprecated": false,
+    "firstVersion": "2.19.0",
+    "label": "cloud,messaging",
+    "javaType": "org.apache.camel.component.google.pubsub.GooglePubsubComponent",
+    "supportLevel": "Stable",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-google-pubsub-lite",
+    "version": "4.0.0-SNAPSHOT",
+    "scheme": "google-pubsub",
+    "extendsScheme": "",
+    "syntax": "google-pubsub:projectId:destinationName",
+    "async": false,
+    "api": false,
+    "consumerOnly": false,
+    "producerOnly": false,
+    "lenientProperties": false
+  },
+  "componentProperties": {
+    "authenticate": { "index": 0, "kind": "property", "displayName": "Authenticate", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Use Credentials when interacting with PubSub service (no authentication is required when using emulator)." },
+    "endpoint": { "index": 1, "kind": "property", "displayName": "Endpoint", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Endpoint to use with local Pub\/Sub emulator." },
+    "serviceAccountKey": { "index": 2, "kind": "property", "displayName": "Service Account Key", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The Service account key that can be used as credentials for the PubSub publisher\/subscriber. It can be loaded by default from classpath, but you can prefix with classpath:, file:, or http: to load the resource fro [...]
+    "bridgeErrorHandler": { "index": 3, "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be proce [...]
+    "synchronousPullRetryableCodes": { "index": 4, "kind": "property", "displayName": "Synchronous Pull Retryable Codes", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Comma-separated list of additional retryable error codes for synchronous pull. By default the PubSub client library retries ABORTED, UNAVAILABLE, UNKNOWN" },
+    "lazyStartProducer": { "index": 5, "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail [...]
+    "publisherCacheSize": { "index": 6, "kind": "property", "displayName": "Publisher Cache Size", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "Maximum number of producers to cache. This could be increased if you have producers for lots of different topics." },
+    "publisherCacheTimeout": { "index": 7, "kind": "property", "displayName": "Publisher Cache Timeout", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "How many milliseconds should each producer stay alive in the cache." },
+    "autowiredEnabled": { "index": 8, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching t [...]
+    "publisherTerminationTimeout": { "index": 9, "kind": "property", "displayName": "Publisher Termination Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "How many milliseconds should a producer be allowed to terminate." }
+  },
+  "headers": {
+    "CamelGooglePubsubMessageId": { "index": 0, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ID of the message, assigned by the server when the message is published.", "constantName": "org.apache.camel.component.google.pubsub.GooglePubsubConstants#MESSAGE_ID" },
+    "CamelGooglePubsubMsgAckId": { "index": 1, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ID used to acknowledge the received message.", "constantName": "org.apache.camel.component.google.pubsub.GooglePubsubConstants#ACK_ID" },
+    "CamelGooglePubsubPublishTime": { "index": 2, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "com.google.protobuf.Timestamp", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The time at which the message was published", "constantName": "org.apache.camel.component.google.pubsub.GooglePubsubConstants#PUBLISH_TIME" },
+    "CamelGooglePubsubAttributes": { "index": 3, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The attributes of the message.", "constantName": "org.apache.camel.component.google.pubsub.GooglePubsubConstants#ATTRIBUTES" },
+    "CamelGooglePubsubOrderingKey": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "If non-empty, identifies related messages for which publish order should be respected.", "constantName": "org.apache.camel.component.google.pubsub.GooglePubsubConstants#ORDERING_KEY" }
+  },
+  "properties": {
+    "projectId": { "index": 0, "kind": "path", "displayName": "Project Id", "group": "common", "label": "common", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Google Cloud PubSub Project Id" },
+    "destinationName": { "index": 1, "kind": "path", "displayName": "Destination Name", "group": "common", "label": "common", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Destination Name. For the consumer this will be the subscription name, while for the producer this will be the topic name." },
+    "authenticate": { "index": 2, "kind": "parameter", "displayName": "Authenticate", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Use Credentials when interacting with PubSub service (no authentication is required when using emulator)." },
+    "loggerId": { "index": 3, "kind": "parameter", "displayName": "Logger Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Logger ID to use when a match to the parent route required" },
+    "serviceAccountKey": { "index": 4, "kind": "parameter", "displayName": "Service Account Key", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The Service account key that can be used as credentials for the PubSub publisher\/subscriber. It can be loaded by default from classpath, but you can prefix with classpath:, file:, or http: to load the resource fr [...]
+    "ackMode": { "index": 5, "kind": "parameter", "displayName": "Ack Mode", "group": "consumer", "label": "consumer", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.pubsub.GooglePubsubConstants.AckMode", "enum": [ "AUTO", "NONE" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "AUTO", "description": "AUTO = exchange gets ack'ed\/nack'ed on completion. NONE = downstream process has to ack\/nack explicitly" },
+    "concurrentConsumers": { "index": 6, "kind": "parameter", "displayName": "Concurrent Consumers", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1", "description": "The number of parallel streams consuming from the subscription" },
+    "maxAckExtensionPeriod": { "index": 7, "kind": "parameter", "displayName": "Max Ack Extension Period", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 3600, "description": "Set the maximum period a message ack deadline will be extended. Value in seconds" },
+    "maxMessagesPerPoll": { "index": 8, "kind": "parameter", "displayName": "Max Messages Per Poll", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1", "description": "The max number of messages to receive from the server in a single API call" },
+    "synchronousPull": { "index": 9, "kind": "parameter", "displayName": "Synchronous Pull", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Synchronously pull batches of messages" },
+    "bridgeErrorHandler": { "index": 10, "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the li [...]
+    "exceptionHandler": { "index": 11, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...]
+    "exchangePattern": { "index": 12, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
+    "lazyStartProducer": { "index": 13, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...]
+    "messageOrderingEnabled": { "index": 14, "kind": "parameter", "displayName": "Message Ordering Enabled", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Should message ordering be enabled" },
+    "pubsubEndpoint": { "index": 15, "kind": "parameter", "displayName": "Pubsub Endpoint", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Pub\/Sub endpoint to use. Required when using message ordering, and ensures that messages are received in order even when multiple publishers are used" },
+    "serializer": { "index": 16, "kind": "parameter", "displayName": "Serializer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.pubsub.serializer.GooglePubsubSerializer", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "description": "A custom GooglePubsubSerializer to use for serializing message payloads in the producer" }
+  }
+}
diff --git a/components/camel-google/camel-google-pubsub-lite/src/main/docs/google-pubsub-lite-component.adoc b/components/camel-google/camel-google-pubsub-lite/src/main/docs/google-pubsub-lite-component.adoc
new file mode 100644
index 00000000000..186dc031fb6
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/main/docs/google-pubsub-lite-component.adoc
@@ -0,0 +1,113 @@
+= Google Pubsub Lite Component
+:doctitle: Google Pubsub Lite
+:shortname: google-pubsub-lite
+:artifactid: camel-google-pubsub-lite
+:description: Send and receive messages to/from Google Cloud Platform PubSub Lite Service.
+:since: 4.5
+:supportlevel: Preview
+:tabs-sync-option:
+:component-header: Both producer and consumer are supported
+//Manually maintained attributes
+:group: Google
+:camel-spring-boot-name: google-pubsub-lite
+
+*Since Camel {since}*
+
+*{component-header}*
+
+The Google Pubsub Lite component provides access
+to https://cloud.google.com/pubsub/[Cloud Pub/Sub Lite Infrastructure] via
+the https://github.com/googleapis/java-pubsublite[Google Cloud Pub/Sub Lite Client for Java].
+
+The standard https://camel.apache.org/components/google-pubsub-component.html[Google Pub/Sub connector] isn't compatible with Pub/Sub Lite service due to API and message model differences. Please refer to the following links to learn more about these differences:
+
+* https://cloud.google.com/pubsub/docs/overview#lite[Pub/Sub Lite Overview]
+* https://cloud.google.com/pubsub/docs/choosing-pubsub-or-lite[Choosing between Pub/Sub or Pub/Sub Lite]
+
+Maven users will need to add the following dependency to their pom.xml
+for this component:
+
+[source,xml]
+------------------------------------------------------
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-google-pubsub-lite</artifactId>
+    <!-- use the same version as your Camel core version -->
+    <version>x.x.x</version>
+</dependency>
+------------------------------------------------------
+
+== URI Format
+
+The Google Pubsub Component uses the following URI format:
+
+----
+google-pubsub-lite://project-id:location:destinationName?[options]
+----
+
+Destination Name can be either a topic or a subscription name.
+
+
+// component-configure options: START
+
+// component-configure options: END
+
+// component options: START
+include::partial$component-configure-options.adoc[]
+include::partial$component-endpoint-options.adoc[]
+// component options: END
+
+// endpoint options: START
+
+// endpoint options: END
+
+// component headers: START
+include::partial$component-endpoint-headers.adoc[]
+// component headers: END
+
+== Producer Endpoints
+
+Google PubSub Lite expects the payload to be byte[] array, Producer endpoints will send:
+
+* String body as byte[] encoded as UTF-8
+* byte[] body as is
+* Everything else will be serialised into byte[] array
+
+A Map set as message header `GooglePubsubConstants.ATTRIBUTES` will be sent as PubSub attributes.
+
+When producing messages set the message header `GooglePubsubConstants.ORDERING_KEY` . This will be set as the PubSub Lite orderingKey for the message. More information in https://cloud.google.com/pubsub/lite/docs/publishing#using_ordering_keys[Using ordering keys].
+
+== Consumer Endpoints
+Google PubSub Lite will redeliver the message if it has not been acknowledged within the time period set as a configuration option on the subscription.
+
+The component will acknowledge the message once exchange processing has been completed.
+
+== Message Body
+
+The consumer endpoint returns the content of the message as byte[] - exactly as the underlying system sends it.
+It is up for the route to convert/unmarshall the contents.
+
+== Examples
+
+You'll need to provide a connectionFactory to the ActiveMQ Component, to have the following examples working.
+
+=== Producer Example
+
+[source,java]
+--------------------------------------------------------------------------------
+ from("timer://scheduler?fixedRate=true&period=5s")
+            .setBody(simple("Hello World ${date:now:HH:mm:ss.SSS}"))
+            .to("google-pubsub-lite:123456789012:europe-west3-a:my-topic-lite")
+            .log("Message sent: ${body}");
+--------------------------------------------------------------------------------
+
+=== Consumer Example
+
+[source,java]
+--------------------------------------------------------------------------------
+from("google-pubsub-lite:123456789012:europe-west3-a:my-subscription-lite")
+            .log("Message received: ${body}");
+--------------------------------------------------------------------------------
+
+
+include::spring-boot:partial$starter.adoc[]
diff --git a/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteComponent.java b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteComponent.java
new file mode 100644
index 00000000000..3a0703a1e6e
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteComponent.java
@@ -0,0 +1,249 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.google.pubsublite;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+
+import com.google.api.gax.core.CredentialsProvider;
+import com.google.api.gax.core.FixedCredentialsProvider;
+import com.google.auth.oauth2.GoogleCredentials;
+import com.google.auth.oauth2.ServiceAccountCredentials;
+import com.google.cloud.pubsub.v1.MessageReceiver;
+import com.google.cloud.pubsub.v1.stub.PublisherStubSettings;
+import com.google.cloud.pubsublite.SubscriptionPath;
+import com.google.cloud.pubsublite.TopicPath;
+import com.google.cloud.pubsublite.cloudpubsub.FlowControlSettings;
+import com.google.cloud.pubsublite.cloudpubsub.Publisher;
+import com.google.cloud.pubsublite.cloudpubsub.PublisherSettings;
+import com.google.cloud.pubsublite.cloudpubsub.Subscriber;
+import com.google.cloud.pubsublite.cloudpubsub.SubscriberSettings;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.RemovalListener;
+import org.apache.camel.Endpoint;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.DefaultComponent;
+import org.apache.camel.support.ResourceHelper;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents the component that manages {@link GooglePubsubLiteEndpoint}.
+ */
+@Component("google-pubsub-lite")
+public class GooglePubsubLiteComponent extends DefaultComponent {
+    private static final Logger LOG = LoggerFactory.getLogger(GooglePubsubLiteComponent.class);
+
+    @Metadata(label = "common",
+              description = "The Service account key that can be used as credentials for the PubSub Lite publisher/subscriber. It can be loaded by default from "
+                            + " classpath, but you can prefix with classpath:, file:, or http: to load the resource from different systems.")
+    private String serviceAccountKey;
+
+    @Metadata(
+              label = "producer",
+              description = "Maximum number of producers to cache. This could be increased if you have producers for lots of different topics.")
+    private int publisherCacheSize = 100;
+
+    @Metadata(
+              label = "producer",
+              description = "How many milliseconds should each producer stay alive in the cache.")
+    private int publisherCacheTimeout = 180000;
+
+    @Metadata(
+              label = "consumer",
+              description = "How many milliseconds should each producer stay alive in the cache. " +
+                            "Must be greater than the allowed size of the largest message (1 MiB).")
+    private long consumerBytesOutstanding = 10 * 1024 * 1024;
+
+    @Metadata(
+              label = "consumer",
+              description = "The number of messages that may be outstanding to the client. Must be >0.")
+    private long consumerMessagesOutstanding = 1000;
+
+    @Metadata(
+              label = "advanced",
+              description = "How many milliseconds should a producer be allowed to terminate.")
+    private int publisherTerminationTimeout = 60000;
+
+    private RemovalListener<String, Publisher> removalListener = removal -> {
+        Publisher publisher = removal.getValue();
+        if (ObjectHelper.isNotEmpty(publisher)) {
+            return;
+        }
+        publisher.stopAsync();
+        try {
+            publisher.awaitTerminated(publisherTerminationTimeout, TimeUnit.MILLISECONDS);
+        } catch (Exception e) {
+            throw new RuntimeCamelException(e);
+        }
+    };
+
+    private Cache<String, Publisher> cachedPublishers = CacheBuilder.newBuilder()
+            .expireAfterWrite(publisherCacheTimeout, TimeUnit.MILLISECONDS)
+            .maximumSize(publisherCacheSize)
+            .removalListener(removalListener)
+            .build();
+
+    public GooglePubsubLiteComponent() {
+    }
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+
+        String[] parts = remaining.split(":");
+
+        if (parts.length < 3) {
+            throw new IllegalArgumentException(
+                    "Google PubSub Lite Endpoint format \"projectId:location:destinationName[:subscriptionName]\"");
+
+        }
+
+        GooglePubsubLiteEndpoint pubsubEndpoint = new GooglePubsubLiteEndpoint(uri, this);
+        LOG.debug("Google Cloud ProjectId {}", parts[0]);
+        pubsubEndpoint.setProjectId(parts[0]);
+        LOG.debug("Google Cloud LocationId {}", parts[1]);
+        pubsubEndpoint.setLocation(parts[1]);
+        LOG.debug("Google Cloud DestinationName {}", parts[2]);
+        pubsubEndpoint.setDestinationName(parts[2]);
+        LOG.debug("Google Cloud ServiceAccountKey {}", serviceAccountKey);
+        pubsubEndpoint.setServiceAccountKey(serviceAccountKey);
+
+        setProperties(pubsubEndpoint, parameters);
+
+        return pubsubEndpoint;
+    }
+
+    @Override
+    protected void doShutdown() throws Exception {
+        cachedPublishers.cleanUp();
+        cachedPublishers.invalidateAll();
+        super.doShutdown();
+    }
+
+    public Publisher getPublisher(String topicName, GooglePubsubLiteEndpoint googlePubsubEndpoint)
+            throws ExecutionException {
+        return cachedPublishers.get(topicName, () -> buildPublisher(googlePubsubEndpoint));
+    }
+
+    private Publisher buildPublisher(GooglePubsubLiteEndpoint googlePubsubLiteEndpoint)
+            throws IOException {
+
+        TopicPath topicPath = TopicPath.parse(
+                String.format("projects/%s/locations/%s/topics/%s",
+                        googlePubsubLiteEndpoint.getProjectId(),
+                        googlePubsubLiteEndpoint.getLocation(),
+                        googlePubsubLiteEndpoint.getDestinationName()));
+
+        PublisherSettings publisherSettings = PublisherSettings.newBuilder().setTopicPath(topicPath)
+                .setCredentialsProvider(getCredentialsProvider(googlePubsubLiteEndpoint))
+                .build();
+        Publisher publisher = Publisher.create(publisherSettings);
+        publisher.startAsync().awaitRunning();
+        return publisher;
+    }
+
+    public Subscriber getSubscriber(MessageReceiver messageReceiver, GooglePubsubLiteEndpoint googlePubsubLiteEndpoint)
+            throws IOException {
+
+        SubscriptionPath subscriptionPath = SubscriptionPath
+                .parse(String.format("projects/%s/locations/%s/subscriptions/%s",
+                        googlePubsubLiteEndpoint.getProjectId(),
+                        googlePubsubLiteEndpoint.getLocation(),
+                        googlePubsubLiteEndpoint.getDestinationName()));
+
+        LOG.debug("ConsumerBytesOutstanding {}", consumerBytesOutstanding);
+        LOG.debug("ConsumerMessagesOutstanding {}", consumerMessagesOutstanding);
+
+        // The message stream is paused based on the maximum size or number of messages that the
+        // subscriber has already received, whichever condition is met first.
+        FlowControlSettings flowControlSettings = FlowControlSettings.builder()
+                .setBytesOutstanding(consumerBytesOutstanding)
+                .setMessagesOutstanding(consumerMessagesOutstanding)
+                .build();
+
+        SubscriberSettings subscriberSettings = SubscriberSettings.newBuilder()
+                .setSubscriptionPath(subscriptionPath)
+                .setReceiver(messageReceiver)
+                // Flow control settings are set at the partition level.
+                .setPerPartitionFlowControlSettings(flowControlSettings)
+                .setCredentialsProvider(getCredentialsProvider(googlePubsubLiteEndpoint))
+                .build();
+
+        return Subscriber.create(subscriberSettings);
+    }
+
+    private CredentialsProvider getCredentialsProvider(GooglePubsubLiteEndpoint endpoint) throws IOException {
+        return FixedCredentialsProvider.create(ObjectHelper.isEmpty(endpoint.getServiceAccountKey())
+                ? GoogleCredentials.getApplicationDefault() : ServiceAccountCredentials.fromStream(ResourceHelper
+                        .resolveMandatoryResourceAsInputStream(getCamelContext(), endpoint.getServiceAccountKey()))
+                        .createScoped(PublisherStubSettings.getDefaultServiceScopes()));
+    }
+
+    public int getPublisherCacheSize() {
+        return publisherCacheSize;
+    }
+
+    public void setPublisherCacheSize(int publisherCacheSize) {
+        this.publisherCacheSize = publisherCacheSize;
+    }
+
+    public int getPublisherCacheTimeout() {
+        return publisherCacheTimeout;
+    }
+
+    public void setPublisherCacheTimeout(int publisherCacheTimeout) {
+        this.publisherCacheTimeout = publisherCacheTimeout;
+    }
+
+    public int getPublisherTerminationTimeout() {
+        return publisherTerminationTimeout;
+    }
+
+    public void setPublisherTerminationTimeout(int publisherTerminationTimeout) {
+        this.publisherTerminationTimeout = publisherTerminationTimeout;
+    }
+
+    public String getServiceAccountKey() {
+        return serviceAccountKey;
+    }
+
+    public void setServiceAccountKey(String serviceAccountKey) {
+        this.serviceAccountKey = serviceAccountKey;
+    }
+
+    public long getConsumerBytesOutstanding() {
+        return consumerBytesOutstanding;
+    }
+
+    public void setConsumerBytesOutstanding(long consumerBytesOutstanding) {
+        this.consumerBytesOutstanding = consumerBytesOutstanding;
+    }
+
+    public long getConsumerMessagesOutstanding() {
+        return consumerMessagesOutstanding;
+    }
+
+    public void setConsumerMessagesOutstanding(long consumerMessagesOutstanding) {
+        this.consumerMessagesOutstanding = consumerMessagesOutstanding;
+    }
+}
diff --git a/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteConstants.java b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteConstants.java
new file mode 100644
index 00000000000..da8fe718e6d
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteConstants.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.google.pubsublite;
+
+import org.apache.camel.spi.Metadata;
+
+public final class GooglePubsubLiteConstants {
+
+    @Metadata(description = "The ID of the message, assigned by the server when the message is published.", javaType = "String")
+    public static final String MESSAGE_ID = "CamelGooglePubsubMessageId";
+    @Metadata(label = "consumer", description = "The ID used to acknowledge the received message.", javaType = "String")
+    public static final String ACK_ID = "CamelGooglePubsubMsgAckId";
+    @Metadata(label = "consumer", description = "The time at which the message was published",
+              javaType = "com.google.protobuf.Timestamp")
+    public static final String PUBLISH_TIME = "CamelGooglePubsubPublishTime";
+    @Metadata(description = "The attributes of the message.", javaType = "Map<String, String>")
+    public static final String ATTRIBUTES = "CamelGooglePubsubAttributes";
+    @Metadata(label = "producer",
+              description = "If non-empty, identifies related messages for which publish order should be respected.",
+              javaType = "String")
+    public static final String ORDERING_KEY = "CamelGooglePubsubOrderingKey";
+    public static final String RESERVED_GOOGLE_CLIENT_ATTRIBUTE_PREFIX = "goog";
+
+    public enum AckMode {
+        AUTO,
+        NONE
+    }
+
+    private GooglePubsubLiteConstants() {
+        // not called
+    }
+}
diff --git a/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteConsumer.java b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteConsumer.java
new file mode 100644
index 00000000000..128def8432d
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteConsumer.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.google.pubsublite;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+
+import com.google.cloud.pubsub.v1.MessageReceiver;
+import com.google.cloud.pubsublite.cloudpubsub.Subscriber;
+import com.google.common.base.Strings;
+import com.google.pubsub.v1.ProjectSubscriptionName;
+import org.apache.camel.Processor;
+import org.apache.camel.component.google.pubsublite.consumer.CamelMessageReceiver;
+import org.apache.camel.support.DefaultConsumer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class GooglePubsubLiteConsumer extends DefaultConsumer {
+
+    private Logger localLog;
+
+    private final GooglePubsubLiteEndpoint endpoint;
+    private final Processor processor;
+    private ExecutorService executor;
+    private final List<Subscriber> subscribers;
+
+    GooglePubsubLiteConsumer(GooglePubsubLiteEndpoint endpoint, Processor processor) {
+        super(endpoint, processor);
+        this.endpoint = endpoint;
+        this.processor = processor;
+        this.subscribers = Collections.synchronizedList(new LinkedList<>());
+        String loggerId = endpoint.getLoggerId();
+
+        if (Strings.isNullOrEmpty(loggerId)) {
+            loggerId = this.getClass().getName();
+        }
+
+        localLog = LoggerFactory.getLogger(loggerId);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+        localLog.info("Starting Google PubSub Lite consumer for {}/{}", endpoint.getProjectId(), endpoint.getDestinationName());
+        executor = endpoint.createExecutor();
+        for (int i = 0; i < endpoint.getConcurrentConsumers(); i++) {
+            executor.submit(new SubscriberWrapper());
+        }
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        super.doStop();
+        localLog.info("Stopping Google PubSub Lite consumer for {}/{}", endpoint.getProjectId(), endpoint.getDestinationName());
+
+        synchronized (subscribers) {
+            if (!subscribers.isEmpty()) {
+                localLog.info("Stopping subscribers for {}/{}", endpoint.getProjectId(), endpoint.getDestinationName());
+                subscribers.forEach(Subscriber::stopAsync);
+            }
+        }
+
+        if (executor != null) {
+            if (getEndpoint() != null && getEndpoint().getCamelContext() != null) {
+                getEndpoint().getCamelContext().getExecutorServiceManager().shutdownGraceful(executor);
+            } else {
+                executor.shutdownNow();
+            }
+        }
+        executor = null;
+    }
+
+    private class SubscriberWrapper implements Runnable {
+
+        private final String subscriptionName;
+
+        SubscriberWrapper() {
+            subscriptionName
+                    = ProjectSubscriptionName.format(endpoint.getProjectId().toString(), endpoint.getDestinationName());
+        }
+
+        @Override
+        public void run() {
+            try {
+                if (localLog.isDebugEnabled()) {
+                    localLog.debug("Subscribing to {}", subscriptionName);
+                }
+
+                while (isRunAllowed() && !isSuspendingOrSuspended()) {
+                    MessageReceiver messageReceiver
+                            = new CamelMessageReceiver(GooglePubsubLiteConsumer.this, endpoint, processor);
+
+                    Subscriber subscriber = endpoint.getComponent().getSubscriber(messageReceiver, endpoint);
+                    try {
+                        subscribers.add(subscriber);
+                        subscriber.startAsync().awaitRunning();
+                        subscriber.awaitTerminated();
+                    } catch (Exception e) {
+                        localLog.error("Failure getting messages from PubSub Lite", e);
+                    } finally {
+                        localLog.debug("Stopping async subscriber {}", subscriptionName);
+                        subscriber.stopAsync();
+                    }
+                }
+
+                localLog.debug("Exit run for subscription {}", subscriptionName);
+            } catch (Exception e) {
+                localLog.error("Failure getting messages from PubSub", e);
+            }
+        }
+    }
+}
diff --git a/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteEndpoint.java b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteEndpoint.java
new file mode 100644
index 00000000000..12a56d24739
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteEndpoint.java
@@ -0,0 +1,233 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.google.pubsublite;
+
+import java.util.concurrent.ExecutorService;
+
+import org.apache.camel.*;
+import org.apache.camel.component.google.pubsublite.serializer.DefaultGooglePubsubSerializer;
+import org.apache.camel.component.google.pubsublite.serializer.GooglePubsubSerializer;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriPath;
+import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Send and receive messages to/from Google Cloud Platform PubSub Lite Service.
+ * <p/>
+ * Built on top of the Google Cloud Pub/Sub Lite libraries.
+ */
+@UriEndpoint(firstVersion = "4.5.0", scheme = "google-pubsub-lite", title = "Google Pubsub Lite",
+             syntax = "google-pubsub-lite:projectId:location:destinationName",
+             category = { Category.CLOUD, Category.MESSAGING },
+             headersClass = GooglePubsubLiteConstants.class)
+public class GooglePubsubLiteEndpoint extends DefaultEndpoint {
+
+    private Logger log;
+
+    @UriPath(label = "common", description = "The Google Cloud PubSub Lite Project Id")
+    @Metadata(required = true)
+    private Long projectId;
+
+    @UriPath(label = "common", description = "The Google Cloud PubSub Lite location")
+    @Metadata(required = true)
+    private String location;
+
+    @UriPath(label = "common",
+             description = "The Destination Name. For the consumer this will be the subscription name, while for the producer this will be the topic name.")
+    @Metadata(required = true)
+    private String destinationName;
+
+    @UriParam(label = "common",
+              description = "The Service account key that can be used as credentials for the PubSub publisher/subscriber. It can be loaded by default from "
+                            + " classpath, but you can prefix with classpath:, file:, or http: to load the resource from different systems.")
+    private String serviceAccountKey;
+
+    @UriParam(name = "loggerId", description = "Logger ID to use when a match to the parent route required")
+    private String loggerId;
+
+    @UriParam(label = "consumer", name = "concurrentConsumers",
+              description = "The number of parallel streams consuming from the subscription",
+              defaultValue = "1")
+    private Integer concurrentConsumers = 1;
+
+    @UriParam(label = "consumer", name = "maxMessagesPerPoll",
+              description = "The max number of messages to receive from the server in a single API call", defaultValue = "1")
+    private Integer maxMessagesPerPoll = 1;
+
+    @UriParam(label = "consumer", defaultValue = "AUTO", enums = "AUTO,NONE",
+              description = "AUTO = exchange gets ack'ed/nack'ed on completion. NONE = downstream process has to ack/nack explicitly")
+    private GooglePubsubLiteConstants.AckMode ackMode = GooglePubsubLiteConstants.AckMode.AUTO;
+
+    @UriParam(label = "consumer", name = "maxAckExtensionPeriod",
+              description = "Set the maximum period a message ack deadline will be extended. Value in seconds",
+              defaultValue = "3600")
+    private int maxAckExtensionPeriod = 3600;
+
+    @UriParam(description = "Pub/Sub endpoint to use. Required when using message ordering, and ensures that messages are received in order even when multiple publishers are used",
+              label = "producer,advanced")
+    private String pubsubEndpoint;
+
+    @UriParam(name = "serializer",
+              description = "A custom GooglePubsubLiteSerializer to use for serializing message payloads in the producer",
+              label = "producer,advanced")
+    @Metadata(autowired = true)
+    private GooglePubsubSerializer serializer;
+
+    public GooglePubsubLiteEndpoint(String uri, Component component) {
+        super(uri, component);
+    }
+
+    @Override
+    public GooglePubsubLiteComponent getComponent() {
+        return (GooglePubsubLiteComponent) super.getComponent();
+    }
+
+    public void afterPropertiesSet() {
+        if (ObjectHelper.isEmpty(loggerId)) {
+            log = LoggerFactory.getLogger(this.getClass().getName());
+        } else {
+            log = LoggerFactory.getLogger(loggerId);
+        }
+
+        // Default pubsub connection.
+        // With the publisher endpoints - the main publisher
+        // with the consumer endpoints - the ack client
+
+        log.trace("Project ID: {}", this.projectId);
+        log.trace("Destination Name: {}", this.destinationName);
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        afterPropertiesSet();
+        if (ObjectHelper.isEmpty(serializer)) {
+            serializer = new DefaultGooglePubsubSerializer();
+        }
+        return new GooglePubsubLiteProducer(this);
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) throws Exception {
+        afterPropertiesSet();
+        setExchangePattern(ExchangePattern.InOnly);
+        GooglePubsubLiteConsumer consumer = new GooglePubsubLiteConsumer(this, processor);
+        configureConsumer(consumer);
+        return consumer;
+    }
+
+    public ExecutorService createExecutor() {
+        return getCamelContext().getExecutorServiceManager().newFixedThreadPool(this,
+                "GooglePubsubLiteConsumer[" + getDestinationName() + "]", concurrentConsumers);
+    }
+
+    public Long getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(Long projectId) {
+        this.projectId = projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        setProjectId(Long.parseLong(projectId));
+    }
+
+    public String getLoggerId() {
+        return loggerId;
+    }
+
+    public void setLoggerId(String loggerId) {
+        this.loggerId = loggerId;
+    }
+
+    public String getServiceAccountKey() {
+        return serviceAccountKey;
+    }
+
+    public void setServiceAccountKey(String serviceAccountKey) {
+        this.serviceAccountKey = serviceAccountKey;
+    }
+
+    public String getDestinationName() {
+        return destinationName;
+    }
+
+    public void setDestinationName(String destinationName) {
+        this.destinationName = destinationName;
+    }
+
+    public Integer getConcurrentConsumers() {
+        return concurrentConsumers;
+    }
+
+    public void setConcurrentConsumers(Integer concurrentConsumers) {
+        this.concurrentConsumers = concurrentConsumers;
+    }
+
+    public Integer getMaxMessagesPerPoll() {
+        return maxMessagesPerPoll;
+    }
+
+    public void setMaxMessagesPerPoll(Integer maxMessagesPerPoll) {
+        this.maxMessagesPerPoll = maxMessagesPerPoll;
+    }
+
+    public GooglePubsubLiteConstants.AckMode getAckMode() {
+        return ackMode;
+    }
+
+    public void setAckMode(GooglePubsubLiteConstants.AckMode ackMode) {
+        this.ackMode = ackMode;
+    }
+
+    public int getMaxAckExtensionPeriod() {
+        return maxAckExtensionPeriod;
+    }
+
+    public void setMaxAckExtensionPeriod(int maxAckExtensionPeriod) {
+        this.maxAckExtensionPeriod = maxAckExtensionPeriod;
+    }
+
+    public GooglePubsubSerializer getSerializer() {
+        return serializer;
+    }
+
+    public void setSerializer(GooglePubsubSerializer serializer) {
+        this.serializer = serializer;
+    }
+
+    public String getPubsubEndpoint() {
+        return this.pubsubEndpoint;
+    }
+
+    public void setPubsubEndpoint(String pubsubEndpoint) {
+        this.pubsubEndpoint = pubsubEndpoint;
+    }
+
+    public String getLocation() {
+        return location;
+    }
+
+    public void setLocation(String location) {
+        this.location = location;
+    }
+}
diff --git a/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteProducer.java b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteProducer.java
new file mode 100644
index 00000000000..5e01b5bbf4a
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteProducer.java
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.google.pubsublite;
+
+import java.util.List;
+import java.util.Map;
+
+import com.google.api.core.ApiFuture;
+import com.google.cloud.pubsublite.cloudpubsub.Publisher;
+import com.google.common.base.Strings;
+import com.google.protobuf.ByteString;
+import com.google.pubsub.v1.PubsubMessage;
+import org.apache.camel.Exchange;
+import org.apache.camel.support.DefaultProducer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.camel.component.google.pubsublite.GooglePubsubLiteConstants.ATTRIBUTES;
+import static org.apache.camel.component.google.pubsublite.GooglePubsubLiteConstants.ORDERING_KEY;
+import static org.apache.camel.component.google.pubsublite.GooglePubsubLiteConstants.RESERVED_GOOGLE_CLIENT_ATTRIBUTE_PREFIX;
+
+/**
+ * Generic PubSub Lite Producer
+ */
+public class GooglePubsubLiteProducer extends DefaultProducer {
+
+    public Logger logger;
+
+    public GooglePubsubLiteProducer(GooglePubsubLiteEndpoint endpoint) {
+        super(endpoint);
+
+        String loggerId = endpoint.getLoggerId();
+
+        if (Strings.isNullOrEmpty(loggerId)) {
+            loggerId = this.getClass().getName();
+        }
+
+        logger = LoggerFactory.getLogger(loggerId);
+    }
+
+    /**
+     * The incoming message is expected to be either - a List of Exchanges (aggregated) - an Exchange
+     */
+    @Override
+    public void process(Exchange exchange) throws Exception {
+
+        if (logger.isDebugEnabled()) {
+            logger.debug("uploader thread/id: {} / {}. api call completed.", Thread.currentThread().getId(),
+                    exchange.getExchangeId());
+        }
+
+        if (exchange.getIn().getBody() instanceof List) {
+            boolean groupedExchanges = false;
+            for (Object body : exchange.getIn().getBody(List.class)) {
+                if (body instanceof Exchange) {
+                    send((Exchange) body);
+                    groupedExchanges = true;
+                }
+            }
+            if (!groupedExchanges) {
+                send(exchange);
+            }
+        } else {
+            send(exchange);
+        }
+    }
+
+    private void send(Exchange exchange) throws Exception {
+
+        GooglePubsubLiteEndpoint endpoint = (GooglePubsubLiteEndpoint) getEndpoint();
+        String topicName = String.format("projects/%s/locations/%s/topics/%s", endpoint.getProjectId(), endpoint.getLocation(),
+                endpoint.getDestinationName());
+
+        Publisher publisher = endpoint.getComponent().getPublisher(topicName, endpoint);
+
+        Object body = exchange.getMessage().getBody();
+        ByteString byteString;
+
+        if (body instanceof String) {
+            byteString = ByteString.copyFromUtf8((String) body);
+        } else if (body instanceof byte[]) {
+            byteString = ByteString.copyFrom((byte[]) body);
+        } else {
+            byteString = ByteString.copyFrom(endpoint.getSerializer().serialize(body));
+        }
+
+        PubsubMessage.Builder messageBuilder = PubsubMessage.newBuilder().setData(byteString);
+        Map<String, String> attributes = exchange.getMessage().getHeader(ATTRIBUTES, Map.class);
+        if (attributes != null) {
+            for (Map.Entry<String, String> attribute : attributes.entrySet()) {
+                if (!attribute.getKey().startsWith(RESERVED_GOOGLE_CLIENT_ATTRIBUTE_PREFIX)) {
+                    messageBuilder.putAttributes(attribute.getKey(), attribute.getValue());
+                }
+            }
+        }
+        String orderingKey = exchange.getMessage().getHeader(ORDERING_KEY, String.class);
+        if (orderingKey != null) {
+            messageBuilder.setOrderingKey(orderingKey);
+        }
+
+        PubsubMessage message = messageBuilder.build();
+
+        ApiFuture<String> messageIdFuture = publisher.publish(message);
+        exchange.getMessage().setHeader(GooglePubsubLiteConstants.MESSAGE_ID, messageIdFuture.get());
+    }
+}
diff --git a/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/consumer/Acknowledge.java b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/consumer/Acknowledge.java
new file mode 100644
index 00000000000..2ab2efd07d0
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/consumer/Acknowledge.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.google.pubsublite.consumer;
+
+import com.google.cloud.pubsub.v1.AckReplyConsumer;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.Synchronization;
+
+public class Acknowledge implements Synchronization {
+
+    private final AckReplyConsumer ackReplyConsumer;
+
+    public Acknowledge(AckReplyConsumer ackReplyConsumer) {
+        this.ackReplyConsumer = ackReplyConsumer;
+    }
+
+    @Override
+    public void onComplete(Exchange exchange) {
+        ackReplyConsumer.ack();
+    }
+
+    @Override
+    public void onFailure(Exchange exchange) {
+        ackReplyConsumer.nack();
+    }
+}
diff --git a/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/consumer/CamelMessageReceiver.java b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/consumer/CamelMessageReceiver.java
new file mode 100644
index 00000000000..486db617eab
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/consumer/CamelMessageReceiver.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.google.pubsublite.consumer;
+
+import com.google.cloud.pubsub.v1.AckReplyConsumer;
+import com.google.cloud.pubsub.v1.MessageReceiver;
+import com.google.common.base.Strings;
+import com.google.pubsub.v1.PubsubMessage;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.component.google.pubsublite.GooglePubsubLiteConstants;
+import org.apache.camel.component.google.pubsublite.GooglePubsubLiteConsumer;
+import org.apache.camel.component.google.pubsublite.GooglePubsubLiteEndpoint;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CamelMessageReceiver implements MessageReceiver {
+
+    private final Logger localLog;
+    private final GooglePubsubLiteConsumer consumer;
+    private final GooglePubsubLiteEndpoint endpoint;
+    private final Processor processor;
+
+    public CamelMessageReceiver(GooglePubsubLiteConsumer consumer, GooglePubsubLiteEndpoint endpoint, Processor processor) {
+        this.consumer = consumer;
+        this.endpoint = endpoint;
+        this.processor = processor;
+        String loggerId = endpoint.getLoggerId();
+        if (Strings.isNullOrEmpty(loggerId)) {
+            loggerId = this.getClass().getName();
+        }
+        localLog = LoggerFactory.getLogger(loggerId);
+    }
+
+    @Override
+    public void receiveMessage(PubsubMessage pubsubMessage, AckReplyConsumer ackReplyConsumer) {
+        if (localLog.isTraceEnabled()) {
+            localLog.trace("Received message ID : {}", pubsubMessage.getMessageId());
+        }
+
+        Exchange exchange = consumer.createExchange(true);
+        exchange.getIn().setBody(pubsubMessage.getData().toByteArray());
+
+        exchange.getIn().setHeader(GooglePubsubLiteConstants.MESSAGE_ID, pubsubMessage.getMessageId());
+        exchange.getIn().setHeader(GooglePubsubLiteConstants.PUBLISH_TIME, pubsubMessage.getPublishTime());
+
+        if (null != pubsubMessage.getAttributesMap()) {
+            exchange.getIn().setHeader(GooglePubsubLiteConstants.ATTRIBUTES, pubsubMessage.getAttributesMap());
+        }
+
+        if (endpoint.getAckMode() != GooglePubsubLiteConstants.AckMode.NONE) {
+            exchange.getExchangeExtension().addOnCompletion(new Acknowledge(ackReplyConsumer));
+        }
+
+        try {
+            processor.process(exchange);
+        } catch (Exception e) {
+            consumer.getExceptionHandler().handleException(e);
+        }
+    }
+}
diff --git a/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/serializer/DefaultGooglePubsubSerializer.java b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/serializer/DefaultGooglePubsubSerializer.java
new file mode 100644
index 00000000000..77ac474c151
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/serializer/DefaultGooglePubsubSerializer.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.google.pubsublite.serializer;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+
+/**
+ * Default GooglePubsubMessageSerializer that uses ObjectOutputStream to serialize objects.
+ */
+public class DefaultGooglePubsubSerializer implements GooglePubsubSerializer {
+
+    @Override
+    public byte[] serialize(Object payload) throws IOException {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        ObjectOutputStream os = new ObjectOutputStream(out);
+        os.writeObject(payload);
+        return out.toByteArray();
+    }
+}
diff --git a/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/serializer/GooglePubsubSerializer.java b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/serializer/GooglePubsubSerializer.java
new file mode 100644
index 00000000000..987403bb77c
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/main/java/org/apache/camel/component/google/pubsublite/serializer/GooglePubsubSerializer.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.google.pubsublite.serializer;
+
+import java.io.IOException;
+
+/**
+ * An abstraction to customize how the GooglePubsubProducer serializes non String & byte[] message body payloads.
+ */
+public interface GooglePubsubSerializer {
+
+    /**
+     * Serializes an object payload to a byte array.
+     *
+     * @param  payload     The payload to serialize
+     * @return             The serialized payload as a byte array
+     * @throws IOException If the serialization process encountered errors
+     */
+    byte[] serialize(Object payload) throws IOException;
+}
diff --git a/components/camel-google/camel-google-pubsub-lite/src/test/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteComponentTest.java b/components/camel-google/camel-google-pubsub-lite/src/test/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteComponentTest.java
new file mode 100644
index 00000000000..7111b4fe36c
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/test/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteComponentTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.google.pubsublite;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class GooglePubsubLiteComponentTest extends CamelTestSupport {
+
+    private GooglePubsubLiteComponent googlePubsubLiteComponent;
+
+    @BeforeEach
+    public void setUp() throws Exception {
+        googlePubsubLiteComponent = new GooglePubsubLiteComponent();
+    }
+
+    @Test
+    public void testCreateEndpointAllFields() throws Exception {
+        String uri = "google-pubsub-lite:123456789012:europe-west3:test";
+        String remaining = "123456789012:europe-west3:test";
+        Map<String, Object> parameters = new HashMap<>();
+        Endpoint endpoint = googlePubsubLiteComponent.createEndpoint(uri, remaining, parameters);
+
+        assertTrue(endpoint instanceof GooglePubsubLiteEndpoint, "Should return instance of GooglePubsubLiteEndpoint");
+        GooglePubsubLiteEndpoint googlePubsubLiteEndpoint = (GooglePubsubLiteEndpoint) endpoint;
+
+        assertEquals(123456789012L, googlePubsubLiteEndpoint.getProjectId());
+        assertEquals("europe-west3", googlePubsubLiteEndpoint.getLocation());
+        assertEquals("test", googlePubsubLiteEndpoint.getDestinationName());
+    }
+
+    @Test
+    public void testCreateEndpointMissingFields() {
+        String uri = "google-pubsub-lite:123456789012:europe-west3";
+        String remaining = "123456789012:europe-west3";
+        Map<String, Object> parameters = new HashMap<>();
+
+        Exception exception = assertThrows(IllegalArgumentException.class,
+                () -> googlePubsubLiteComponent.createEndpoint(uri, remaining, parameters));
+
+        String expectedMessage = "Google PubSub Lite Endpoint format \"projectId:location:destinationName[:subscriptionName]\"";
+        String actualMessage = exception.getMessage();
+        assertTrue(actualMessage.contains(expectedMessage));
+    }
+}
diff --git a/components/camel-google/camel-google-pubsub-lite/src/test/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteConsumerTest.java b/components/camel-google/camel-google-pubsub-lite/src/test/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteConsumerTest.java
new file mode 100644
index 00000000000..3e3744ebbda
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/test/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteConsumerTest.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.google.pubsublite;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.support.DefaultExchange;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.*;
+
+public class GooglePubsubLiteConsumerTest extends CamelTestSupport {
+
+    @Mock
+    private Processor processor;
+
+    @Mock
+    private GooglePubsubLiteEndpoint endpoint;
+
+    @BeforeEach
+    public void setup() {
+        MockitoAnnotations.openMocks(this);
+    }
+
+    @Test
+    public void testGooglePubsubLiteConsumer() {
+        when(endpoint.getCamelContext()).thenReturn(context);
+        GooglePubsubLiteConsumer consumer = new GooglePubsubLiteConsumer(endpoint, processor);
+        assertNotNull(consumer);
+    }
+
+    @Test
+    public void testGooglePubsubLiteConsumerException() throws Exception {
+        when(endpoint.getCamelContext()).thenReturn(context);
+        GooglePubsubLiteConsumer consumer = new GooglePubsubLiteConsumer(endpoint, processor);
+        assertNotNull(consumer);
+
+        // Assuming the processor is throwing an exception
+        doThrow(new RuntimeException("Mocked Exception")).when(processor).process(any());
+
+        // Creating a new exception to test the process
+        Exchange exchange = new DefaultExchange(context);
+
+        assertThrows(RuntimeException.class, () -> processor.process(exchange));
+        // Verifying processor was called
+        verify(processor, times(1)).process(any());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .process(exchange -> {
+                            // simulate some processing here.
+                        }).to("mock:result");
+            }
+        };
+    }
+}
diff --git a/components/camel-google/camel-google-pubsub-lite/src/test/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteProducerTest.java b/components/camel-google/camel-google-pubsub-lite/src/test/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteProducerTest.java
new file mode 100644
index 00000000000..894fa39fe32
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/test/java/org/apache/camel/component/google/pubsublite/GooglePubsubLiteProducerTest.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.google.pubsublite;
+
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+
+import com.google.api.core.ApiFutures;
+import com.google.cloud.pubsublite.cloudpubsub.Publisher;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.*;
+
+public class GooglePubsubLiteProducerTest extends CamelTestSupport {
+
+    @Mock
+    private GooglePubsubLiteEndpoint mockEndpoint;
+    @Mock
+    private Exchange mockExchange;
+    @Mock
+    private Message mockMessage;
+    @Mock
+    private Publisher mockPublisher;
+
+    @BeforeEach
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void testProcess() throws Exception {
+        GooglePubsubLiteProducer producer = new GooglePubsubLiteProducer(mockEndpoint);
+        String testPayload = "Test Payload";
+
+        when(mockExchange.getIn()).thenReturn(mockMessage);
+        when(mockEndpoint.getProjectId()).thenReturn(123456789012L);
+        when(mockEndpoint.getLocation()).thenReturn("europe-west3");
+        when(mockEndpoint.getDestinationName()).thenReturn("testDestination");
+        when(mockEndpoint.getComponent()).thenReturn(mock(GooglePubsubLiteComponent.class));
+        when(mockEndpoint.getComponent().getPublisher(any(), any())).thenReturn(mockPublisher);
+
+        when(mockExchange.getMessage()).thenReturn(mockMessage);
+        when(mockMessage.getBody()).thenReturn(testPayload.getBytes());
+        when(mockExchange.getMessage().getHeader(GooglePubsubLiteConstants.ATTRIBUTES, Map.class)).thenReturn(null);
+        when(mockExchange.getMessage().getHeader(GooglePubsubLiteConstants.ORDERING_KEY, String.class)).thenReturn(null);
+
+        when(mockPublisher.publish(any())).thenReturn(ApiFutures.immediateFuture("messageId"));
+
+        producer.process(mockExchange);
+
+        verify(mockPublisher, times(1)).publish(any());
+    }
+
+    @Test
+    public void testProcessException() throws ExecutionException {
+        GooglePubsubLiteProducer producer = new GooglePubsubLiteProducer(mockEndpoint);
+        String testPayload = "Test Payload";
+
+        when(mockEndpoint.getProjectId()).thenReturn(123456789012L);
+        when(mockEndpoint.getLocation()).thenReturn("europe-west3");
+        when(mockEndpoint.getDestinationName()).thenReturn("testDestination");
+        when(mockEndpoint.getComponent()).thenReturn(mock(GooglePubsubLiteComponent.class));
+
+        // Make getPublisher() throw an ExecutionException
+        when(mockEndpoint.getComponent().getPublisher(any(), any()))
+                .thenThrow(new ExecutionException("Test exception", new Throwable()));
+
+        when(mockExchange.getIn()).thenReturn(mockMessage);
+        when(mockMessage.getBody()).thenReturn(testPayload.getBytes());
+        when(mockExchange.getIn().getHeader(GooglePubsubLiteConstants.ATTRIBUTES, Map.class)).thenReturn(null);
+        when(mockExchange.getIn().getHeader(GooglePubsubLiteConstants.ORDERING_KEY, String.class)).thenReturn(null);
+
+        assertThrows(ExecutionException.class, () -> producer.process(mockExchange));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:start")
+                        .to("google-pubsub-lite:123456789012:europe-west3:test");
+            }
+        };
+    }
+}
diff --git a/components/camel-google/camel-google-pubsub-lite/src/test/resources/log4j.properties b/components/camel-google/camel-google-pubsub-lite/src/test/resources/log4j.properties
new file mode 100644
index 00000000000..2516ec86c95
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/test/resources/log4j.properties
@@ -0,0 +1,37 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+#
+# The logging properties used during tests..
+#
+log4j.rootLogger=INFO, out
+
+#log4j.logger.org.apache.camel.component.google.pubsub=TRACE
+#log4j.logger.org.apache.camel=DEBUG
+#log4j.logger.org.apache.camel.impl=WARN
+
+# CONSOLE appender not used by default
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+
+# File appender
+log4j.appender.out=org.apache.log4j.FileAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+log4j.appender.out.file=target/camel-google-pubsub-test.log
+log4j.appender.out.append=true
diff --git a/components/camel-google/camel-google-pubsub-lite/src/test/resources/simple.properties b/components/camel-google/camel-google-pubsub-lite/src/test/resources/simple.properties
new file mode 100644
index 00000000000..e9402b4b9b7
--- /dev/null
+++ b/components/camel-google/camel-google-pubsub-lite/src/test/resources/simple.properties
@@ -0,0 +1,20 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+project.id=test-project
+topic.name=test-topic
+subscription.name=test-topic-subscription
\ No newline at end of file
diff --git a/components/camel-google/pom.xml b/components/camel-google/pom.xml
index 927c47c2dbd..704abe5904b 100644
--- a/components/camel-google/pom.xml
+++ b/components/camel-google/pom.xml
@@ -39,6 +39,7 @@
         <module>camel-google-functions</module>
         <module>camel-google-mail</module>
         <module>camel-google-pubsub</module>
+        <module>camel-google-pubsub-lite</module>
         <module>camel-google-secret-manager</module>
         <module>camel-google-sheets</module>
         <module>camel-google-storage</module>
diff --git a/docs/components/modules/ROOT/examples/json/google-pubsub-lite.json b/docs/components/modules/ROOT/examples/json/google-pubsub-lite.json
new file mode 120000
index 00000000000..1aebc21d033
--- /dev/null
+++ b/docs/components/modules/ROOT/examples/json/google-pubsub-lite.json
@@ -0,0 +1 @@
+../../../../../../components/camel-google/camel-google-pubsub-lite/src/generated/resources/META-INF/org/apache/camel/component/google/pubsublite/google-pubsub-lite.json
\ No newline at end of file
diff --git a/docs/components/modules/ROOT/nav.adoc b/docs/components/modules/ROOT/nav.adoc
index c95a158301c..beefb8c4749 100644
--- a/docs/components/modules/ROOT/nav.adoc
+++ b/docs/components/modules/ROOT/nav.adoc
@@ -122,6 +122,7 @@
 *** xref:google-mail-component.adoc[Google Mail]
 *** xref:google-mail-stream-component.adoc[Google Mail Stream]
 *** xref:google-pubsub-component.adoc[Google Pubsub]
+*** xref:google-pubsub-lite-component.adoc[Google Pubsub Lite]
 *** xref:google-secret-manager-component.adoc[Google Secret Manager]
 *** xref:google-sheets-component.adoc[Google Sheets]
 *** xref:google-sheets-stream-component.adoc[Google Sheets Stream]
diff --git a/docs/components/modules/ROOT/pages/google-pubsub-lite-component.adoc b/docs/components/modules/ROOT/pages/google-pubsub-lite-component.adoc
new file mode 120000
index 00000000000..32436745ffc
--- /dev/null
+++ b/docs/components/modules/ROOT/pages/google-pubsub-lite-component.adoc
@@ -0,0 +1 @@
+../../../../../components/camel-google/camel-google-pubsub-lite/src/main/docs/google-pubsub-lite-component.adoc
\ No newline at end of file
diff --git a/parent/pom.xml b/parent/pom.xml
index d84fa1c6643..4e176894aa8 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -1322,6 +1322,11 @@
                 <artifactId>camel-google-pubsub</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-google-pubsub-lite</artifactId>
+                <version>${project.version}</version>
+            </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
                 <artifactId>camel-google-secret-manager</artifactId>