繁体   English   中英

如何在 java 代码中连接到 JMS 域?

[英]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.ConnectionFactoryjavax.jms.Destination (即javax.jms.Queuejavax.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM