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 <devya...@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>


Reply via email to