2015-05-05 18 views
10

Ich schreibe eine Stand-Alone-Hauptmethode, die einen Produzenten aufruft (um Daten in eine Warteschlange zu pushen), und ruft dann einen Verbraucher auf, der das Thema weiter hört.Returning String von Jms

Ich habe die onMessage überschrieben und ich kann die Nachricht aus der Warteschlange abrufen, aber ich bin nicht in der Lage, die Nachricht an die aufrufende Methode zurückzugeben.

Eigentlich möchte ich die Nachricht an den Browser übertragen, wollte also testen, ob ich es atleast bis main führen kann.

Bitte helfen Sie;

class TextMessageListener implements MessageListener { 
     String msgData; 

     public String getMsgData() { 
      return msgData; 
     } 

     public void setMsgData(String msgData) { 
      this.msgData = msgData; 
     } 

     public void onMessage(Message message) { 
      try { 
       if (message instanceof TextMessage) { 
        TextMessage textMessage = (TextMessage) message; 
        System.out.println("Received message in ::" + textMessage.getText() + " '"); 
        setMsgData(textMessage.getText()); 
       } 
      } catch (JMSException e) { 
       System.out.println("Caught:" + e); 
       e.printStackTrace(); 
      } 
     } 
    } 
+0

Verwenden der eigenständigen Hauptmethode, wie verbinden Sie Message Queue. Wahrscheinlich hilft Ihnen dieser Link http://www.novell.com/documentation/extend5/Docs/help/MP/jms/tutorial/ – Premraj

+0

@premraj, ich versuche den Wert mit setMsgData (textMessage.getText()) zu setzen; und versuche dann, den Getter aufzurufen, um den Wert zu erhalten, aber leider wird der Getter nicht aufgerufen. –

+0

Es würde helfen, wenn Sie den Code zeigen, der Getter aufrufen soll, da dies der Teil zu sein scheint, der nicht richtig funktioniert. –

Antwort

3

bekam schließlich die Antwort,

retrieving a value from message listener and print in Main

In dieser Klasse haben die Benutzer ein Beispiel gegeben:

@Stateful 
public class AManagerBean implements ejb.AManagerRemote { 
@Resource(mappedName = "jms/QueueConnectionFactory") 
private ConnectionFactory queueConnectionFactory; 
@Resource(mappedName = "jms/Queue") 
private Queue queue; 

private static int fineAmt; 

...... 

static class AListener implements MessageListener{ 
    public void onMessage(Message message){ 
     ..... 
     fineAmt = msg.getInt("fineAmt"); 
     // I NEED FINEAMT TO SHOW IN MAIN CLASS 

     ..... 
    } 
} 

public int returnFine(){ 
    return fineAmt; 
} 

In der Hauptklasse ...

public class Main { 

    @EJB 
    public static AManagerRemote amr; 

    public static void main(String[] args) { 
     ...... 
     System.out.println(amr.returnFine()); 
     // ALWAYS RETURN 0 

Zuallererst sind nicht-finale statische Variablen in einem EJB nicht erlaubt. Es gibt einen Eintrag dazu in der EJB Restrictionc FAQ

Nicht-finale statische Klassenfelder sind in EJBs nicht zulässig, da solche Felder die Verteilung einer Enterprise-Bean erschweren oder unmöglich machen. Statische Klassenfelder werden von allen Instanzen einer bestimmten Klasse gemeinsam genutzt, jedoch nur innerhalb einer einzelnen Java Virtual Machine (JVM). Das Aktualisieren eines statischen Klassenfelds impliziert die Absicht, den Feldwert zwischen allen Instanzen der Klasse zu teilen. Wenn eine Klasse jedoch gleichzeitig in mehreren JVMs ausgeführt wird, haben nur die Instanzen Zugriff auf den neuen Wert, die in derselben JVM wie die aktualisierende Instanz ausgeführt werden. Mit anderen Worten verhält sich ein nicht finales statisches Klassenfeld anders, wenn es in einer einzelnen JVM ausgeführt wird, als wenn es in mehreren JVMs ausgeführt wird. Der EJB-Container reserviert die Option, Enterprise-Beans über mehrere JVMs zu verteilen (die auf demselben Server oder auf einem Cluster von Servern ausgeführt werden). Nicht finale statische Klassenfelder sind nicht zulässig, da sich Enterprise-Bean-Instanzen abhängig davon, ob sie verteilt sind oder nicht, unterschiedlich verhalten. Zweitens haben Sie eine Stateful-Session-Bean definiert. Eine Stateful-Session-Bean soll einen Konversationsstatus haben, und ein Client (normalerweise) hat für die Dauer seiner Lebenszeit ein Handle mit derselben Stateful-Bean. Ich kann in Ihrem Beispiel nichts Konversation sehen (ich nehme an, da Sie etwas Code ausgeschnitten haben), also muss es wirklich eine Stateful Bean sein?

Also würde ich vorschlagen, dass das erste, was du tust, ist, ein Re-Design zu machen und zu versuchen, ein realistischeres Beispiel zu bekommen.