[英]How to connect to JMS domain in java code?
我可以运行下面的 java 代码向 SonicMQ JMS 队列发送消息。 它是从这里复制的: Post a message to a remote JMS queue using JBoss
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
public class JmsClient
{
public static void main(String[] args) throws JMSException
{
ConnectionFactory factory = new progress.message.jclient.ConnectionFactory("tcp://<host>:<port>", "<user>", "<password>");
Connection connection = factory.createConnection();
try
{
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
try
{
MessageProducer producer = session.createProducer(session.createQueue("<queue>"));
try
{
producer.send(session.createTextMessage("<message body>"));
}
finally
{
producer.close();
}
}
finally
{
session.close();
}
}
finally
{
connection.close();
}
}
}
但是,我收到错误 javax.jms.InvalidDestinationException: Queue not found
我认为这是因为我需要指定队列域名。 在此代码中将域名放在哪里?
如此处所述https://jnbridge.com/guides/UsingDotNetAdapterSonicMQ.pdf ,应设置以下 JNDI 参数 sonicsw.jndi.mfcontext.domain=[Domain_Name]
如何在上面的代码中设置 JNDI 参数?
谢谢
通常,您会使用 JNDI 来查找javax.jms.ConnectionFactory
和javax.jms.Destination
(即javax.jms.Queue
或javax.jms.Topic
)。 这将涉及使用一组属性为您正在使用的任何特定实现实例化javax.naming.InitialContext
,然后使用该javax.naming.InitialContext
执行查找。
但是,您实际上根本没有使用 JNDI 。 您正在直接实例化 JMS ConnectionFactory
(即使用new progress.message.jclient.ConnectionFactory(...)
),然后调用javax.jms.Session.createQueue(...)
来实例化本地javax.jms.Queue
。
请记住,使用javax.jms.Session.createQueue(...)
实例化本地javax.jms.Queue
对 JMS 服务器没有影响。 正如JavaDoc所指出的:
请注意,此方法只是创建一个封装队列名称的 object。 它不会在 JMS 提供程序中创建物理队列。 JMS 不提供创建物理队列的方法,因为这将特定于给定的 JMS 提供者。 创建物理队列是特定于提供商的,通常是由管理员执行的管理任务,尽管一些提供商可能会在需要时自动创建它们。
您收到InvalidDestinationException
的原因是您尝试使用的队列在 JMS 代理上不存在。 您需要以管理方式创建该目标或更改您传递给createQueue
的名称以匹配已存在的队列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.