如何在不使用 JNDI 的情况下在 ConnectionFactory 中指定主机、端口和通道

How to specify host, port and channel in ConnectionFactory without using JNDI

我正在尝试创建一个独立的 java 应用程序以使用 JMS 将消息发送到不同的应用程序。我的参考代码使用 queueConnectionFactory,所有连接参数都在 WAS 服务器中配置并使用 JNDI 检索。但是我不能在我的独立应用程序中使用服务器。在这种情况下,如何在不使用 JNDI 的情况下获取或连接到相同的主机、端口和队列。

下面是我目前试过的代码

try {
        //Set connection factory
        ActiveMQConnectionFacotry connectionFactory = new ActiveMQConnectionFactory("");
        
        //create connection with connection factory
        Connection connection = connectionFactory.createConnection();
        connection.start();
        
        //create session from connection
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        
        //create queue from session
        Destination destination = session.createQueue("sample.Queuename");
        
        //create messageProducer
        MessageProducer producer = session.createProducer(destination);

我的参考码

//@Resource
private static Queue queue;
private QueueConnection con;
private QueueSession session;
private QueueSender sender;
private static InitialContext ctx;

private static JAXBContext jaxb;
private static IBwLogContext logContext = BwLogContextFactory.create();

static{
    try {
        ctx = new InitialContext();
        queue = (Queue) ctx.lookup("jms/sampleJNDI1");
        qcf = (QueueConnectionFactory) ctx.lookup("jms/sampleJNDI2");

JMS 配置是 jms/sampleJNDI2

的服务器

现在如何在没有服务器的情况下连接到相同的 xxx、yyy、zzz。我们可以将这些详细信息放在属性文件中并使用它们吗?如果是这样,该怎么做,或者有没有其他方法。我有从服务器复制的硬编码队列名称。但坚持使用 ConnectionFactory。

提前致谢

您似乎在使用 class ActiveMQConnectionFactory。此 class 名称由 ActiveMQ 5.x 和 ActiveMQ Artemis 使用,但包名称不同。不过,无论好坏,两者的基本配置都是相同的:

ActiveMQConnectionFactory qcf = new ActiveMQConnectionFactory
      ("tcp://" + host + ":" + port);
QueueConnection qc = qcf.createQueueConnection ("user", "password");

您可以在连接工厂上设置其他属性,但主机、端口、用户和密码可能是最常用的。

ActiveMQ 5.x 和 ActiveMQ Artemis 均支持其专有协议(分别为 OpenWire 和 Artemis Core)以外的其他协议。例如,您可以使用 Qpid JMS 运行时库来使用 AMQP 协议进行连接。这与您可能使用的所有其他客户端运行时库一样,具有不同的配置方式。

这是为 IBM MQ 设置连接工厂的一种方法,使用 IBM 的“Class for Java”运行时。

import com.ibm.msg.client.wmq.*;
import com.ibm.mq.jms.*;
MQQueueConnectionFactory qcf = new MQQueueConnectionFactory();
qcf.setHostName ("my_mq.acme.com");
qcf.setPort (1414);
qcf.setQueueManager ("QMA");
qcf.setChannel ("SYSTEM.DEF.SVRCONN");
qcf.setTransportType (WMQConstants.WMQ_CM_CLIENT);
QueueConnection qc = qcf.createQueueConnection ("user", "password");

下面是 Qpid-JMS 的示例,它为许多消息代理提供 AMQP 有线协议支持:

QueueConnectionFactory qcf = new 
  org.apache.qpid.jms.JmsConnectionFactory 
  ("amqp://" + host + ":" + port);
QueueConnection qc = qcf.createQueueConnection ("user", "password");

我不确定为什么,但是使用 JMS 客户端运行时 没有 JNDI 通常不是 well-documented。根据我的经验,这总是可行的,但有时需要进行一些挖掘才能找到相关设置。