JBoss中先用xml文件定义我们的消息管道
定义规则是后最为XXXXXX-service.xml文件,
我定义为snailteam-service.xml
定义我们的Queue消息管道
name=snailteamQueue
JNDIName queue/snailteam
定义我们的
Topic消息管道
name=snailteamTopic
JNDIName topic/snailteamTopic
如下
<?xml version="1.0" encoding="UTF-8"?> <server> <!-- 在Jboss中用xml定义Queue消息管道,单用户发送,接受为单用户 --> <mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.mq.destination:service=Queue,name=snailteamQueue"> <attribute name="JNDIName">queue/snailteamQueue</attribute> <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends> </mbean> <!-- 在Jboss中用xml定义Topic消息管道,单用户发送,接受可为单用户 --> <mbean code="org.jboss.mq.server.jmx.Topic" name="jboss.mq.destination:service=Topic,name=snailteamTopic"> <attribute name="JNDIName">topic/snailteamTopic</attribute> <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends> </mbean> </server>
放到目录中
Myeclipse中启动JBoss,
控制台观察到如下信息,说明发布成功
[TopicService] Topic[topic/snailteamTopic] started, fullSize=200000, pageSize=2000, downCacheSize=2000
[QueueService] Queue[queue/snailteamQueue] started, fullSize=200000, pageSize=2000, downCacheSize=2000
接着写我们服务端的消息管道监听Bean(消息驱动Bean)
Myeclipse中新建一个EJB项目,
别忘了将JBoss的jar包添加进我们的lib中
package org.snailtea.message;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(activationConfig = {
//propertyValue = "javax.jms.Queue" 用来监听javax.jms.Queue消息
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
//propertyValue = "queue/snailteamQueue" 监听的消息管道
@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/snailteamQueue"),
})
public class MessageDrivenBean implements MessageListener {
public void onMessage(Message message) {
//Message接受到的消息,我们发送的是TextMessage。
TextMessage msg = (TextMessage)message;
try {
//简单的把消息控制台输出
System.out.println(msg.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
同样的步骤,新建一个消息Bean,ReceiveBean
package org.snaiteam.message;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(mappedName = "jms/ReceiveBean", activationConfig = {
//propertyValue = "topic/snailteamTopic" 监听的消息管道
@ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/snailteamTopic"),
//propertyValue = "javax.jms.Topic" 用来监听javax.jms.Topic消息
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic") })
public class ReceiveBean implements MessageListener {
public void onMessage(Message message) {
TextMessage msg = (TextMessage) message;
try {
//简单的打印我们的消息
System.out.println(this.getClass()+msg.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
开发好我们消息驱动Bean了,发布到JBoss容器中
控制台会输出
STARTED EJB: org.snaiteam.message.MessageDrivenBean ejbName: MessageDrivenBean
STARTED EJB: org.snaiteam.message.ReceiveBean ejbName: ReceiveBean
发布成功。
开发我们的客户端,
为了能找到JBossRMI接口
我们需要定义一个jndi.properties文件,src目录下
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost:1099
新建一个类 QueueSender.java
public static void main(String[] args) {
try {
//读取jndi.properties文件中的参数
InitialContext ctx = new InitialContext();
//连接JBoss连接工厂
QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup("ConnectionFactory");
QueueConnection conn = factory.createQueueConnection();
//false不需要事务
QueueSession session = conn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
//查找queue/snailteamQueue消息管道
Destination destination = (Destination)ctx.lookup("queue/snailteamQueue");
MessageProducer producer = session.createProducer(destination);
//向管道发送消息
producer.send(session.createTextMessage("中国小樊"));
//关闭连接会话
session.close();
//关闭连接
conn.close();
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
新建一个类 TopicSender.java
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//读取jndi.properties文件中的参数
InitialContext ctx = new InitialContext();
//连接JBoss连接工厂
TopicConnectionFactory factory = (TopicConnectionFactory)ctx.lookup("ConnectionFactory");
TopicConnection conn = factory.createTopicConnection();
//false不需要事务
TopicSession session = conn.createTopicSession(false,TopicSession.AUTO_ACKNOWLEDGE);//false不需要事务
//查找topic/snailteamTopic消息管道
Destination destination = (Destination)ctx.lookup("topic/snailteamTopic");
MessageProducer producer = session.createProducer(destination);
//向管道发送消息
producer.send(session.createTextMessage("中国小樊"));
session.close();
conn.close();
System.out.println("ok");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
运行,观察我们的控制台,JBoss是否会输出我们发送的消息
我们可以多写几个消息Bean,用来监听JBoss容器的消息管道。