4

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

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

是否有任何简单的Java API(如果可能的话是标准的)来做到这一点?


编辑

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

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


编辑

我实际上对这个问题提出了一些想法(嗯),如果 JMS 需要与 JDBC 一样对待,那么我需要使用我的 MQ 实现提供的客户端。由于我们使用 SonicMQ 作为代理,我决定嵌入 SonicMQ 提供的 sonic_Client.jar 库。

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

谢谢您的帮助

4

3 回答 3

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在服务器启动时添加实例的 MBean 来实现的。

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

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

于 2009-06-24T10:50:18.040 回答
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 消息取代)。

于 2013-01-08T15:38:34.110 回答
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();
        }
    }
}
于 2009-06-24T13:55:10.567 回答