我能够运行下面的Java代码来向SonicMQ队列发送消息。它是从这里复制的。
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我认为这是因为我需要指定队列“域名”。将“域名”放在代码中的位置?
如前所述,这里应该设置以下JNDI参数:
sonicsw.jndi.mfcontext.domain=[Domain_Name]如何在上面的代码中设置JNDI参数?
发布于 2022-07-24 22:12:56
通常,您将使用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没有影响。正如the JavaDoc所指出的:
请注意,此方法只是创建一个封装队列名称的对象。它不会在JMS提供程序中创建物理队列。JMS不提供创建物理队列的方法,因为这将特定于给定的JMS提供程序。创建物理队列是特定于提供者的,通常是管理员执行的管理任务,尽管一些提供程序可能会在需要时自动创建它们。
获得InvalidDestinationException的原因是您试图使用的队列在JMS上不存在。您需要从管理上创建目标,或者更改传递给createQueue的名称,以匹配已经存在的队列。
https://stackoverflow.com/questions/73097343
复制相似问题