当前位置: 首页 > 知识库问答 >
问题:

WebSphere Liberty ActiveMQ

董联
2023-03-14

我的目标是使用来自ActiveMQ的WebSphere Liberty Appserver(完整的Java EE标准)来使用消息。不幸的是,我不知道如何配置WebSphere Liberty。im使用的ActiveMQ服务器是开箱即用的,我已经添加了一个名为MyQueue的队列。

在我的Java EE应用程序中,我希望有一个消息驱动的bean,如果队列中有消息,它就会被踢。我试图从wasDev JMS示例中“窃取”配置,就像其他人在这个示例中所做的那样。但不幸的是,配置不适合我。我研究了活动mq资源适配器设置,并尝试在server.xml中使用它们。

首先,我从ActiveMQ下载了资源适配器rar并将其包含到服务器和server.xml中,如下所示:

<resourceAdapter id="activemq"  location="/opt/ibm/wlp/usr/servers/defaultServer/resources/activemq-rar-5.13.1.rar">
    <properties.activemq ServerUrl="tcp://192.168.200.6:61616" />
</resourceAdapter>
@MessageDriven(name = "PythonDaemonMessageEJB")

public class PythonDaemonMessageBean implements MessageListener {
    public PythonDaemonMessageBean() {
    }

    @Override
    public void onMessage(Message var1) {
        try {
            System.out.println(var1.getJMSMessageID());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
      http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
     version="3.1">
    <enterprise-beans>
    <session>
        <ejb-name>TestEJB</ejb-name>
        <ejb-class>ch.TestBean</ejb-class>
        <session-type>Stateless</session-type>
        <transaction-type>Container</transaction-type>
    </session>
    <message-driven>
        <ejb-name>PythonDaemonMessageEJB</ejb-name>
        <ejb-class>ch.PythonDaemonMessageBean</ejb-class>
        <messaging-type>javax.jms.MessageListener</messaging-type>
        <transaction-type>Container</transaction-type>
        <message-destination-type>javax.jms.Queue</message-destination-type>
        <activation-config>
            <activation-config-property>
                <activation-config-property-name>destination</activation-config-property-name>
                <activation-config-property-value>myQueue</activation-config-property-value>
            </activation-config-property>
            <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>
    </message-driven>
</enterprise-beans>

最后一步是“激活”server.xml中的bean

<jmsActivationSpec id="cert-manager-ear/cert-manager-ejb/PythonDaemonMessageEJB" />

就这样--在我看来,现在应该没事了。下面是完整的server.xml,其中还包含了我尝试过的其他内容。如果你有解决办法,请向我展示我做错了什么。

    <server description="new server">

    <!-- Enable features -->
    <featureManager>
        <feature>javaee-7.0</feature>
    <feature>localConnector-1.0</feature>
    </featureManager>

    <httpEndpoint id="defaultHttpEndpoint"
                  httpPort="9080"
                  httpsPort="9443" />

    <!-- Automatically expand WAR files and EAR files -->
    <applicationManager autoExpand="true"/>

    <resourceAdapter id="activemq"  location="/opt/ibm/wlp/usr/servers/defaultServer/resources/activemq-rar-5.13.1.rar">
        <properties.activemq ServerUrl="tcp://192.168.200.6:61616" />
    </resourceAdapter>

    <jmsActivationSpec id="cert-manager-ear/cert-manager-ejb/PythonDaemonMessageEJB" />
    #       <properties.activemq />  #destinationRef="jndi/MDBQ" destinationType="javax.jms.Queue" />
    #   </jmsActivationSpec>

    #   <jmsQueueConnectionFactory jndiName="jndi_JMS_BASE_QCF">
    #       <properties.activemq />
    #   </jmsQueueConnectionFactory>

    #   <jmsQueue> jndiName="jndi_INPUT_Q">
    #       <properties.activemq PhysicalName="QUEUE1" />
    #   </jmsQueue>

    #   <jmsQueue id="jndi/MDBREPLYQ" jndiName="jndi/MDBREPLYQ">
    #       <properties.activemq PhysicalName="MDBREPLYQ" />
    #   </jmsQueue>

    #   <jmsQueue id="jndi/MDBQ" jndiName="jndi/MDBQ">
    #       <properties.activemq PhysicalName="myQueue" />
    #   </jmsQueue>
    </server>

我使用的是WebSphere Liberty V8.5.5.8和ActiveMQ 5.13.1

日志文件说:

The message endpoint for the message driven bean PythonDaemonMessageEJB can not be activated because the target myQueue is not available. 

我的Python脚本可以毫无问题地读写目标。ActiveMQ日志文件没有说明什么,所以我认为问题不在ActiveMQ方面。它无法到达。

共有1个答案

鲜于阳成
2023-03-14

需要对服务器配置进行几次更新才能使其工作。

首先,您需要一个jmsQueue元素,该元素的id与激活配置属性中指定的目的地匹配。例如,

   <jmsQueue id="myQueue" jndiName="jndi/MDBQ">
       <properties.activemq PhysicalName="myQueue" />
   </jmsQueue>

其次,jmsActivationSpec元素需要一个嵌套的properties.activemq(即使您不想重写任何属性,也想要所有的默认值)来标识jmsActivationSpec与您配置的id为activemq的resourceAdapter相对应(而不是可以添加到配置中的任何其他resourceAdapter)。例如,

<jmsActivationSpec id="cert-manager-ear/cert-manager-ejb/PythonDaemonMessageEJB" />
   <properties.activemq />
</jmsActivationSpec>
 类似资料:

相关问答

相关文章

相关阅读