2017-10-05 107 views
0

我試圖開發一個「Message Driven Bean」來處理所有本地的ActiveMQ消息,但這是我第一次嘗試做這樣的事情。MessageDrivenBean不處理消息[Wildfly]

我發現的大部分材料都解釋瞭如何使用JBOSS服務器編寫MDB,在這種情況下,存在一個包含一些隊列信息的xml文件,但在所有蜻蜓教程中都沒有提及任何類型的配置。

我有以下情形:

  1. 一個簡單的Java項目類似消息生產者

  2. 一個ActiveMQ的實例上運行的本地

  3. EJB項目部署到Wildfly 10

我的生產者項目是abl e將消息發送到ActiveMQ隊列,這部分工作正常,但我的EJB項目只有一個叫做TestMDBHandle的類,帶有@MessageDriven註解。這足以接收我的隊列消息嗎?由於MDB不起作用,我想必須是EJB中的一種配置或屬性來指定消息代理的主機。

我的消息生產者:位於我的製片人項目

java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory 
java.naming.provider.url=tcp://localhost:61616 
connectionFactoryNames = connectionFactory, queueConnectionFactory, topicConnectionFactory 
queue.MyQueue=jms/myqueue 

import javax.jms.Connection; 
import javax.jms.ConnectionFactory; 
import javax.jms.Destination; 
import javax.jms.JMSException; 
import javax.jms.MessageProducer; 
import javax.jms.Session; 
import javax.jms.TextMessage; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 


public class MessageSender { 

    public static void main(String args[]) throws NamingException, JMSException { 
     MessageSender sender = new MessageSender(); 
     sender.sender(); 
    } 

    public void sender() throws NamingException, JMSException { 

     InitialContext jndi = null; 
     Session session = null; 
     Connection connection = null; 

     try { 
      jndi = new InitialContext(); 
      ConnectionFactory factory = (ConnectionFactory)jndi.lookup("connectionFactory"); 
      connection = factory.createConnection(); 
      connection.start(); 

      session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 

      Destination destination = (Destination)jndi.lookup("MyQueue"); 

      MessageProducer producer = session.createProducer(destination); 

      TextMessage mensagem = session.createTextMessage("Eu enviei uma mensagem!"); 

      producer.send(mensagem); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      session.close(); 
      connection.close(); 
      jndi.close(); 
     } 

    } 
} 

我的JMS屬性最後,我的EJB項目有這樣的一個類,沒有任何形式的屬性文件或XML的。

package br.com.jms.mdb; 

import javax.annotation.Resource; 
import javax.ejb.ActivationConfigProperty; 
import javax.ejb.EJB; 
import javax.ejb.MessageDriven; 
import javax.ejb.MessageDrivenContext; 
import javax.jms.JMSException; 
import javax.jms.Message; 
import javax.jms.MessageListener; 
import javax.jms.TextMessage; 

@MessageDriven(name = "meuHandler", activationConfig = { 
     @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
     @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/myqueue") }) 
public class Teste implements MessageListener { 

    @Resource 
    private MessageDrivenContext mdctx; 

    public Teste() { 

    } 

    @Override 
    public void onMessage(Message message) { 
     TextMessage objectMessage = null; 
     try { 
      objectMessage = (TextMessage)message; 
      System.out.println("Achei a mensagem : " + objectMessage.getText().toString()); 
     }catch(JMSException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

回答

0

也許你可以提供更多的信息,如帶有隊列信息和MDB註釋屬性的xml文件?因爲這聽起來你正朝着正確的方向前進。主要有兩點:

您必須指定MDB正在偵聽的確切隊列,例如通過@MessageDriven註釋的屬性(例如「name」,「mappedName」,「activationConfig」)。當然,重寫onMessage()方法來處理消息。

您還必須確保此特定隊列可用作應用程序的資源。你必須爲此提供jms配置,它也定義了資源類型(隊列或主題)。從你的問題,我不能告訴你有哪些步驟(部分)完成。

+0

一切都完成了! 儘管在我的EJB 項目中沒有XML /屬性文件來指定ActiveMQ /隊列。這是我的主要疑問之一,因爲我發現 沒有提及/指定屬性文件來描述JMS詳細信息的所有教程。 我剛剛創建了一個帶有單個類的簡單EJB項目,關於JMS的所有屬性 都通過註釋位於此類中。 –

+0

難道是資源適配器沒有配置?見http://www.mastertheboss.com/jboss-server/jboss-jms/integrate-activemq-with-wildfly – OnlyEM