2

我使用 JavaEE 8 full profile 开发 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 不起作用吗?
有什么错误?
我在谷歌搜索并找到了一些示例,但无法理解如何解决这个问题!.

4

1 回答 1

1

您没有提供任何错误消息,因此或多或少在这里猜测

您缺少队列定义:

<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 文件)的 module-name 元素覆盖默认值。

  • bean name是企业 bean 的 ejb 名称。对于通过注解定义的企业 bean,bean 名称默认为会话 bean 类的非限定名称,除非在 MessageDriven 注解的 name() 属性的内容中指定。对于通过 ejb-jar.xml 定义的企业 bean,它在部署描述符元素中指定。

于 2018-10-09T08:02:37.703 回答