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

时间:2009-06-24 10:22:08

标签: java post connection jms message

这看起来很简单,但我找不到简单的答案。

我想打开与远程JMS代理的连接(已知IP和端口),打开与特定队列(已知名称)的会话,并将消息发布到此队列。

是否有任何简单的Java API(如果可能,标准)?


修改

好的,我现在明白JMS是一个驱动程序规范,就像JDBC一样,而不是我想的通信协议。

鉴于我在JBoss中运行,我仍然不明白如何创建JBossConnectionFactory


修改

我实际上给了问题一些想法(嗯),如果JMS需要和JDBC一样对待,那么我需要使用我的MQ实现提供的客户端。由于我们正在为我们的经纪人使用SonicMQ,因此我决定嵌入SonicMQ提供的sonic_Client.jar库。

这适用于独立的Java应用程序和JBoss服务。

感谢您的帮助

3 个答案:

答案 0 :(得分: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); 

编辑(问题编辑后)

访问远程队列或任何队列的最佳方法是向JNDI注册表添加Queue实例。对于远程队列,这可以使用在服务器启动时添加Queue实例的MBean来实现。

看一下http://www.jboss.org/community/wiki/UsingWebSphereMQSeriesWithJBossASPart4,虽然它是IBM MQ的一个例子,但基本上你需要做的就是连接到任何远程队列。

如果查看jbossmq-destinations-service.xmlorg.jboss.mq.server.jmx,您将看到需要创建的与JBoss队列相关的MBean。

答案 1 :(得分: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();
        }
    }
}

答案 2 :(得分: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 Holt的答案非常相似,除了连接工厂的创建,你必须使用:

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

如果部署了一些

,您也不需要创建队列
Queue queue = (Queue) initContext.lookup("queueName");

上面的所有代码都是用JBoss 4.2.2 GA和JBossMQ测试的(JBossMQ,如果我是正确的,在4.2.3中用JBoss消息替换)。