たとえばWebアプリケーションに、Message Driven Beanを2つつくります。(import文略)
@MessageDriven(mappedName = "jms/NewMessage1Queue", activationConfig = { @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") }) public class NewMessageBean1 implements MessageListener { @Override public void onMessage(Message message) { System.out.println("mdb1"); } }
これの、mappedNameやクラス名、printlnの部分の「1」を「2」にしたものも作ります。
で、呼び出します。
@WebServlet(name = "InvokeServlet", urlPatterns = {"/InvokeServlet"}) public class InvokeServlet extends HttpServlet { @Resource(mappedName = "jms/NewMessage1Queue") private Queue newMessage1Queue; @Resource(mappedName = "jms/NewMessage1QueueFactory") private ConnectionFactory newMessage1QueueFactory; @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { Connection connection = newMessage1QueueFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //メッセージ作成 TextMessage tm = session.createTextMessage(); tm.setText("hoge"); //送信 MessageProducer messageProducer = session.createProducer(newMessage1Queue); messageProducer.send(tm); sendJMSMessageToNewMessage1Queue("hoge"); session.close(); connection.close(); } catch (JMSException ex) { Logger.getLogger(InvokeServlet.class.getName()).log(Level.SEVERE, null, ex); } response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>Servlet InvokeServlet</title></head>"); out.println("<body>"); out.println("<h1>Invoked</h1>"); out.println("</body></html>"); out.close(); } }
実際にはNetBeansのJMS呼びだしコードを挿入機能でコードを生成しています。
そのとき、次のような定義ができます。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> <glassfish-web-app error-url=""> <resource-ref> <res-ref-name>jms/NewMessage1QueueFactory</res-ref-name> <jndi-name>jms/NewMessage1QueueFactory</jndi-name> </resource-ref> <message-destination-ref> <message-destination-ref-name>jms/NewMessage1Queue</message-destination-ref-name> <jndi-name>jms/NewMessage1Queue</jndi-name> </message-destination-ref> <class-loader delegate="true"/> <jsp-config> <property name="keepgenerated" value="true"> <description>Keep a copy of the generated servlet class' java code.</description> </property> </jsp-config> </glassfish-web-app>
で、実行すると、mdb1とmdb2がランダムにログに表示されて、適当にMessage Driven Beanが呼び出されてしまっています。
ちゃんと特定のMessage Driven Bean呼び出すには、どうしたらいいんでしょ?