2009-06-24 176 views
4

這看起來很簡單,但我找不到一個簡單的答案。使用JBoss將消息發佈到遠程JMS隊列

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

是否有任何簡單的Java API(如果可能,標準)來做到這一點?


編輯

好吧,我明白現在JMS是一個司機規範一樣,JDBC,而不是一個通信協議,因爲我以爲。

鑑於我在JBoss中運行,我仍然不知道如何創建JBossConnectionFactory


編輯

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

這是在一個獨立的Java應用程序和我們的JBoss服務。

感謝您的幫助

回答

4

你需要使用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實例的MBeans來實現。

看看http://www.jboss.org/community/wiki/UsingWebSphereMQSeriesWithJBossASPart4,雖然它是IBM MQ的一個示例,但本質上,您必須做什麼才能連接到任何遠程隊列。

如果你看看jbossmq-destinations-service.xmlorg.jboss.mq.server.jmx,你會看到你需要創建一個關於JBoss隊列的MBean。

0

這裏是我們使用使用sonic_Client.jar庫連接到SonicMQ的經紀人代碼:

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

嗨文森特 - 我還是建議在JNDI中彈出QueueConnectionFactory,Queue等,如果你是服務器端的話,那麼你可以刪除SonicMQ JMS驅動程序的編譯時間依賴關係。 – 2009-06-24 14:33:53

0

其實我使用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霍爾特的答案,除了連接工廠創建,你必須使用:

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

而且你不需要創建隊列是否有部署一些

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

上面的所有代碼都使用JBoss 4.2.2 GA和JBossMQ進行了測試(JBossMQ是,如果我沒錯的話,在4.2.3中用JBoss消息代替)。