ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

本気で取り組むEJB!コミュのその他マメ知識っぽいもの

  • mixiチェック
  • このエントリーをはてなブックマークに追加

コメント(4)

XDocletで生成されるファイルのフォーマットが変更できるようだ。

試しに
xdoclet-1.2.2/lib/xdoclet-openejb-module-1.2.3.jar

を解凍し、
/xdoclet/modules/openejb/ejb/resources

配下のopenejb-jar_xml.xdtを修正してみた。

『修正前』
<XDtEjbSession:forAllSessionBeans>
 <ejb-deployment ejb-name="<XDtEjb:ejbName/>"
  <XDtEjb:ifRemoteEjb>
   deployment-id="<XDtEjbHome:jndiName type="remote"/>"
  </XDtEjb:ifRemoteEjb>
  <XDtEjbSession:ifStatelessSession>
   container-id="Default Stateless Container"/>
  </XDtEjbSession:ifStatelessSession>
  <XDtEjbSession:ifStatefulSession>
   container-id="Default Stateful Container"/>
  </XDtEjbSession:ifStatefulSession>
</XDtEjbSession:forAllSessionBeans>

『修正後』
<XDtEjb:forAllBeans>
 <ejb-deployment ejb-name="<XDtEjb:ejbName/>"
  <XDtEjb:ifRemoteEjb>
   deployment-id="<XDtEjbHome:jndiName type="remote"/>"
  </XDtEjb:ifRemoteEjb>
  <XDtEjbSession:ifStatelessSession>
   container-id="Default Stateless Container"/>
  </XDtEjbSession:ifStatelessSession>
  <XDtEjbSession:ifStatefulSession>
   container-id="Default Stateful Container"/>
  </XDtEjbSession:ifStatefulSession>
  <XDtEjbCmp:ifEntityIsCmp>
   container-id="Default CMP Container"/>
  </XDtEjbCmp:ifEntityIsCmp>
  <XDtEjbBmp:ifEntityIsBmp>
   container-id="Default BMP Container"/>
  </XDtEjbBmp:ifEntityIsBmp>
</XDtEjb:forAllBeans>

まずまずの結果で満足☆

もっとイロイロ修正できそうだし、一度作るとノウハウとして残るから調べてみよう。
最近全然更新してないので、適当になんか書きます。

メッセージ・ドリブンBeanの作り方
※サンプルはOpneEJBです。

-----------------------------------------------------------------
まずソースから

import javax.ejb.EJBException;
import javax.ejb.MessageDrivenBean;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

public class ReceiverEJB implements MessageDrivenBean,
MessageListener {

private static final long serialVersionUID = -7638407199064292238L;

protected MessageDrivenContext ctx;

public void ejbCreate() {
System.out.println("ejbCreate colled.");
}

public void onMessage(Message message) {
System.out.println("onMessage colled.");

if (message instanceof TextMessage) {

TextMessage objectMessage = null;
String str = null;

try {
objectMessage = (TextMessage) message;
// ObjectMessageをImoshochuCatalogItemにキャストしgetterメソッド
// で各項目を取り出し、コンソールに表示する
str = objectMessage.getText();

System.out.println("メッセージ受信開始");
System.out.println(str);
System.out.println("メッセージ受信終了");

} catch (JMSException e) {
e.printStackTrace();
throw new RuntimeException(e);
}

}

System.out.println("onMessage end.");

}

public void ejbRemove() throws EJBException {
System.out.println("ejbRemove colled.");
}

public void setMessageDrivenContext(
MessageDrivenContext messagedrivencontext) throws EJBException {
this.ctx = messagedrivencontext;
}
}

次にejb-jar.xml
<message-driven>
<display-name>QueueMDB</display-name>
<ejb-name>QueueMDB</ejb-name>
<ejb-class>mogo.ReceiverEJB</ejb-class>
<transaction-type>Container</transaction-type>
<message-driven-destination>
<destination-type>javax.jms.Queue</destination-type>
</message-driven-destination>
</message-driven>

次はoepnejb-jar.xml
<ejb-deployment ejb-name="QueueMDB"
deployment-id="QueueMDB"
container-id="MyJmsMdbContainer" >
</ejb-deployment>

さっきのが○○.jarになるやつ。

次はTomcatの設定
context.xml

<Resource
name="jms/ConnectionFactory"
auth="Container"
type="org.apache.activemq.ActiveMQConnectionFactory"
description="JMS Connection Factory"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
brokerURL="failover:(tcp://localhost:61616)"
brokerName="LocalActiveMQBroker"
/>

<Resource
name="jms/QueueMDB"
auth="Container"
type="org.apache.activemq.command.ActiveMQQueue"
description="my Queue"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
physicalName="QueueMDB"
/>

んで web.xml
<resource-ref>
<res-ref-name>jms/aQueue</res-ref-name>
<res-type>javax.jms.Queue</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<resource-ref>
<res-ref-name>jms/someTopic</res-ref-name>
<res-type>javax.jms.Topic</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

<message-destination-ref>
<message-destination-ref-name>jms/QueueMDB</message-destination-ref-name>
<message-destination-type>javax.jms.Queue</message-destination-type>
<message-destination-usage>ConsumesProduces</message-destination-usage>
<message-destination-link>QueueMDB</message-destination-link>
</message-destination-ref>
<message-destination>
<message-destination-name>QueueMDB</message-destination-name>
</message-destination>

最後呼び出し元
public class Copy_2_of_StertServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* <p>
* ステートレス・セッションBeanを作成して処理を委譲する
* </p>
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

PrintWriter out = null;
String res = "残念";

try {
Properties p = new Properties();
p.put("java.naming.factory.initial",
"org.apache.openejb.client.LocalInitialContextFactory");
Context context = new InitialContext(p);

// Connectionを作成するFactoryを作成
QueueConnectionFactory factory = (QueueConnectionFactory) context
.lookup("java:comp/env/jms/ConnectionFactory");
QueueConnection connection = factory.createQueueConnection();

// セッションの作成
QueueSession session = connection.createQueueSession(false,
QueueSession.AUTO_ACKNOWLEDGE);

javax.jms.Queue queue = (Queue) context
.lookup("java:comp/env/jms/QueueMDB");

javax.jms.Topic topic = (Topic) context
.lookup("java:comp/env/jms/someTopic");

//Queue queue1 = session.createQueue("TestQueue");
QueueSender sender = session.createSender(queue);

connection.start();
Message msg = session.createTextMessage("u go i ta");
// メッセージの送信
sender.send(msg);

sender.close();
session.close();
connection.close();

} catch (Exception e) {
System.out.println("Caught exception!");
e.printStackTrace();
}

out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<head>");
out.println("<title>Hello World!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>" + res + "</h1>");
out.println("</body>");
out.println("</html>");
}
}

てけとーにこんな感じ。
動かすには apacheMQ が必要です。
ウソかホントか分からないけど(俺が書いたんだけど…)、適当なコメントつき。だって消すのもめんどいから

<Resource id="MyJmsResourceAdapter" type="ActiveMQResourceAdapter">
# Broker configuration URI as defined by ActiveMQ
# see http://activemq.apache.org/broker-configuration-uri.html

#BrokerXmlConfig
BrokerXmlConfig broker:(tcp://localhost:61616)?useJmx=false
#この記述はムダ ⇒ BrokerXmlConfig failover:(tcp://localhost:61616)?useJmx=false

# Broker address

# 別Serverとして立ち上げるか、OpenEJBに起動を任せるか
#ServerUrl tcp://localhost:61616

# 2011/03/20 vm://localhost の設定にて組み込みモードで ActiveMQ を起動するため、別途 ActiveMQ を起動する必要はありません。
ServerUrl vm://localhost?async=true

# DataSource for persistence messages

DataSource jdbc/MySQL

</Resource>

<Resource id="MyJmsConnectionFactory" type="javax.jms.ConnectionFactory">
ResourceAdapter MyJmsResourceAdapter
</Resource>

<Container id="MyJmsMdbContainer" ctype="MESSAGE">
ResourceAdapter MyJmsResourceAdapter
</Container>

<Resource id="FooQueue" type="javax.jms.Queue" />
<Resource id="QueueMDB" type="javax.jms.Queue" />

<Resource id="BarTopic" type="javax.jms.Topic" />

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

本気で取り組むEJB! 更新情報

本気で取り組むEJB!のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング