簡體   English   中英

使用JBoss將消息發布到遠程JMS隊列

[英]Post a message to a remote JMS queue using JBoss

這看起來很簡單,但我找不到簡單的答案。

我想打開與遠程JMS代理的連接(已知IP和端口),打開與特定隊列(名稱已知)的會話並將消息發布到此隊列。

是否有任何簡單的Java API(如果可能,標准)?


編輯

好的,我現在明白JMS是一個像JDBC一樣的驅動程序規范而不是我想的通信協議。

鑒於我在JBoss中運行,我仍然不明白如何創建JBossConnectionFactory


編輯

我實際上給了問題一些想法(嗯),如果JMS需要被視為與JDBC相同,那么我需要使用我的MQ實現提供的客戶端。 由於我們正在為我們的經紀人使用SonicMQ,因此我決定嵌入SonicMQ提供的sonic_Client.jar庫。

這適用於獨立的Java應用程序和JBoss服務。

謝謝您的幫助

你需要使用JMS,創建一個QueueConnectionFactory並從那里開始。 具體如何創建QueueConnectionFactory將是供應商特定的(JMS基本上是消息隊列的驅動程序規范,就像JDBC用於數據庫一樣)但在IBM MQ上它是這樣的:

MQQueueConnectionFactory connectionFactory = new MQQueueConnectionFactory();
connectionFactory.setHostName(<hostname>);
connectionFactory.setPort(<port>);
connectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
connectionFactory.setQueueManager(<queue manager>);
connectionFactory.setChannel("SYSTEM.DEF.SVRCONN");

QueueConnection queueConnection = connectionFactory.createQueueConnection();
QueueSession queueSession = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

Queue queue = queueSession.createQueue(<queue name>);

QueueSender queueSender = session.createSender(queue);
QueueReceiver queueReceiver = session.createReceiver(queue); 

編輯(以下問題編輯)

訪問遠程隊列或任何隊列的最佳方法是將Queue實例添加到JNDI注冊表。 對於遠程隊列,這是使用在服務器啟動時添加Queue實例的MBean來實現的。

查看http://www.jboss.org/community/wiki/UsingWebSphereMQSeriesWithJBossASPart4 ,雖然它是IBM MQ的一個示例,但實質上是連接到任何遠程隊列所需要做的。

如果查看jbossmq-destinations-service.xmlorg.jboss.mq.server.jmx您將看到需要創建的與JBoss隊列相關的MBean。

以下是我們使用sonic_Client.jar庫連接到SonicMQ代理的sonic_Client.jar

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();
        }
    }
}

實際上我正在使用JBoss 4並且JNDI並不難使用。

首先,您必須知道JNDI的運行位置。

在我的JBoss(conf \\ jboss-service.xml)中,我有:

<mbean code="org.jboss.naming.NamingService" name="jboss:service=Naming" xmbean-dd="resource:xmdesc/NamingService-xmbean.xml">
    ...
    <attribute name="Port">7099</attribute>
    ...
</mbean>

這很重要,這是您要連接的端口。

現在,您可以使用以下代碼輕松連接到JNDI:

Hashtable<String, String> contextProperties = new Hashtable<String, String>();
contextProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
contextProperties.put(Context.PROVIDER_URL, "jnp://localhost:7099");

InitialContext initContext = new InitialContext(contextProperties);

現在當你有上下文時,它與@Nick Holt的答案非常相似,除了創建連接工廠之外,你必須使用:

QueueConnectionFactory connFactory = (QueueConnectionFactory) initContext.lookup("ConnectionFactory");

如果部署了某些隊列,您也不需要創建隊列

Queue queue = (Queue) initContext.lookup("queueName");

上面的所有代碼都是用JBoss 4.2.2 GA和JBossMQ測試的(JBossMQ是,如果我是正確的,在4.2.3中用JBoss消息替換)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM