如何在不使用 JNDI 的情况下在 ConnectionFactory 中指定主机、端口和通道
Posted
技术标签:
【中文标题】如何在不使用 JNDI 的情况下在 ConnectionFactory 中指定主机、端口和通道【英文标题】:How to specify host, port and channel in ConnectionFactory without using JNDI 【发布时间】:2021-01-28 19:46:54 【问题描述】:我正在尝试创建一个独立的 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。
提前致谢
【问题讨论】:
这里的 WAS 和 ActiveMQ 有什么关系? 【参考方案1】:您似乎正在使用 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 设置连接工厂的一种方法。
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 通常没有很好的文档记录。根据我的经验,总有可能,但有时需要进行一些挖掘才能找到相关设置。
【讨论】:
谢谢凯文。是的,在大多数示例中,我只看到提到的端口和主机。那么这里的服务器连接通道有什么用呢。 @Learner 该值可能与 WAS 相关,并且在 ActiveMQ ConnectionFactory 配置中没有推论。 确实如此。 IBM“Java 的 MQ 类”运行时有一个连接工厂,其中包含方法setQueueManager()
、setChannel()
和 setTransportType()
,我相信这些方法对于该客户端是必需的。我不清楚为什么 OP 有一个似乎适用于 IBM MQ 的屏幕截图,以及似乎适用于 ActiveMQ 的代码。
我正在尝试使用 MQ 发送消息而不使用 IBM。我的参考应用程序代码使用 IBM MQ 发送消息。我想使用相同的主机、ort 和队列。所以我复制了截图
抱歉,我不知道您所说的“没有 IBM”是什么意思。 IBM MQ 在很大程度上是一种 IBM 产品;)您的意思是“没有 IBM WAS”吗?还是“使用 IBM MQ 以外的消息代理”? Apache ActiveMQ 在哪里适合这个?如果您需要,我想我有一些独立 IBM MQ Java 客户端的示例代码。以上是关于如何在不使用 JNDI 的情况下在 ConnectionFactory 中指定主机、端口和通道的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 AudioQueueRef 的情况下在 AudioQueue 中设置音量?
如何在不使用   的情况下在行内元素之间添加空格 [重复]
如何在不使用 Segue 的情况下在单独的 UIViewController 中选择实例变量