有人知道您是否可以以编程方式创建主题及其连接工厂吗?当前,我使用glassfish管理实用程序来创建主题及其连接工厂。如果我无法在代码中创建它,那么glassfish/openmq是否具有默认主题以及可以使用的conn工厂?

最佳答案

如果只想避免在管理员中手动创建资源,则只需使用文件“glassfish-resources.xml”(GF 3.1,请参阅http://docs.oracle.com/cd/E18930_01/html/821-2417/giyhh.html)部署它们即可。

您需要一个这样的管理对象资源(用于主题):

<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>

请注意,如果实现多个不应混淆消息的主题,则必须对主题使用不同的“名称”值(此处为“physicalTopic”)。

此外,您需要一个连接器资源,该连接器资源引用类型为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,则该文件位于项目 View 中的“服务器资源”文件夹中。注意:如果使用NetBeans进行部署,则“服务器资源”中的glassfish-resources.xml仅由NetBeans使用! NetBeans知道如何创建这些资源并执行此任务。如果您在没有NetBeans的情况下将EAR直接部署到Glassfish 上(这似乎很可能用于生产环境),则必须在以下位置提供glassfish-resources.xml:

EJBt模块的
  • 或WAR的WEB-INF的模块范围资源
  • 企业应用程序的
  • META-INF,用于应用程序范围的资源
    在NetBeans中,您可以通过将文件放入项目 View 的“配置文件”文件夹(在文件系统中为src/conf/)来实现此目的。

  • 您可以使用NetBeans的[New Message-Driven Bean]向导轻松创建此资源定义(只需选择[New ...],即可添加MBean)。在向导中,选择“项目目标”> [添加]。完整的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
    {
    [...]
    

    警告:仅当您使用应用程序范围内的资源时,mappedName中的“java:app/”才是正确的。您可以在glassfish-resources.xml中的定义中保留“java:app/”。 GF部署指南说:“应用程序范围的资源JNDI名称以java:app或
    java:模块。如果在JNDI名称中未指定这些前缀之一,则将其添加。”

    您还可以通过使用“名称”而不是“mappedName”来引入另一种间接级别。然后,您必须提供一个名为“application-client.xml”的文件,其中(逻辑)名称将映射到JNDI的“物理”位置。

    09-11 20:24