使用JBoss将消息发布到远程JMS队列

问题描述:

这看起来很简单,但我找不到一个简单的答案。使用JBoss将消息发布到远程JMS队列

我想打开一个到远程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实例的MBeans来实现。

看看http://www.jboss.org/community/wiki/UsingWebSphereMQSeriesWithJBossASPart4,虽然它是IBM MQ的一个示例,但本质上,您必须做什么才能连接到任何远程队列。

如果你看看jbossmq-destinations-service.xmlorg.jboss.mq.server.jmx,你会看到你需要创建一个关于JBoss队列的MBean。

这里是我们使用使用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

其实我使用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消息代替)。