[英]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.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 服務器沒有影響。 正如JavaDoc所指出的:
請注意,此方法只是創建一個封裝隊列名稱的 object。 它不會在 JMS 提供程序中創建物理隊列。 JMS 不提供創建物理隊列的方法,因為這將特定於給定的 JMS 提供者。 創建物理隊列是特定於提供商的,通常是由管理員執行的管理任務,盡管一些提供商可能會在需要時自動創建它們。
您收到InvalidDestinationException
的原因是您嘗試使用的隊列在 JMS 代理上不存在。 您需要以管理方式創建該目標或更改您傳遞給createQueue
的名稱以匹配已存在的隊列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.