我的目标是使用来自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方面。它无法到达。
需要对服务器配置进行几次更新才能使其工作。
首先,您需要一个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>