1

我正在尝试通过 java 执行 apache pulsar 生产者和消费者程序,我在 GCP 虚拟机中独立安装了 apache-pulsar 并以独立模式启动集群。下一步是我在 Windows Eclipse 中提供了一个 Maven 构建,以及我在 GCP 机器中上传的相同 jar 文件当我在 Windows Eclipse 中执行生产者和消费者程序时,我收到连接被拒绝错误,这很明显,因为 pulsar 没有安装在 Windows 机器中。但是,当我在 GCP 实例中尝试相同的事情时,即使集群已经启动,我也会收到与 no class def found 错误有关的错误。

pom.xml >>>

<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>pulsar-client-project</groupId>
<artifactId>pulsar-client-project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>pulsar-client-project</name>
 <url>http://maven.apache.org</url>

<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
  <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>3.8.1</version>
  <scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.pulsar</groupId>
<artifactId>pulsar-client</artifactId>
<version>2.0.1-incubating</version>
</dependency>
</dependencies>
</project>

ProducerTutorial.java >>>

package pulsar_client_project.pulsar_client_project;


import org.apache.pulsar.client.api.CompressionType;
import org.apache.pulsar.client.api.Message;
import org.apache.pulsar.client.api.MessageBuilder;
import org.apache.pulsar.client.api.MessageId;
import org.apache.pulsar.client.api.Producer;
import org.apache.pulsar.client.api.PulsarClient;
import org.apache.pulsar.client.api.PulsarClientException;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.stream.IntStream;

public class ProducerTutorial {
  //    private static final Logger log = 
LoggerFactory.getLogger(ProducerTutorial.class);
private static final String SERVICE_URL = "pulsar://localhost:6650";
private static final String TOPIC_NAME = "my-topic";

public static void main(String[] args) throws IOException {
    System.out.println("inside main");
    // Create a Pulsar client instance. A single instance can be shared across many
    // producers and consumer within the same application
    PulsarClient client = PulsarClient.builder()
            .serviceUrl(SERVICE_URL)
            .build();
    System.out.println("client.."+client);
    // Here you get the chance to configure producer specific settings
    Producer<byte[]> producer = client.newProducer()
            // Set the topic
            .topic(TOPIC_NAME)
            // Enable compression
            .compressionType(CompressionType.LZ4)
            .create();  

    System.out.println("producer.."+producer);
    // Once the producer is created, it can be used for the entire application life-cycle
   // log.info("Created producer for the topic {}", TOPIC_NAME);

    // Send 10 test messages
    IntStream.range(1, 11).forEach(i -> {
        String content = String.format("hello-pulsar-%d", i);

        // Build a message object
        Message<byte[]> msg = MessageBuilder.create()
                .setContent(content.getBytes())
                .build();

        // Send each message and log message content and ID when successfully received
        try {
            MessageId msgId = producer.send(msg);

            //log.info("Published message '{}' with the ID {}", content, msgId);
        } catch (PulsarClientException e) {
            //log.error(e.getMessage());
        }
    });

    client.close();
  }
 }

消费教程>>>>

package pulsar_client_project.pulsar_client_project;

import java.io.IOException;

import org.apache.pulsar.client.api.Consumer;
import org.apache.pulsar.client.api.Message;
import org.apache.pulsar.client.api.PulsarClient;
import org.apache.pulsar.client.api.SubscriptionType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ConsumerTutorial {
//private static final Logger log = 
LoggerFactory.getLogger(ConsumerTutorial.class);
private static final String SERVICE_URL = "pulsar://localhost:6650";
private static final String TOPIC_NAME = "my-topic";
private static final String SUBSCRIPTION_NAME = "my-subscription";

public static void main(String[] args) throws IOException {
    // Create a Pulsar client instance. A single instance can be shared 
 across many
    // producers and consumer within the same application
    System.out.println("inside main");
    PulsarClient client = PulsarClient.builder()
            .serviceUrl(SERVICE_URL)
            .build();
    System.out.println("client.."+client);
    // Here you get the chance to configure consumer specific settings. eg:
    Consumer<byte[]> consumer = client.newConsumer()
            .topic(TOPIC_NAME)
            // Allow multiple consumers to attach to the same subscription
            // and get messages dispatched as a queue
            .subscriptionType(SubscriptionType.Shared)
            .subscriptionName(SUBSCRIPTION_NAME)
            .subscribe();

    System.out.println("consumer.."+consumer);
    // Once the consumer is created, it can be used for the entire application lifecycle
    //log.info("Created consumer for the topic {}", TOPIC_NAME);

    do {
        // Wait until a message is available
        Message<byte[]> msg = consumer.receive();

        // Extract the message as a printable string and then log
        String content = new String(msg.getData());
      //  log.info("Received message '{}' with ID {}", content, msg.getMessageId());

        // Acknowledge processing of the message so that it can be deleted
        consumer.acknowledge(msg);
    } while (true);
  }
}

Error_from_GCP_instance

Error_from_windows_eclipse

那么,什么是 ubuntu/GCP VM 机器的合适解决方案。我做错了什么,请给我方向

提前致谢

4

1 回答 1

2

ClassNotFoundException表示在您的类路径中找不到该类。

当您从 Eclipse 本地运行时,pulsar-client 类对您按下运行按钮时 Eclipse 调用的 java 进程可见。但是,当您在 GCP 机器上运行 jar 时,您的类路径中没有包含来自 pulsar-client jar 的类,这就是它们丢失的原因:

java -cp pulsar-client-project-0.0.1-SNAPSHOT.jar pulsar_client_project.pulsar_client_project.ConsumerTutorial

上面的命令指出 java 进程的类路径是标准的 JDK 类,jarpulsar-client-project-0.0.1-SNAPSHOT中的类和要运行的类(主类)是pulsar_client_project.pulsar_client_project.ConsumerTutorial.

您需要做的是在 GCP 机器上提供 pulsar-client jar 的副本并将其包含在您的类路径中。例如

    java -cp pulsar-client-project-0.0.1-SNAPSHOT.jar:pulsar-client.jar pulsar_client_project.pulsar_client_project.ConsumerTutorial

或者

    java -cp pulsar-client-project-0.0.1-SNAPSHOT.jar;pulsar-client.jar pulsar_client_project.pulsar_client_project.ConsumerTutorial

取决于 GCP 机器操作系统(:通常是类 Unix 操作系统上的路径分隔符,而;通常是 Windows 系统上的路径分隔符)。在本地运行时,Eclipse 会自动执行类似的操作。

可能更简单的方法是在生成的 jar 文件中包含所有项目依赖项。如果你像这样修改你的pom:

<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>pulsar-client-project</groupId>
<artifactId>pulsar-client-project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>pulsar-client-project</name>
<url>http://maven.apache.org</url>

<properties>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.pulsar</groupId>
        <artifactId>pulsar-client</artifactId>
        <version>2.0.1-incubating</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

这里定义了程序集插件,它将包含生成的 jar 文件中的所有依赖项target/pulsar-client-project-0.0.1-SNAPSHOT-jar-with-dependencies。您可以看到它的大小约为 25 MB,而原始target/pulsar-client-project-0.0.1-SNAPSHOT.jar大小约为 5KB。您还可以使用任何支持 zip 的存档程序(winzip、peazip、unzip...)打开 jar 并检查它们的内容,因为jar 文件格式是基于 zip 文件格式构建的

现在,当您将较大的 jar 文件复制到 GCP 机器时,您应该能够像这样运行它:

java -cp pulsar-client-project-0.0.1-SNAPSHOT-jar-with-dependencies.jar pulsar_client_project.pulsar_client_project.ConsumerTutorial

或者

    java -cp pulsar-client-project-0.0.1-SNAPSHOT-jar-with-dependencies.jar pulsar_client_project.pulsar_client_project.ProducerTutorial
于 2019-02-10T14:49:35.837 回答