初学Message-Driven Bean,想在JBoss上试一下,却发现这真是一个痛苦的过程。
Message-Driven Bean:
import java.io.Serializable;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.MessageDrivenBean;
import javax.ejb.MessageDrivenContext;
import javax.ejb.CreateException;
import javax.naming.*;
import javax.jms.*;
public class LogBean implements MessageDrivenBean,
MessageListener {
private transient MessageDrivenContext mdc = null;
private Context context;
public LogBean() {
System.out.println("In SimpleMessageBean.SimpleMessageBean()");
}
public void setMessageDrivenContext(MessageDrivenContext mdc) {
System.out.println("In "
+ "SimpleMessageBean.setMessageDrivenContext()");
this.mdc = mdc;
}
public void ejbCreate() {
System.out.println("In SimpleMessageBean.ejbCreate()");
}
public void onMessage(Message inMessage) {
TextMessage msg = null;
try {
if (inMessage instanceof TextMessage) {
msg = (TextMessage) inMessage;
System.out.println("MESSAGE BEAN: Message received: "
+ msg.getText());
} else {
System.out.println("Message of wrong type: "
+ inMessage.getClass().getName());
}
} catch (JMSException e) {
e.printStackTrace();
mdc.setRollbackOnly();
} catch (Throwable te) {
te.printStackTrace();
}
} // onMessage
public void ejbRemove() {
System.out.println("In SimpleMessageBean.remove()");
}
} // class
客户端:
TestClient.java
import javax.naming.*;
import javax.jms.*;
import java.util.*;
public class TestClient {
public static void main (String[] args) throws Exception {
// Initialize JNDI
Context ctx = new InitialContext();
// 1: Lookup ConnectionFactory via JNDI
TopicConnectionFactory factory =
(TopicConnectionFactory)
ctx.lookup("ConnectionFactory");
// 2: Use ConnectionFactory to create JMS connection
TopicConnection connection =
factory.createTopicConnection();
// 3: Use Connection to create session
TopicSession session = connection.createTopicSession(
false, Session.AUTO_ACKNOWLEDGE);
// 4: Lookup Desintation (topic) via JNDI
Topic topic = (Topic) ctx.lookup("topic/testTopic");
// 5: Create a Message Producer
TopicPublisher publisher = session.createPublisher(topic);
// 6: Create a text message, and publish it
TextMessage msg = session.createTextMessage();
msg.setText("This is a test message.");
publisher.publish(msg);
}
}
发布过程:
ejb-jar.xml
<?xml version="1.0"?>
<!DOCTYPE ejb-jar>
<ejb-jar>
<enterprise-beans>
<message-driven>
<ejb-name>Log</ejb-name>
<ejb-class>LogBean</ejb-class>
<message-selector></message-selector>
<transaction-type>Bean</transaction-type>
<acknowledge-mode>Auto-acknowledge</acknowledge-mode>
<message-driven-destination>
<destination-type>javax.jms.Topic</destination-type>
</message-driven-destination>
</message-driven>
</enterprise-beans>
</ejb-jar>
jboss.xml
<?xml version="1.0"?>
<jboss>
<enterprise-bean>
<message-driven>
<ejb-name>Log</ejb-name>
<configuration-name>Standard Message Driven Bean</configuration-name>
<destination-jndi-name>topic/testTopic</destination-jndi-name>
</message-driven>
</enterprise-bean>
</jboss>
Log日志:
.....................
2003-04-02 19:48:23,921 INFO [org.jboss.deployment.MainDeployer] Starting deployment of package: file:/F:/jboss/server/default/deploy/ejb-test.jar
2003-04-02 19:48:23,968 INFO [org.jboss.ejb.EjbModule] Creating
2003-04-02 19:48:23,984 INFO [org.jboss.ejb.EjbModule] Deploying Log
2003-04-02 19:48:24,062 INFO [org.jboss.ejb.plugins.jms.JMSContainerInvoker] Creating
2003-04-02 19:48:24,078 INFO [org.jboss.ejb.plugins.jms.JMSContainerInvoker] Created
2003-04-02 19:48:24,078 INFO [org.jboss.ejb.EjbModule] Created
2003-04-02 19:48:24,078 INFO [org.jboss.ejb.EjbModule] Starting
2003-04-02 19:48:24,093 INFO [org.jboss.ejb.plugins.jms.JMSContainerInvoker] Starting
2003-04-02 19:48:24,093 INFO [org.jboss.ejb.plugins.jms.DLQHandler] Creating
2003-04-02 19:48:24,171 INFO [org.jboss.ejb.plugins.jms.DLQHandler] Created
2003-04-02 19:48:24,187 WARN [org.jboss.ejb.plugins.jms.JMSContainerInvoker] destination not found: topic/Log reason: javax.naming.NameNotFoundException: Log not bound<--------错误
2003-04-02 19:48:24,187 WARN [org.jboss.ejb.plugins.jms.JMSContainerInvoker] creating a new temporary destination: topic/Log
2003-04-02 19:48:24,187 INFO [org.jboss.mq.server.jmx.Topic.Log] Creating
2003-04-02 19:48:24,187 INFO [org.jboss.mq.server.jmx.Topic.Log] Created
2003-04-02 19:48:24,187 INFO [org.jboss.mq.server.jmx.Topic.Log] Starting
2003-04-02 19:48:24,187 INFO [org.jboss.mq.server.jmx.Topic.Log] Bound to JNDI name: topic/Log
2003-04-02 19:48:24,203 INFO [org.jboss.mq.server.jmx.Topic.Log] Started
2003-04-02 19:48:24,281 WARN [org.jboss.mq.security.SecurityManager] No SecurityMetadadata was available for Log adding default security conf
2003-04-02 19:48:24,281 INFO [org.jboss.ejb.plugins.jms.DLQHandler] Starting
2003-04-02 19:48:24,296 INFO [org.jboss.ejb.plugins.jms.DLQHandler] Started
2003-04-02 19:48:24,296 INFO [org.jboss.ejb.plugins.jms.JMSContainerInvoker] Started
2003-04-02 19:48:24,296 INFO [org.jboss.ejb.EjbModule] Started
2003-04-02 19:48:24,296 INFO [org.jboss.deployment.MainDeployer] Deployed package: file:/F:/jboss/server/default/deploy/ejb-test.jar
运行结果:
19:52:35,265 WARN [OILServerILService] Connection failure (1).
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:183)
at java.io.BufferedInputStream.read(BufferedInputStream.java:201)
at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java
:2133)
at java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(Object
InputStream.java:2316)
at java.io.ObjectInputStream$BlockDataInputStream.refill(ObjectInputStre
am.java:2383)
at java.io.ObjectInputStream$BlockDataInputStream.read(ObjectInputStream
.java:2455)
at java.io.ObjectInputStream$BlockDataInputStream.readByte(ObjectInputSt
ream.java:2604)
at java.io.ObjectInputStream.readByte(ObjectInputStream.java:845)
at org.jboss.mq.il.oil.OILServerILService$Client.run(OILServerILService.
java:205)
at java.lang.Thread.run(Thread.java:536)
*******************************************************************************************************
jboss.xml,ejb-jar.xml是直接拷贝过来的。对于上面的错误始终不试不得其解,如是就
原封不动的拷贝一个实例,加上UTF-8后竟然上面的错误没有了。心里一阵狂喜,
可是。。。。。。
ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>
<ejb-jar>
<enterprise-beans>
<message-driven>
<ejb-name>Log</ejb-name>
<ejb-class>LogBean</ejb-class>
<message-selector></message-selector>
<transaction-type>Bean</transaction-type>
<acknowledge-mode>Auto-acknowledge</acknowledge-mode>
<message-driven-destination>
<destination-type>javax.jms.Topic</destination-type>
</message-driven-destination>
</message-driven>
</enterprise-beans>
</ejb-jar>
jboss.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss>
<enterprise-beans>
<session>
<ejb-name>Log</ejb-name>
<configuration-name>Standard Message Driven Bean</configuration-name>
<destination-jndi-name>topic/testTopic</destination-jndi-name>
</session>
</enterprise-beans>
</jboss>
Log日志:
..........................
2003-04-02 20:15:57,671 INFO [org.jboss.deployment.MainDeployer] Starting deployment of package: file:/F:/jboss/server/default/deploy/ejb-test.jar
2003-04-02 20:15:57,796 INFO [org.jboss.ejb.EjbModule] Creating
2003-04-02 20:15:57,812 INFO [org.jboss.ejb.EjbModule] Deploying Log
2003-04-02 20:15:57,890 INFO [org.jboss.ejb.plugins.jms.JMSContainerInvoker] Creating
2003-04-02 20:15:57,890 INFO [org.jboss.ejb.plugins.jms.JMSContainerInvoker] Created
2003-04-02 20:15:57,890 INFO [org.jboss.ejb.EjbModule] Created
2003-04-02 20:15:57,890 INFO [org.jboss.ejb.EjbModule] Starting
2003-04-02 20:15:57,906 INFO [org.jboss.ejb.plugins.jms.JMSContainerInvoker] Starting
2003-04-02 20:15:57,906 INFO [org.jboss.ejb.plugins.jms.DLQHandler] Creating
2003-04-02 20:15:57,984 INFO [org.jboss.ejb.plugins.jms.DLQHandler] Created
2003-04-02 20:15:58,093 INFO [org.jboss.ejb.plugins.jms.DLQHandler] Starting<--错误没有了。
2003-04-02 20:15:58,093 INFO [org.jboss.ejb.plugins.jms.DLQHandler] Started
2003-04-02 20:15:58,109 INFO [org.jboss.ejb.plugins.jms.JMSContainerInvoker] Started
2003-04-02 20:15:58,109 INFO [org.jboss.ejb.EjbModule] Started
2003-04-02 20:15:58,109 INFO [org.jboss.deployment.MainDeployer] Deployed package: file:/F:/jboss/server/default/deploy/ejb-test.jar
运行结果:
20:20:15,921 INFO [STDOUT] In SimpleMessageBean.SimpleMessageBean()
20:20:15,937 INFO [STDOUT] In SimpleMessageBean.setMessageDrivenContext()
20:20:15,937 INFO [STDOUT] In SimpleMessageBean.ejbCreate()
20:20:15,937 INFO [STDOUT] MESSAGE BEAN: Message received: This is a test messa
ge.
运行结果出来了,但是还是有错误。
20:20:16,031 WARN [OILServerILService] Connection failure (1).
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:183)
at java.io.BufferedInputStream.read(BufferedInputStream.java:201)
at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java
:2133)
at java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(Object
InputStream.java:2316)
at java.io.ObjectInputStream$BlockDataInputStream.refill(ObjectInputStre
am.java:2383)
at java.io.ObjectInputStream$BlockDataInputStream.read(ObjectInputStream
.java:2455)
at java.io.ObjectInputStream$BlockDataInputStream.readByte(ObjectInputSt
ream.java:2604)
at java.io.ObjectInputStream.readByte(ObjectInputStream.java:845)
at org.jboss.mq.il.oil.OILServerILService$Client.run(OILServerILService.
java:205)
at java.lang.Thread.run(Thread.java:536)
虽然结果出来了,但是还是有下面的错误。唉,没办法了,放一下吧,等熟悉了后在
回来看是什么原因吧。