簡體   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