2011-07-27 12 views
0

以下のコードはjavax.naming.NameNotFoundExceptionをスローします。 ?私は、サーバー上で個人的に私はそれが、このことにより、自動に作成されたと考えることを作成する必要があります@MessageDrivenはJBoss AS 5で動作しません

package web; 

import javax.ejb.ActivationConfigProperty; 
import javax.ejb.MessageDriven; 
import javax.jms.Message; 
import javax.jms.MessageListener; 

@MessageDriven(mappedName="jms/txt", 
     activationConfig = { @ActivationConfigProperty(
       propertyName = "destinationType", propertyValue = "javax.jms.Queue" 
     ) }) 
public class FirstMDB implements MessageListener { 

    public void onMessage(Message message) { 


    } 

} 

:私はそれが5

package web; 
import java.util.Properties; 
import javax.jms.Queue; 
import javax.jms.QueueConnection; 
import javax.jms.QueueConnectionFactory; 
import javax.jms.QueueSender; 
import javax.jms.QueueSession; 
import javax.jms.TextMessage; 
import javax.naming.InitialContext; 

import org.jboss.jms.server.connectionfactory.ConnectionFactory; 

public class MyMDBClient { 

    public static void main(String[] args) { 
     QueueConnection cnn = null; 
     QueueSender sender = null; 
     QueueSession session = null; 
     InitialContext ctx; 
     try { 
      Properties props = new Properties(); 
      props.setProperty("java.naming.factory.initial", 
        "org.jnp.interfaces.NamingContextFactory"); 
      props.setProperty("java.naming.factory.url.pkgs", 
        "org.jboss.naming"); 
      props.setProperty("java.naming.provider.url", "127.0.0.1:1099"); 

      ctx = new InitialContext(props); 
      Queue queue = (Queue) ctx.lookup("jms/txt"); 
      QueueConnectionFactory factory = (QueueConnectionFactory)new ConnectionFactory(); 
      cnn = factory.createQueueConnection(); 
      session = cnn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); 
      TextMessage msg = session.createTextMessage("Hello World"); 
      sender = session.createSender(queue); 
      sender.send(msg); 
      System.out.println("Message sent successfully to remote queue."); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

とMDBのJBoss ASでの問題のいくつかの種類であるかもしれないことを考えます表記は本当ですか?

+0

>個人的にサーバー上に作成する必要がありますか?この表記によって自動的に作成されると思いますか? - JMSキューが聴取するBeanを定義することによってJMSキューが自動的に作成されるかどうかを確認しようとしていますか?そうであれば、答えはいいえです。実際のキューを自分で定義する必要があります。 –

答えて

0

MDBがメッセージを聞くトピック/キューを示すdestinationNameがありません。

@MessageDriven(mappedName = "jms/txt", activationConfig = { 
     @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), 
     @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
     @ActivationConfigProperty(propertyName = "destinationName", propertyValue = "jms/txt") 
    } 
) 

または、特定のキューが管理コンソールでサーバー上に作成されているかどうかをを確認し、検索が失敗しています。

0

nameNotFoundExceptionは、JNDIでルックアップしようとしている名前が存在しないことを示します。そのため、キューがまったく定義されていないか、間違った名前を使用しています。

キューを定義するxmlファイルを表示できますか?

また、Nayanも示しているように、destinationプロパティがありません。これは必須です。さらに、mappedNameアノテーション属性の使用法は完全に間違っており、省略する必要があります。さらに、MDBはデフォルトのコンテナ管理トランザクションを使用しているため、acknowledgeModeは無視されているため、指定する必要はありません。

コードは次のようになります。あなたのクライアント用として

@MessageDriven( 
    activationConfig = {   
     @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
     @ActivationConfigProperty(propertyName = "destination", propertyValue = "/queue/yourQueue") 
    } 
) 
public class FirstMDB implements MessageListener { 

    public void onMessage(Message message) {  

    }  
} 

を、一般的に、あなたはまた、リモートJNDIからConnectionFactoryを探す必要があると、そこから得たコネクションをクローズするのを忘れないでください。 JBoss AS 5.xおよび6.xでは、このファクトリのJNDI名は単に/ConnectionFactoryです。 JMSメッセージを送信する慣用的な例として

getFactoryFromJNDI()getDestinationFromJNDI()は、単にJNDIルックアップコードをラップ

ConnectionFactory factory = getFactoryFromJNDI(); 
Connection connection = null; 
try { 
    try { 
     connection = factory.createConnection(); 

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

     MessageProducer sender = session.createProducer(destination);  
     Message message = session.createTextMessage("Hello World"); 

     sender.send(message);   
    } 
    finally { 
     if (connection != null) { 
      connection.close(); 
     } 
    } 
} 
catch (JMSException e) { 
    // ... 
} 

関連する問題