簡體   English   中英

JMS MessageListener 不適用於 Liberty

[英]JMS MessageListener not working on Liberty

我使用 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 應用程序服務器上測試 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 不起作用嗎?
什么錯誤?
我在谷歌搜索並找到了一些例子,但不明白如何解決這個問題! .

你沒有提供任何錯誤信息,所以或多或少在這里猜測

您缺少隊列定義:

<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,它在部署描述符元素中指定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM