подключение к удаленному провайдеру JMS из компонента Message Driven Bean (MDB) - PullRequest
2 голосов
/ 20 декабря 2010

Из EJB или POJO, развернутого на Glassfish, я могу подключиться к HornetMQ с помощью следующего кода, после добавления в classpath необходимых jar-файлов, специфичных для шершней:

Properties properties = new Properties();
  properties.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
  // server name
  properties.put("java.naming.provider.url", "jnp://hostname:1099");
  properties.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");

  InitialContext initialContext = new InitialContext(properties);
  // queue name
  Queue queue = (Queue)initialContext.lookup("/queue/exampleQueue");
  // connection factory
  ConnectionFactory connectionFactory = (ConnectionFactory) initialContext.lookup("ConnectionFactory");
  Connection conn = connectionFactory.createConnection();

  Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);

  conn.start();
    // ...

Но я хочу сделать то же самое из Бина, управляемого сообщениями.

С MDB очень легко, если я использую встроенный провайдер Glassfish; но как мне настроить GF для использования удаленного провайдера?

Есть идеи? Спасибо!

РЕДАКТИРОВАТЬ: сделать вещи немного яснее; типичный MDB выглядит примерно так:

@MessageDriven(mappedName = "/queue/exampleQueue", activationConfig =  {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
    })
public class MessageProcessor implements MessageListener {

    public MessageProcessor() {
    }


    public void onMessage(Message message) {

    }
}

Но в этом случае MDB будет искать «/ queue / exampleQueue» на локальном сервере, а не на удаленном.

В основном мой вопрос заключается в том, как настроить GF для поиска удаленного сервера (как в первом фрагменте) при использовании MDB?

Ответы [ 2 ]

3 голосов
/ 21 декабря 2010

После еще нескольких копаний я нашел решение на этих форумах

Чтобы позволить MDB "общаться" с удаленным поставщиком HornetQ, выполните следующие действия:

  • Разверните hornetq-ra.rar на glassfish с помощью консоли администратора (вы найдете ее в папке "libs" в папке hornetq)
  • найдите <gf_install_dir>/domains/<your_dmain>/applications/hornetq-ra/META-INF/ra.xml и закомментируйте следующий раздел:

 <config-property>
     <description>The transport configuration. These values must be in the form of key=val;key=val;</description>
     <config-property-name>ConnectionParameters</config-property-name>
     <config-property-type>java.lang.String</config-property-type>
     <config-property-value>server-id=0</config-property-value>
  </config-property>

Очевидно, что выход server-id вызовет исключение во время развертывания.

  • Скопируйте следующие файлы jar в папку lib домена GF: hornetq-core-client.jar, hornetq-jms-client.jar, hornetq-logging.jar и netty.jar
  • Создать XML-дескриптор для MDB, который вы хотите использовать с HornetQ (sun-ejb-jar.xml):

  <ejb-name>MessageProcessor</ejb-name> <!-- MDB class name -->
  <jndi-name>ExampleMDB</jndi-name>
  <mdb-resource-adapter>
    <!-- The resource adapter mid element ties the generic ra for JMS
        with this particular MDB -->
    <resource-adapter-mid>hornetq-ra</resource-adapter-mid>
    <activation-config>
      <activation-config-property>
        <activation-config-property-name>destinationType</activation-config-property-name>
        <activation-config-property-value>javax.jms.Queue</activation-config-property-value>
      </activation-config-property>
      <activation-config-property>
        <activation-config-property-name>destination</activation-config-property-name>
        <activation-config-property-value>/queue/exampleQueue</activation-config-property-value>
      </activation-config-property>
      <activation-config-property>
        <activation-config-property-name>ConnectorClassName</activation-config-property-name>
        <activation-config-property-value>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</activation-config-property-value>
      </activation-config-property>
      <activation-config-property>
        <activation-config-property-name>ConnectionParameters</activation-config-property-name>
        <activation-config-property-value>host=hostname;port=5445</activation-config-property-value>
      </activation-config-property>
<!--
      <activation-config-property>
        <activation-config-property-name>UserName</activation-config-property-name>
        <activation-config-property-value>user</activation-config-property-value>
      </activation-config-property>
      <activation-config-property>
        <activation-config-property-name>Password</activation-config-property-name>
        <activation-config-property-value>pass</activation-config-property-value>
      </activation-config-property>
-->
    </activation-config>
  </mdb-resource-adapter>
</ejb>
  • Если ваш MDB выглядит примерно так, вы должны получать сообщения:

@MessageDriven(mappedName = "ExampleMDB")
public class MessageProcessor implements MessageListener {

  public MessageProcessor() {
  }

  public void onMessage(Message message) {

    System.out.println("message received");

  }
}
1 голос
/ 20 декабря 2010

Вы пытаетесь настроить удаленного JMS-провайдера. Здесь есть хорошая статья

http://www.packtpub.com/article/configuring-jms-resources-in-glassfish-1

Однако я не уверен, что он будет работать с HornetMQ, возможно, вам придется использовать удаленный экземпляр OpenMQ

...