Отправьте сообщение в удаленную очередь JMS с помощью JBoss - PullRequest
4 голосов
/ 24 июня 2009

Это выглядит просто, но я не могу найти простой ответ.

Я хочу открыть соединение с удаленным JMS-брокером (IP-адрес и порт известны), открыть сеанс в определенной очереди (имя известно) и отправить сообщение в эту очередь.

Есть ли простой Java API (если возможно, стандартный) для этого?


EDIT

Хорошо, теперь я понимаю, что JMS - это спецификация драйвера, аналогичная JDBC, а не протокол связи, как я думал.

Учитывая, что я работаю в JBoss, я все еще не понимаю, как создать JBossConnectionFactory .


EDIT

На самом деле я немного подумал над проблемой (хммм), и если JMS нужно рассматривать так же, как JDBC, то мне нужно использовать клиент, предоставленный моей реализацией MQ. Поскольку мы используем SonicMQ для нашего брокера, я решил встроить библиотеку sonic_Client.jar, поставляемую с SonicMQ.

Это работает в автономном приложении Java и в нашем сервисе JBoss.

Спасибо за помощь

Ответы [ 3 ]

4 голосов
/ 24 июня 2009

Вам нужно будет использовать 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. Для удаленных очередей это достигается с помощью MBean, которые добавляют экземпляр Queue при запуске сервера.

Взгляните на http://www.jboss.org/community/wiki/UsingWebSphereMQSeriesWithJBossASPart4,, который, хотя это пример с IBM MQ, по сути, то, что вам нужно сделать, чтобы подключиться к любой удаленной очереди.

Если вы посмотрите на jbossmq-destinations-service.xml и org.jboss.mq.server.jmx, вы увидите MBean, который вам нужно создать относительно очереди JBoss.

0 голосов
/ 08 января 2013

На самом деле я использую 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).

0 голосов
/ 24 июня 2009

Вот код, который мы использовали для подключения к брокеру SonicMQ с использованием библиотеки 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();
        }
    }
}
...