如何以编程方式创建jms主题和TopicConnectionFactory?

sim*_*eer 10 jms glassfish openmq

任何人都知道你是否可以以编程方式创建主题及其连接工厂?目前我使用glassfish管理实用程序来创建我的主题及其连接工厂.如果我不能在代码中创建它,glassfish/openmq有一个默认主题和我可以使用的conn工厂吗?

mdo*_*mdo 17

如果您只想绕过管理员手动创建资源,可以使用文件"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>
Run Code Online (Sandbox Code Playgroud)

请注意,如果实现多个主题,其消息不应混淆,则必须为主题使用不同的"名称"值(此处为"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,则该文件位于项目视图的"Server Resources"文件夹中.注意:如果使用NetBeans进行部署,则"服务器资源"中的glassfish-resources.xml仅供NetBeans使用!NetBeans知道如何创建这些资源并执行此任务.如果将EAR直接部署到没有NetBeans的Glassfish(这似乎很可能是生产环境),则必须在以下位置提供glassfish-resources.xml:

  • 您的EJB模块的META-INF或WAR的WEB-INF用于模块作用域资源
  • 适用于应用程序范围资源的企业应用程序的META-INF在NetBeans中,您可以通过将文件放入项目视图的"Configuration Files"文件夹(文件系统中为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>
Run Code Online (Sandbox Code Playgroud)

这是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
{ 
[...]
Run Code Online (Sandbox Code Playgroud)

警告:只有在使用应用程序作用域资源时,mappedName中的"java:app /"才是正确的.您可以在glassfish-resources.xml的定义中节省"java:app /".GF部署指南说:"应用程序范围的资源JNDI名称以java:app或java:module开头.如果未在JNDI名称中指定其中一个前缀,则会添加它."

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