【问题标题】:How to create a jms Topic and TopicConnectionFactory programmatically?如何以编程方式创建 jms 主题和主题连接工厂?
【发布时间】:2012-01-14 19:10:24
【问题描述】:

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

【问题讨论】:

    标签: glassfish jms openmq


    【解决方案1】:

    如果您只想避免在管理员中手动创建资源,您可以使用文件“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>
    

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

    您还需要一个连接器资源来引用 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 知道如何创建这些资源并执行此任务。如果您在没有 NetBeans 的情况下将 EAR 直接部署到 Glassfish(这似乎很可能用于生产环境),您必须在以下位置提供 glassfish-resources.xml:

    • EJB 模块的 META-INF 或模块范围资源的 WAR 的 WEB-INF
    • 企业应用程序的 META-INF 用于应用程序范围的资源 在 NetBeans 中,您可以通过将文件放入项目视图的“配置文件”文件夹(文件系统中的 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 或 爪哇:模块。如果这些前缀之一未在 JNDI 名称中指定,则添加它。"

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

    【讨论】:

    • 谢谢!您是否会偶然知道我从哪里获得将连接工厂资源添加到 glassfish-resources.xml 文件的语法?我也没有在我的安装目录中找到 glassfish-resources.xml 文件。在我弄清楚如何生成它之后,我会将这个文件放在哪里?是否有一个我可以修改并可能从中学习的预先存在的?
    猜你喜欢
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2020-12-27
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2021-10-04
    相关资源
    最近更新 更多