Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从消息驱动Bean(MDB)连接到远程JMS提供程序_Java_Jakarta Ee_Jms_Glassfish 3 - Fatal编程技术网

Java 从消息驱动Bean(MDB)连接到远程JMS提供程序

Java 从消息驱动Bean(MDB)连接到远程JMS提供程序,java,jakarta-ee,jms,glassfish-3,Java,Jakarta Ee,Jms,Glassfish 3,从部署在Glassfish上的EJB或POJO,在向类路径添加必要的特定于hornet的JAR后,我可以使用以下代码连接到HornetMQ: Properties properties = new Properties(); properties.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); // server name properties.put("java.namin

从部署在Glassfish上的EJB或POJO,在向类路径添加必要的特定于hornet的JAR后,我可以使用以下代码连接到HornetMQ:

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();
    // ...
但是我想从消息驱动Bean中执行同样的操作

对于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时查找远程服务器(如第一个代码段中所示)

您正在尝试配置远程JMS提供程序。这里有一篇好文章


但是,我不确定它是否适用于HornetMQ,在我找到解决方案后,您可能需要使用OpenMQ的远程实例

要使MDB能够与远程HornetQ提供商“对话”,请执行以下步骤:

  • 使用管理控制台将hornetq ra.rar部署到glassfish(您可以在hornetq文件夹的“libs”文件夹中找到它)
  • 查找
    /domains//applications/hornetq-ra/META-INF/ra.xml
    ,并注释掉以下部分:

  • 假设您的MDB看起来像这样,您应该会收到以下消息:


@普雷斯顿,见我的更新。链接+1;恐怕这篇文章是针对GF2.1的;GF 3.0.1在连接工厂的底部似乎没有任何通用资源适配器版本3没有附加属性部分?这就是您要配置地址列表的地方。“如果我们使用的是远程JMS代理,那么我们应该添加一个新的属性AddressList,并将该值设置为主机:端口组合的逗号分隔列表。”
 <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>
  <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>
@MessageDriven(mappedName = "ExampleMDB")
public class MessageProcessor implements MessageListener {

  public MessageProcessor() {
  }

  public void onMessage(Message message) {

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

  }
}