...
ejb-jar.xml ファイル内に MDB の宣言をする代わりに、メッセージ駆動 Bean には @MessageDriven アノテーションを利用します。さらなる情報をアノテーションに与えることによって、送信先(今回はキューに入れる)を探して処理する方法がわかります。この MDB は 'OrderQueue' にメッセージを送信する処理をします。終了結果として画面にこのメッセージを表示します。
Code Block |
---|
| java |
---|
borderStyle | solid |
---|
title | OrderRecvMDB.java | borderStyle | solid |
---|
| java |
---|
|
//
// MessageDrivenBean that listens to items on the
// 'OrderQueue' queue and processes them accordingly.
//
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination", propertyValue="OrderQueue")
})
public class OrderRecvMDB implements MessageListener{
private static final String ORDER_MGMT_INFO = "order_mgmt.properties";
private static final String ORDER_REPO = "order.repo";
public OrderRecvMDB() {
}
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("Order Received \n"+ textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
|
このアプリケーションには、OrderQueue でリッスンする MDB があります。openejb-jar.xml では Geronimo に MDB が jms-resources という JMS リソース・グループに所属していることを通知します。これは OrderRecvMDB と OrderQueue を CommonConnectionFactory 経由でリンクしています。
Code Block |
---|
| xml |
---|
borderStyle | solid |
---|
title | openejb-jar.xml | borderStyle | solid |
---|
| xml |
---|
|
<openejb-jar
xmlns="http://www.openejb.org/xml/ns/openejb-jar-2.1"
xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.1"
xmlns:security="http://geronimo.apache.org/xml/ns/security-1.1"
xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.2">
<sys:environment>
<sys:moduleId>
<sys:groupId>${pom.groupId}</sys:groupId>
<sys:artifactId>${pom.artifactId}</sys:artifactId>
<sys:version>${version}</sys:version>
<sys:type>jar</sys:type>
</sys:moduleId>
<sys:dependencies>
<sys:dependency>
<sys:groupId>org.apache.geronimo.configs</sys:groupId>
<sys:artifactId>activemq-broker</sys:artifactId>
<sys:type>car</sys:type>
</sys:dependency>
</sys:dependencies>
<sys:hidden-classes/>
<sys:non-overridable-classes/>
</sys:environment>
<enterprise-beans>
<message-driven>
<ejb-name>OrderRecvMDB</ejb-name>
<resource-adapter>
<resource-link>jms-resources</resource-link>
</resource-adapter>
</message-driven>
</enterprise-beans>
</openejb-jar>
|
geronimo-application.xml と application.xml は EAR の主たるコンポーネントを定義しています。EJB コンポーネントと Web アーカイブ情報は通常これらのファイルにかかれます。この geronimo-application.xmlはまた、JMS キューとそれへ接続するための一般的なキューのコネクション・ファクトリーを定義するセクションも含みます。これは ear に組み込まれた geronimo-activemq-ra.rar のデプロイに利用されます。
Code Block |
---|
| xml |
---|
borderStyle | solid |
---|
title | geronimo-application.xml | borderStyle | solid |
---|
| xml |
---|
|
<application xmlns="http://geronimo.apache.org/xml/ns/j2ee/application-1.1">
<environment xmlns="http://geronimo.apache.org/xml/ns/deployment-1.2">
<moduleId>
<groupId>${pom.groupId}</groupId>
<artifactId>${pom.artifactId}</artifactId>
<version>${version}</version>
<type>ear</type>
</moduleId>
</environment>
<module>
<connector>geronimo-activemq-ra-2.0-SNAPSHOT.rar</connector>
<connector xmlns="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2">
<dep:environment xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2">
<dep:moduleId>
<dep:groupId>${pom.groupId}</dep:groupId>
<dep:artifactId>jms-resources</dep:artifactId>
<dep:version>${version}</dep:version>
<dep:type>rar</dep:type>
</dep:moduleId>
<dep:dependencies>
<dep:dependency>
<dep:groupId>org.apache.geronimo.configs</dep:groupId>
<dep:artifactId>activemq-broker</dep:artifactId>
<dep:type>car</dep:type>
</dep:dependency>
</dep:dependencies>
</dep:environment>
<resourceadapter>
<resourceadapter-instance>
<resourceadapter-name>jms-resources</resourceadapter-name>
<nam:workmanager xmlns:nam="http://geronimo.apache.org/xml/ns/naming-1.2">
<nam:gbean-link>DefaultWorkManager</nam:gbean-link>
</nam:workmanager>
</resourceadapter-instance>
<outbound-resourceadapter>
<connection-definition>
<connectionfactory-interface>javax.jms.ConnectionFactory</connectionfactory-interface>
<connectiondefinition-instance>
<name>CommonConnectionFactory</name>
<implemented-interface>javax.jms.QueueConnectionFactory</implemented-interface>
<implemented-interface>javax.jms.TopicConnectionFactory</implemented-interface>
<connectionmanager>
<xa-transaction>
<transaction-caching/>
</xa-transaction>
<single-pool>
<match-one/>
</single-pool>
</connectionmanager>
</connectiondefinition-instance>
</connection-definition>
</outbound-resourceadapter>
</resourceadapter>
<adminobject>
<adminobject-interface>javax.jms.Queue</adminobject-interface>
<adminobject-class>org.apache.activemq.command.ActiveMQQueue</adminobject-class>
<adminobject-instance>
<message-destination-name>OrderQueue</message-destination-name>
<config-property-setting name="PhysicalName">OrderQueue</config-property-setting>
</adminobject-instance>
</adminobject>
<adminobject>
<adminobject-interface>javax.jms.Topic</adminobject-interface>
<adminobject-class>org.apache.activemq.command.ActiveMQTopic</adminobject-class>
</adminobject>
</connector>
</module>
</application>
|
Code Block |
---|
| xml |
---|
borderStyle | solid |
---|
title | application.xml | borderStyle | solid |
---|
| xml |
---|
|
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd" version="5">
<description>Geronimo Sample EAR for jms-mdb-sample</description>
<display-name>Geronimo Sample EAR for jms-mdb-sample</display-name>
<module>
<connector>geronimo-activemq-ra-2.0-SNAPSHOT.rar</connector>
</module>
<module>
<ejb>jms-mdb-sample-ejb-2.0-SNAPSHOT.jar</ejb>
</module>
<module>
<web>
<web-uri>jms-mdb-sample-war-2.0-SNAPSHOT.war</web-uri>
<context-root>/order</context-root>
</web>
</module>
</application>
|
...
Note |
---|
Geronimo は @Resource の 'mappedName' 属性を無視することに注意してください。その代わりにアノテーションは 'name' を使ってください。 |
Code Block |
---|
| java |
---|
borderStyle | solid |
---|
title | OrderSenderServlet.java | borderStyle | solid |
---|
| java |
---|
|
public class OrderSenderServlet extends HttpServlet {
@Resource(name="CommonConnectionFactory")
private ConnectionFactory factory;
@Resource(name="OrderQueue")
private Queue receivingQueue;
public void init() throws ServletException {
super.init();
}
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
manageOrders(req,res);
}
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
doGet(req,res);
}
private void manageOrders(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
String path = "/error.jsp";
Connection connection = null;
MessageProducer messageProducer = null;
Session sess = null;
try
{
String customerId = req.getParameter("customerId");
String orderId = req.getParameter("orderId");
String qty = req.getParameter("quantity");
String model = req.getParameter("model");
if(!customerId.equals("") && !orderId.equals("") && !qty.equals("")){
System.out.println("Start Sending Order Request");
// creating online order request
String orderRequest = "<Order orderId=\""+orderId+"\" custId=\""+customerId+"\" qty=\""+qty+"\" model=\""+model+"\"/>" ;
connection = factory.createConnection();
sess = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
path = "/index.jsp";
TextMessage msg = sess.createTextMessage("<OrderId=" + orderId + " CustomerId=" + customerId
+ " Quantity=" + qty + " Model=" + model + ">" );
messageProducer = sess.createProducer(receivingQueue);
messageProducer.send(msg);
System.out.println("Order Request Send");
} else{
String error = "";
if(customerId.equals("")){
error = "Customer Id Cannot be Empty";
}else if(orderId.equals("")){
error = "Order Id Cannot be Empty";
}else if(qty.equals("")){
error = "Quantity Cannot be Empty";
}
req.setAttribute("error",error);
}
} catch (Exception e)
{
System.out.println("Error "+e);
e.printStackTrace();
} finally {
try {
if(messageProducer != null) messageProducer.close();
if(sess != null)sess.close();
if(connection!= null)connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
getServletContext().getRequestDispatcher(path).forward(req,res);
}
}
|
このアーカイブの web.xml では、キューのコネクション・ファクトリーとキューとの関連する構成を記述しています。これはリソースをローカル環境で参照するためには必須です。
Code Block |
---|
| xml |
---|
borderStyle | solid |
---|
title | web.xml | borderStyle | solid |
---|
| xml |
---|
|
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<description>JMS Servlet Sample</description>
<servlet>
<servlet-name>OrderSenderServlet</servlet-name>
<servlet-class>org.apache.geronimo.samples.order.OrderSenderServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>OrderSenderServlet</servlet-name>
<url-pattern>/order</url-pattern>
</servlet-mapping>
<resource-ref>
<res-ref-name>CommonConnectionFactory</res-ref-name>
<res-type>javax.jms.QueueConnectionFactory</res-type>
<res-auth>Container</res-auth>
<es-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<message-destination-ref>
<message-destination-ref-name>OrderQueue</message-destination-ref-name>
<message-destination-type>javax.jms.Queue</message-destination-type>
<message-destination-usage>Produces</message-destination-usage>
<message-destination-link>OrderQueue</message-destination-link>
</message-destination-ref>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
</web-app>
|
...