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

问题描述

正在尝试创建一个独立的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的服务器

enter image description here

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

预先感谢

解决方法

您似乎正在使用类ActiveMQConnectionFactory。 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的“ Class for Java”运行时为IBM MQ建立连接工厂的一种方法。

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客户端运行时 经常没有充分的文档说明。根据我的经验,总是可以找到相关设置的。