JMS MessageListener 不适用于 Liberty
JMS MessageListener not working on Liberty
我正在使用 JavaEE 8 完整配置文件开发 Liberty 18.0.0.2。
我在 server.xml 上使用以下内容配置了 JMS 2:
<?xml version="1.0" encoding="UTF-8"?>
<server description="new server">
<featureManager>
<feature>javaee-8.0</feature>
<feature>localConnector-1.0</feature>
<feature>wasJmsServer-1.0</feature>
<feature>wasJmsClient-2.0</feature>
</featureManager>
<basicRegistry id="basic" realm="BasicRealm" />
<httpSession securityIntegrationEnabled="false" />
<httpEndpoint id="defaultHttpEndpoint" httpPort="8080" httpsPort="9443" />
<applicationManager autoExpand="true" />
<applicationMonitor updateTrigger="mbean" />
<messagingEngine>
<queue id="simpleQueue" />
</messagingEngine>
<jmsActivationSpec id="jms/simpleQueue">
<properties.wasJms destinationRef="java:app/simpleQueue" />
</jmsActivationSpec>
</server>
现在我在 Liberty Application 服务器上编写了用于测试 JMS 的简单代码:
@Stateless
public class MessageSender {
@Inject
private JMSContext context;
@Resource(lookup = "java:app/simpleQueue")
private Queue queue;
public void sendMessage(String message) {
context.createProducer().send(queue, "hello");
}
}
@Path("/messenger")
public class Messenger {
@Inject
private MessageSender messageSender;
@Path("/send")
@GET
public Response send() {
messageSender.sendMessage("Hello Mahdi");
return Response.ok("ok").build();
}
}
@MessageDriven(
name = "simpleQueue",
mappedName = "java:app/simpleQueue",
activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination",
propertyValue = "app/simpleQueue")
})
public class MessageReceiver implements MessageListener {
@Override
public void onMessage(Message message) {
System.out.println(message);
}
}
你能解释一下为什么 MessageListener 不起作用吗?
怎么了?
我在 google 中搜索并找到了一些示例,但无法理解如何解决此问题! .
您没有提供任何错误信息,所以这里或多或少是猜测
您缺少队列定义:
<jmsQueue jndiName="java:app/simpleQueue" id="simpleQueueJms">
<properties.wasJms queueName="simpleQueue"/>
</jmsQueue>
你的 MDB 应该这样定义:
@MessageDriven(name="SimpleMDB")
public class MessageReceiver implements MessageListener
和这样的活动规格:
<jmsActivationSpec id="yourAppName/SimpleMDB">
<properties.wasJms destinationRef="simpleQueueJms" destinationType="javax.jms.Queue"/>
</jmsActivationSpec>
根据评论中的要求更新。
应用程序名称取决于您的应用程序结构和部署描述符。您可以在这里找到详细信息 - Deploying message-driven beans,但我引用相关部分以供参考:
ID 值必须采用 application name/module name/bean name
格式,其中:
application name
是部署的应用程序的名称(例如,JMSSample)。仅当 bean 打包在 EAR 文件中时应用程序名称才适用。除非由 application.xml 部署描述符指定,否则应用程序默认为没有文件扩展名的 EAR 文件的基本名称。
module name
是打包bean的模块名。在独立的 ejb-jar 文件或 WAR 文件中, 默认为删除了任何文件扩展名的模块的基本名称。在 EAR 文件中,默认为模块的路径名,删除了任何文件扩展名,但包含了任何目录名。 可以使用 ejb-jar.xml(对于 ejb-jar 文件)的模块名称 元素或 web.xml(对于 WAR文件)。
bean name
是企业 bean 的 ejb-name。对于通过注释定义的企业 bean,bean 名称默认为会话 bean 的非限定名称 class,除非在 MessageDriven 注释的 name() 属性的内容中指定。对于通过 ejb-jar.xml 定义的企业 bean,它在部署描述符元素中指定。
我正在使用 JavaEE 8 完整配置文件开发 Liberty 18.0.0.2。
我在 server.xml 上使用以下内容配置了 JMS 2:
<?xml version="1.0" encoding="UTF-8"?>
<server description="new server">
<featureManager>
<feature>javaee-8.0</feature>
<feature>localConnector-1.0</feature>
<feature>wasJmsServer-1.0</feature>
<feature>wasJmsClient-2.0</feature>
</featureManager>
<basicRegistry id="basic" realm="BasicRealm" />
<httpSession securityIntegrationEnabled="false" />
<httpEndpoint id="defaultHttpEndpoint" httpPort="8080" httpsPort="9443" />
<applicationManager autoExpand="true" />
<applicationMonitor updateTrigger="mbean" />
<messagingEngine>
<queue id="simpleQueue" />
</messagingEngine>
<jmsActivationSpec id="jms/simpleQueue">
<properties.wasJms destinationRef="java:app/simpleQueue" />
</jmsActivationSpec>
</server>
现在我在 Liberty Application 服务器上编写了用于测试 JMS 的简单代码:
@Stateless
public class MessageSender {
@Inject
private JMSContext context;
@Resource(lookup = "java:app/simpleQueue")
private Queue queue;
public void sendMessage(String message) {
context.createProducer().send(queue, "hello");
}
}
@Path("/messenger")
public class Messenger {
@Inject
private MessageSender messageSender;
@Path("/send")
@GET
public Response send() {
messageSender.sendMessage("Hello Mahdi");
return Response.ok("ok").build();
}
}
@MessageDriven(
name = "simpleQueue",
mappedName = "java:app/simpleQueue",
activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination",
propertyValue = "app/simpleQueue")
})
public class MessageReceiver implements MessageListener {
@Override
public void onMessage(Message message) {
System.out.println(message);
}
}
你能解释一下为什么 MessageListener 不起作用吗?
怎么了?
我在 google 中搜索并找到了一些示例,但无法理解如何解决此问题! .
您没有提供任何错误信息,所以这里或多或少是猜测
您缺少队列定义:
<jmsQueue jndiName="java:app/simpleQueue" id="simpleQueueJms">
<properties.wasJms queueName="simpleQueue"/>
</jmsQueue>
你的 MDB 应该这样定义:
@MessageDriven(name="SimpleMDB")
public class MessageReceiver implements MessageListener
和这样的活动规格:
<jmsActivationSpec id="yourAppName/SimpleMDB">
<properties.wasJms destinationRef="simpleQueueJms" destinationType="javax.jms.Queue"/>
</jmsActivationSpec>
根据评论中的要求更新。
应用程序名称取决于您的应用程序结构和部署描述符。您可以在这里找到详细信息 - Deploying message-driven beans,但我引用相关部分以供参考:
ID 值必须采用 application name/module name/bean name
格式,其中:
application name
是部署的应用程序的名称(例如,JMSSample)。仅当 bean 打包在 EAR 文件中时应用程序名称才适用。除非由 application.xml 部署描述符指定,否则应用程序默认为没有文件扩展名的 EAR 文件的基本名称。module name
是打包bean的模块名。在独立的 ejb-jar 文件或 WAR 文件中, 默认为删除了任何文件扩展名的模块的基本名称。在 EAR 文件中,默认为模块的路径名,删除了任何文件扩展名,但包含了任何目录名。 可以使用 ejb-jar.xml(对于 ejb-jar 文件)的模块名称 元素或 web.xml(对于 WAR文件)。bean name
是企业 bean 的 ejb-name。对于通过注释定义的企业 bean,bean 名称默认为会话 bean 的非限定名称 class,除非在 MessageDriven 注释的 name() 属性的内容中指定。对于通过 ejb-jar.xml 定义的企业 bean,它在部署描述符元素中指定。