代码之家  ›  专栏  ›  技术社区  ›  Vincent Robert

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

  •  4
  • Vincent Robert  · 技术社区  · 15 年前

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

    我想打开一个到远程JMS代理的连接(IP和端口是已知的),打开一个到特定队列(已知名称)的会话,并向这个队列发送消息。

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


    编辑

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

    鉴于我正在运行jboss,我仍然不知道如何创建 JBossConnectionFactory .


    编辑

    实际上,我给了这个问题一些想法(hmmm),如果需要将JMS与JDBC一样对待,那么我需要使用我的MQ实现提供的客户机。由于我们将sonicmq用于我们的代理,所以我决定嵌入sonicmq提供的sonic_client.jar库。

    这是在一个独立的Java应用程序和我们的JBOSS服务中工作的。

    谢谢你的帮助

    3 回复  |  直到 12 年前
        1
  •  4
  •   Nick Holt    15 年前

    您需要使用JMS,创建一个 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注册表的实例。对于远程队列,这是通过使用添加 排队 服务器启动时的实例。

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

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

        2
  •  0
  •   Vincent Robert    15 年前

    下面是我们使用 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();
            }
        }
    }
    
        3
  •  0
  •   Betlista    12 年前

    实际上,我使用的是JBoss4,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");
    

    以上所有代码都是用JBoss4.2.2 GA和JBossMQ测试的(如果我是正确的话,JBossMQ在4.2.3中被JBoss消息替换)。