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

Java 如何在不使用JNDI的情况下在ConnectionFactory中指定主机、端口和通道,java,jms,activemq,message-queue,jndi,Java,Jms,Activemq,Message Queue,Jndi,我试图创建一个独立的java应用程序,使用JMS向不同的应用程序发送消息。我的参考代码使用queueConnectionFactory,所有连接参数都在WAS服务器中配置,并使用JNDI检索。但我不能在我的独立应用程序中使用服务器。在这种情况下,如何在不使用JNDI的情况下获取或连接到相同的主机、端口和队列 下面是我迄今为止尝试过的代码 try { //Set connection factory ActiveMQConnectionFacotry connect

我试图创建一个独立的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


提前感谢

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

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

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

我不知道为什么,但是在没有JNDI的情况下使用JMS客户机运行时通常没有很好的文档记录。根据我的经验,找到相关设置总是可能的,但有时需要进行一些挖掘。

谢谢Kevin。是的,在大多数示例中,我只看到提到的端口和主机。那么,服务器连接通道在这里有什么用途。@该值可能与WAS有关,并且在ActiveMQ ConnectionFactory配置中没有必然结果。确实如此。IBM“MQ classes for Java”运行时有一个连接工厂,其中包含方法
setQueueManager()
setChannel()
、和
setTransportType()
,我相信这些方法对于该客户机是必需的。我不清楚为什么OP有一个似乎适用于IBM MQ的屏幕截图和一个似乎适用于ActiveMQ的代码。我的参考应用程序代码使用IBM MQ发送消息。我想使用相同的主机、ort和队列。所以我复制了屏幕快照对不起,我不知道你说的“没有IBM”是什么意思。IBM MQ在很大程度上是一种IBM产品;)你的意思是“没有IBM是”吗?或者“使用IBM MQ以外的消息代理”?ApacheActiveMQ在这里的位置如何?如果您需要,我想我有一些独立IBM MQ Java客户机的示例代码?
QueueConnectionFactory qcf = new 
  org.apache.qpid.jms.JmsConnectionFactory 
  ("amqp://" + host + ":" + port);
QueueConnection qc = qcf.createQueueConnection ("user", "password");