Как программно создать jms Topic и TopicConnectionFactory?

Кто-нибудь знает, можно ли программно создать тему и ее фабрику соединений? В настоящее время я использую утилиту администрирования Glassfish для создания моей темы и ее фабрики соединений. Если я не могу создать его в коде, есть ли у glassfish/openmq тема по умолчанию и conn factory, которые я могу использовать?


person simgineer    schedule 07.12.2011    source источник


Ответы (1)


Если вы хотите не создавать ресурсы вручную в админке, вы можете просто развернуть их с помощью файла «glassfish-resources.xml» (GF 3.1, см. http://docs.oracle.com/cd/E18930_01/html/821-2417/giyhh.html).

Вам нужен admin-object-resource, подобный этому (для темы):

<admin-object-resource enabled="true" jndi-name="jms/myTopic"
   object-type="user" res-adapter="jmsra" res-type="javax.jms.Topic">
  <property name="Name" value="physicalTopic"/>
</admin-object-resource>

Имейте в виду, что вы должны использовать разные значения «Имя» для темы (здесь: «физическая тема»), если вы реализуете несколько тем, сообщения которых не должны смешиваться.

Кроме того, вам нужен ресурс коннектора, ссылающийся на пул коннекторов типа javax.jms.TopicConnectionFactory.

Если вы не стремитесь к динамическому созданию ресурсов, лучше всего использовать дескриптор развертывания Glassfish-resources.xml.

Обратите внимание, что ресурсы, развернутые таким образом, относятся к области приложения: http://docs.oracle.com/cd/E18930_01/html/821-2417/giydj.html

"glassfish-resources.xml" - это файл для GF 3.x, для GF 2.x это был "sun-resources.xml". Файл находится в папке «Ресурсы сервера» в представлении проекта, если вы используете NetBeans. Внимание: файл glassfish-resources.xml в разделе «Ресурсы сервера» используется NetBeans только в том случае, если вы используете NetBeans для развертывания! NetBeans умеет создавать эти ресурсы и выполняет эту задачу. Если вы развертываете EAR непосредственно в Glassfish без NetBeans, что весьма вероятно для производственной среды, вам необходимо предоставить файл glassfish-resources.xml в:

  • META-INF вашего EJB-модуля или WEB-INF вашего WAR для ресурсов, относящихся к модулю.
  • META-INF вашего корпоративного приложения для общих ресурсов приложения. В NetBeans вы делаете это, помещая файл в папку «Файлы конфигурации» вашего представления проекта (это src/conf/ в файловой системе).

Вы можете легко создать это определение ресурса с помощью мастера NetBeans [New Message-Driven Bean] (просто добавьте MBean, выбрав [New...]). В мастере выберите «Назначения проекта» > [Добавить]. Полный пример 3.1 выглядит так:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
    <admin-object-resource enabled="true" jndi-name="jms/myDestination"  res-type="javax.jms.Topic"  res-adapter="jmsra">
        <property name="Name" value="PhysicalTopic"/>
    </admin-object-resource>
    <connector-connection-pool name="jms/myDestinationFactoryPool"  connection-definition-name="javax.jms.TopicConnectionFactory"  resource-adapter-name="jmsra"/>
    <connector-resource enabled="true" jndi-name="jms/myDestinationFactory" pool-name="jms/myDestinationFactoryPool"  />
</resources>

Это аннотация MBean:

@MessageDriven(mappedName = "java:app/jms/myDestination", activationConfig =
{
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
    @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable"),
    @ActivationConfigProperty(propertyName = "clientId", propertyValue = "NewMessageBean"),
    @ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "NewMessageBean")
})
public class NewMessageBean implements MessageListener
{ 
[...]

Внимание: "java:app/" в mappedName правильно, только если вы используете ресурсы области приложения. Вы можете оставить "java:app/" в определении в файле glassfish-resources.xml. В руководстве по развертыванию GF говорится: «Имена JNDI ресурсов в области приложения начинаются с java:app или java:module. Если один из этих префиксов не указан в имени JNDI, он добавляется».

Вы также можете ввести еще один уровень косвенности, используя «имя» вместо «отображаемое имя». Затем вы должны предоставить файл с именем «application-client.xml», где (логическое) имя сопоставляется с «физическим» местоположением JNDI.

person mdo    schedule 08.12.2011
comment
Спасибо! Вы случайно не знаете, где я беру синтаксис для добавления ресурса фабрики соединений в файл glassfish-resources.xml? Также я не нашел файл Glassfish-resources.xml в своем установочном каталоге. Куда мне вставить этот файл после того, как я выясню, как его сгенерировать? Есть ли уже существующий, который я могу изменить и, возможно, поучиться? - person simgineer; 14.12.2011