Java连接JMS域:SonicMQ队列找不到及JNDI参数配置问题
向SonicMQ JMS队列发送消息报错:Queue not found的解决方法
我用以下Java代码向SonicMQ JMS队列发送消息:
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]
如何在上述代码中配置该参数?
解决方案
1. 为队列指定域名
SonicMQ中,队列的完整标识格式为 [域名]/[队列名],你需要在创建队列时直接将域名拼接在队列名前:
// 替换成实际的域名和队列名 MessageProducer producer = session.createProducer(session.createQueue("你的域名/你的队列名"));
2. 配置JNDI参数sonicsw.jndi.mfcontext.domain
如果要通过代码配置该JNDI参数,有两种可行方式:
方式一:通过系统属性设置
在创建ConnectionFactory实例之前,添加系统属性配置:
// 在创建ConnectionFactory前设置域名参数 System.setProperty("sonicsw.jndi.mfcontext.domain", "你的域名"); ConnectionFactory factory = new progress.message.jclient.ConnectionFactory("tcp://<host>:<port>", "<user>", "<password>");
方式二:通过ConnectionFactory的属性参数设置
借助progress.message.jclient.ConnectionFactory的重载构造方法,传入包含参数的Properties对象:
import java.util.Properties; // ... Properties props = new Properties(); props.setProperty("sonicsw.jndi.mfcontext.domain", "你的域名"); ConnectionFactory factory = new progress.message.jclient.ConnectionFactory("tcp://<host>:<port>", "<user>", "<password>", props);
设置完该JNDI参数后,后续创建队列时只需填写队列名,SonicMQ会自动使用配置的域名匹配目标队列,无需再手动拼接域名。
内容的提问来源于stack exchange,提问作者Grzegorz Wilanowski
相关产品推荐
相关产品推荐

