2017-02-05 1 views
0

Angenommen, ich habe eine Webanwendung auf einem TomEE (Plume 7.0.2) bereitgestellt. Für diese Anwendung möchte ich eine zentrale Klasse erstellen, die für das Senden von Nachrichten über JMS zuständig ist. Meine erste Idee war ein Servlet ohne Zuordnung zu erstellen, die die erforderlichen Felder gespritzt bekommt:Wie erstellt man eine zentrale Klasse, die Nachrichten über JMS in einer Webanwendung in TomEE sendet?

public class JMSSendingServlet extends HttpServlet { 

    @Resource(mappedName = "jms/logging") 
    private Queue loggingQueue; 

    @Resource 
    private ConnectionFactory connectionFactory; 

    public void sendMessage(String text) throws JMSException { 
     Connection connection = connectionFactory.createConnection(); 
     //and so on... 
     producer.send(message); 
    } 
} 

Um jedoch diese Methode aus dem Rest der Anwendung zuzugreifen, würde ich entweder muß das Verfahren und die Felder statisch machen oder um die Instanz dieses Servlets irgendwie zu bekommen. Da ich die Abhängigkeitsinjektion bei statischen Feldern nicht durchführen kann (oder sollte), versuche ich eine Lösung für die zweite Option zu finden. Hier ist mein Versuch:

public class JMSSendingServlet extends HttpServlet { 

    private static JMSSendingServlet instance; 

    //... 

    @Override 
    public void init(ServletConfig config) throws ServletException { 
     instance = this; 
     super.init(config); 
    } 

    public static JMSSendingServlet getInstance() { 
     return instance; 
    } 
} 

//usage: 
public class SomeClass { 

    public void someMethod() { 
     JMSSendingServlet.getInstance().sendMessage("Hello"); 
    } 
} 

Da ich keine Zuordnungen nicht für dieses Servlet haben, und es wird sie über <load-on-startup/> geladen es sollte nur eine Instanz davon existieren. Aber ich fühle mich immer noch unwohl bei dieser Lösung. Es sieht für mich schmutzig aus, zumindest weil getInstance null zurückgeben kann.

Wäre es sauberer (wenn möglich), Abhängigkeitsinjektion aufzugeben und JNDI zu verwenden, um eine ConnectionFactory und eine Queue zu erhalten? Gibt es andere vielleicht bessere Lösungen?

+0

Welche Version von TomEE verwenden Sie? –

+0

@SteveC Der neueste stabile Plume 7.0.2 –

Antwort

0

Warum haben Sie keine JMSService-Klasse mit den Injektionen und einer send (xxx) -Methode und injizieren diese Klasse, wo Sie brauchen (Servlet, Jaxrs Service, MDB, andere ...)?

CDI würde es IMO sauberer machen als sich auf Servlets verlassen

Verwandte Themen