2012-04-01 4 views
3

Verwenden von JBoss AS 6.1.0 Final mit dem Bereitstellungsprofil "default".JMS-Produzent in Session-Bean auf JBoss AS 6 löst Ausnahme aus

Ich möchte eine JMS-Nachricht von einer Session Bean senden. Ich habe die folgenden:

/server/default/deploy/my-HornetQ-jms:

<configuration xmlns="urn:hornetq" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="urn:hornetq /schema/hornetq-jms.xsd"> 

    <queue name="queue/DummyMDBean"> 
     <entry name="jms/DummyMDBean"/> 
    </queue> 
</configuration> 

In der Bohne ich habe:

@Stateless 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class Demo implements DemoRemote, DemoLocal { 
    ... 
    @Resource(mappedName = "java:/ConnectionFactory") 
    private static QueueConnectionFactory queueConnectionFactory; 

    @Resource(mappedName = "/jms/DummyMDBean") 
    private static Queue queue; 

    public void example() { 
     QueueConnection queueConnection = null; 
     try { 
      queueConnection = queueConnectionFactory.createQueueConnection(); 
     } catch (JMSException e) { 
      System.out.println("Exception occurred: " + e.toString()); 
      e.printStackTrace(); 
     } 

     try { 
      QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 
      QueueSender queueSender = queueSession.createSender(queue); 

      // Send a text message: 
      TextMessage textMessage = queueSession.createTextMessage(); 
      textMessage.setText("Hello World"); 

      queueSender.send(textMessage); 
     } catch (JMSException e) { 
      System.out.println("Exception occurred: " + e.toString()); 
      e.printStackTrace(); 
     } finally { 
      closeConnection(queueConnection); 
     } 
    } 

ich die folgende Fehlermeldung erhalten:

15:46:05,011 INFO [STDOUT] Exception occurred: javax.jms.JMSException: Failed to create session factory 
15:46:05,661 ERROR [STDERR] javax.jms.JMSException: Failed to create session factory 
15:46:05,666 ERROR [STDERR]  at org.hornetq.jms.client.HornetQConnectionFactory.createConnectionInternal(HornetQConnectionFactory.java:605) 
15:46:05,667 ERROR [STDERR]  at org.hornetq.jms.client.HornetQConnectionFactory.createQueueConnection(HornetQConnectionFactory.java:131) 
15:46:05,668 ERROR [STDERR]  at org.hornetq.jms.client.HornetQConnectionFactory.createQueueConnection(HornetQConnectionFactory.java:126) 
15:46:05,669 ERROR [STDERR]  at com.demo.Demo.example(Demo.java:109) 

... 

15:46:05,782 ERROR [STDERR]  at java.lang.Thread.run(Thread.java:722) 
15:46:05,783 ERROR [STDERR] Caused by: java.lang.NullPointerException 
15:46:05,784 ERROR [STDERR]  at org.hornetq.core.client.impl.ServerLocatorImpl.removeFromConnecting(ServerLocatorImpl.java:682) 
15:46:05,784 ERROR [STDERR]  at org.hornetq.core.client.impl.ServerLocatorImpl.createSessionFactory(ServerLocatorImpl.java:751) 
15:46:05,785 ERROR [STDERR]  at org.hornetq.jms.client.HornetQConnectionFactory.createConnectionInternal(HornetQConnectionFactory.java:601) 
15:46:05,785 ERROR [STDERR]  ... 180 more 

Zeile 109 ist die "queueConnection = queueConnectionFactory.createQueueConnection();".

Ich habe nichts von der Standardeinstellung außer der Xml oben geändert. Irgendwelche Ideen über das Problem und wie man es repariert?

+0

Ohne Bezug auf die Frage, aber Ihr erster Versuch/Fang scheint nicht viel Sinn zu machen. Wenn es dich wirft, fahre einfach fort (mit einer ungültigen Verbindung). Der zweite try catch führt genau die gleiche Protokollierung durch. Sie können den ersten Fang und den zweiten Versuch entfernen. –

+0

@Arjan ich weiß, aber das ist nur ein Test, um herauszufinden, warum es scheitern. – roterl

Antwort

2

Entspricht Zeile 109 in Demo.java der folgenden Zeile?

QueueSender queueSender = queueSession.createSender(queue); 

Ich denke, dass queue Null sein könnte. Sie könnten versuchen, die Warteschlange zu erklären, wie folgt:

<queue name="queue/DummyMDBean"> 
    <entry name="/jms/DummyMDBean"/> 
</queue> 

Update:

Die verwendete Verbindung Fabrik kann auch in einer EJB-Umgebung problematisch sein. In AS 6.10 ist /ConnectionFactory eine Art nicht verwaltete Factory, die in Servlets und JSF-verwalteten Beans funktioniert, um direkte Ziellistener zu erstellen (was sonst im Container verboten ist).

Für die Verwendung in EJB scheint es, dass Sie jetzt eigentlich java:/jmsXA verwenden sollten (das war anders in 6.0 und 5.x). Z.B.

@Resource(mappedName = "java:/JmsXA") 
private ConnectionFactory queueConnectionFactory; 
+0

Nein, es ist "queueConnection = queueConnectionFactory.createQueueConnection();" (Bearbeiten Sie einfach die Frage, um dies zu notieren) – roterl

+0

Sie haben Recht. Für eine andere Möglichkeit, siehe aktualisierte Antwort. –

+0

die JmsXA Verwendung Ich erhalte '55 IDT 2012 timerState = RETRY_TIMEOUT: javax.ejb.EJBTransactionRolledbackException: failed Wert [email protected] auf Feld private static javax.jms.ConnectionFactory com.demo.Demo einstellen .queueConnectionFactory; Grund: ClassLoaders des Wertes: BaseClass Loader @ 738a2a09 {vfs: /// C: /Users/u/Developen-/jboss-6.1.0.Final/server/default/deploy/jms-ra.rar} und Zielfeld BaseClassLoader @ 717a07ac {vfs: /// C:/Benutzer /u/Development/jboss-6.1.0.Final/server/default/deploy/demo.ear} sind nicht gleich ' – roterl