JMS 生产者的最低限度代码

Bare minimum code for a JMS producer

我真的很难为 JMS 生产者获得最低限度的工作代码,我已经启动了我的 WL JMS 服务器并 运行正在准备使用 JMS 客户端测试它,但要创建一个客户端我在使用初始上下文工厂时遇到问题,即 env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");。我已经尝试了几乎所有代码,使用 WL 初始上下文工厂、oracle j2ee 初始上下文工厂 (env.put(Context.INITIAL_CONTEXT_FACTORY, "oracle.j2ee.rmi.RMIInitialContextFactory");),但是当我 运行 我的代码时,我总是找不到 class 定义发现异常。例如,对于下面的代码,我没有找到 class 定义异常。

我正在尝试 运行 客户端作为一个独立的 Java 程序。我了解异常并尝试添加相关的 JAR,例如,当我使用 WL 初始上下文工厂时,我将 WL 完整的客户端 JAR 放在 class 路径中,但我仍然无法克服这个问题 class def 发现异常。

有人可以 link 访问一些存储库或博客,或者向我提供最低限度的 "working" JMS 生产者,或者指出我做错了什么。

请注意,我的 JMS 服务器是 WL,我正在尝试创建一个简单的 JMS 客户端,而不使用 ActiveMQ 库,但我也标记了 ActiveMQ 以便它可以得到更多关注,但如果有人认为它有错请告诉我,我会删除 ActiveMQ 标签,或者请自行删除。

我的客户示例:

import java.util.Hashtable;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class JmsProducerQueueClient {
    public static void main(String[] args) throws NamingException, JMSException {
        Connection connection = null;
        try {
            System.out.println("Create JNDI Context");
            Context context = getInitialContext();

            System.out.println("Get connection facory");
            ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("/com/jms/ms1/cf1");

            System.out.println("Create connection");
            connection = connectionFactory.createConnection();

            System.out.println("Create session");
            Session session = connection.createSession(false, QueueSession.AUTO_ACKNOWLEDGE);

            System.out.println("Lookup queue");
            Queue queue = (Queue) context.lookup("/com/jms/ms1/q1");

            System.out.println("Start connection");
            connection.start();

            System.out.println("Create producer");
            MessageProducer producer = session.createProducer(queue);

            System.out.println("Create hello world message");
            Message hellowWorldText = session.createTextMessage("Hello World!");

            System.out.println("Send hello world message");

            producer.send(hellowWorldText);
        } finally {
            if (connection != null) {
                System.out.println("close the connection");
                connection.close();
            }
        }

    }

    public static Context getInitialContext() throws NamingException {
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
        //env.put(Context.INITIAL_CONTEXT_FACTORY, "oracle.j2ee.rmi.RMIInitialContextFactory");
        env.put(Context.PROVIDER_URL, "tcp://localhost:6007");
        Context context = new InitialContext(env);
        return context;
    }
}

日志:

Create JNDI Context
Exception in thread "main" java.lang.NoClassDefFoundError: weblogic/security/service/PrivilegedActions
    at weblogic.jndi.WLSJNDIEnvironmentImpl.<clinit>(WLSJNDIEnvironmentImpl.java:57)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:190)
    at weblogic.jndi.internal.JNDIEnvironment.getJNDIEnvironment(JNDIEnvironment.java:37)
    at weblogic.jndi.Environment.<clinit>(Environment.java:92)
    at weblogic.jndi.WLInitialContextFactory.getInitialContext(WLInitialContextFactory.java:117)
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
    at javax.naming.InitialContext.init(InitialContext.java:242)
    at javax.naming.InitialContext.<init>(InitialContext.java:216)
    at com.learning.so.question.jms.queue.producerconsumer.JmsProducerQueueClient.getInitialContext(JmsProducerQueueClient.java:62)
    at com.learning.so.question.jms.queue.producerconsumer.JmsProducerQueueClient.main(JmsProducerQueueClient.java:22)

您的代码看起来不错,但您目前在 class 路径中缺少 class: java.lang.NoClassDefFoundError: weblogic/security/service/PrivilegedActions

检查这里,这可能有答案:Weblogic 12.1.3 PrivilegedActions class not found

我设法让你的代码在我这边工作,所以我认为你的问题来自缺少依赖项,很确定来自 weblgogic 客户端。可能是你打包应用的方式有问题。

所以我会公开我所做的,只是使用我自己的队列名称和工厂名称。

请注意,此测试已在 WLS 12.1.3 上完成。

Weblogic 客户端

首先,我在 ${ORACLE_HOME}/wlserver/server/lib 中使用 mvn install:install-file 命令从 wlthint3client.jar 创建了一个可以在 weblogic 服务器上找到的 Maven 依赖项:

mvn install:install-file -Dfile=wlthint3client.jar -DgroupId=weblogic -DartifactId=wlthint3client -Dversion=12.1.3.0.0 -Dpackaging=jar

这样,我现在可以在我的所有 Maven 项目中使用以下依赖项:

<dependency>
  <groupId>weblogic</groupId>
  <artifactId>wlthint3client</artifactId>
  <version>12.1.3.0.0</version>
</dependency>

Weblogic JMS 工厂和队列

然后我在 weblogic 端创建了一个 JMSXAFactory 工厂和一个 test JMS 队列。

JMS 生产者项目

然后我创建了maven项目。这是 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>org.jvi.weblogic.jms</groupId>
  <artifactId>jms-producer</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>jms-producer</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>

    <dependency>
      <groupId>weblogic</groupId>
      <artifactId>wlthint3client</artifactId>
      <version>12.1.3.0.0</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>unpack-dependencies</goal>
                        </goals>
                        <configuration>
                            <includeScope>runtime</includeScope>
                            <outputDirectory>${project.build.outputDirectory}</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

App class 代码:

package org.jvi.weblogic.jms;

import java.util.Hashtable;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 * Hello world!
 *
 */
public class App 
{
    public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";

    public final static String  URL = "t3://localhost:7001";

    public static void main( String[] args ) throws NamingException, JMSException
    {
        System.out.println( "Hello World!" );

        Connection connection = null;
        try {
            System.out.println("Create JNDI Context");
            Context context = getInitialContext();

            System.out.println("Get connection facory");
            ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("JMSXAFactory");

            System.out.println("Create connection");
            connection = connectionFactory.createConnection();

            System.out.println("Create session");
            Session session = connection.createSession(false, QueueSession.AUTO_ACKNOWLEDGE);

            System.out.println("Lookup queue");
            Queue queue = (Queue) context.lookup("test");

            System.out.println("Start connection");
            connection.start();

            System.out.println("Create producer");
            MessageProducer producer = session.createProducer(queue);

            System.out.println("Create hello world message");
            Message hellowWorldText = session.createTextMessage("Hello World!");

            System.out.println("Send hello world message");

            producer.send(hellowWorldText);
        } finally {
            if (connection != null) {
                System.out.println("close the connection");
                connection.close();
            }
        }
    }

    private static InitialContext getInitialContext() throws NamingException
            {
              Hashtable env = new Hashtable();
              env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
              env.put(Context.PROVIDER_URL, URL);
              return new InitialContext(env);
            }
}

然后当我通过命令行启动应用程序时:

java -cp jms-producer-0.0.1-SNAPSHOT.jar org.jvi.weblogic.jms.App

结果

启动此命令后,我可以看到消息已在 test 队列中正确生成: