You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:24:20