3.开发Java消息驱动bean实例代码

时间:2022-06-12 10:54:30
java消息服务(JMS)是用于访问企业消息系统的开发商中立的API。企业消息系统可以协助应用软件通过网络进行消息交互。
应用程序A发送一条消息到消息服务器的某个目的地(Destination),然后消息服务器把消息转发给应用程序B。程序A和程序B没有直接的代码关联,两种实现了解偶。 消息传递系统的中心就是消息,一条Message由三个部分组成:头,属性,主体
消息有下面几种类型,他们都是派生自Message接口
StreamMessage:一种主体中包含java基元流的消息。其填充和读取均按顺序进行
MapMessage:一种主体中包含一组键值对的消息,没有定义条目顺序
TextMessage:一种主体中包含java字符串的消息(json/xml/...)
ObjectMessage:一种主体中包含序列化java对象的消息
BytesMessage:一种主体中包含字节流的消息 消息传递模型
点对点(PTP):规定了一条消息只能传递给一个接收方,采用java.jms.Queue
发布/订阅(PUB/SUB)一条消息传递给多个接收方,采用java.jms.Topic
这两个都继承自java.jms.Destination 用途
支持异步通信、消息produce和recept松耦合 
发送者把消息发送到服务器的消息队列中,接收者一一进行处理
此功能可以用在不着急将结果返回给用户的情况下,如发送电子邮件等,有助于减缓服务器的压力,尤其是在高并发的情况下。
1.配置消息目标地址
将此配置文件放入jboss-4.2.3.GA\server\default\deploy目录下,名字为 ***-service.xml(以-service.xml结尾)
<?xml version="1.0" encoding="UTF-8"?>
<server>
<!--配置点对点消息传送模型(Queue)-->
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=myQueue">
<!--name=myQueue:目标地址的名称,这里可能会出现因为名字起的不合理,jboss报错的情况,名字一定不要和jboss内部的冲突 -->
<!--queue/tQueue:目标地址的JDNI名称 -->
<attribute name="JNDIName">queue/tQueue</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean> <!--配置发布/订阅传递模型(Topic)-->
<mbean code="org.jboss.mq.server.jmx.Topic" name="jboss.mq.destination:service=Queue,name=myTopic">
<attribute name="JNDIName">topic/tTopic</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
</server>
新建一个普通java项目,把jboss-4.2.3.GA\client下的所有jar包导入
2.开发点对点接收者

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={
@ActivationConfigProperty
(propertyName="destinationType",propertyValue="javax.jms.Queue"), //java.jms.Queue表明是点对点模式
@ActivationConfigProperty
(propertyName="destination",propertyValue="queue/tQueue") // queue/tQueue对应配置文件中的JNDI名称
}
)
public class QueueMessageDrivenBean implements MessageListener{//必须实现MessageListener接口 @Override
public void onMessage(Message msg) {
TextMessage txtmsg = (TextMessage)msg;
try{
System.out.println("Queue 获取到信息:"+txtmsg.getText());
}catch(JMSException e){
e.printStackTrace();
}
} }
3.开发发布/订阅接收者,在这里可以创建多个实现类,内容都如下所示
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={
@ActivationConfigProperty
(propertyName="destinationType",propertyValue="javax.jms.Topic"),
@ActivationConfigProperty
(propertyName="destination",propertyValue="topic/tTopic")
}
)
public class TopicMessageDrivenBean1 implements MessageListener{ @Override
public void onMessage(Message msg) {
TextMessage txtmsg = (TextMessage)msg;
try{
System.out.println("topic1 获取到信息:"+txtmsg.getText());
}catch(JMSException e){
e.printStackTrace();
}
} }

3.开发Java消息驱动bean实例代码

到这里,两种类型的接收者已经写好了,只需要将他们打成jar包,放入jboss-4.2.3.GA\server\default\deploy目录下即可

下面开始开发发送者

在src目录下新建文件jndi.properties
内容如下 java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=127.0.0.1:
点对点消息发送者
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.naming.InitialContext; public class QueueSender { public static void main(String[] args) {
QueueConnection queueConn = null;
QueueSession session = null;
try{
InitialContext ctx = new InitialContext();
QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory)ctx.lookup("QueueConnectionFactory");
queueConn = queueConnectionFactory.createQueueConnection();
session = queueConn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); //javax.jms.Destination是javax.jms.Queue和javax.jms.Topic的父类
Destination destination = (Destination)ctx.lookup("queue/tQueue");
MessageProducer producer = session.createProducer(destination);
producer.send(session.createTextMessage("Queue Test ..测试。。。"));
//把消息发送到服务器上对应的jndi的消息队列中
//用于做异步,像邮件发送
System.out.println("发送完毕!");
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(session != null){
session.close();
}
if(queueConn != null){
queueConn.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
} }
发布/订阅消息发送者
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.naming.InitialContext; public class TopicSender { public static void main(String[] args) {
QueueConnection queueConn = null;
QueueSession session = null;
try{
InitialContext ctx = new InitialContext();
QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory)ctx.lookup("QueueConnectionFactory");
queueConn = queueConnectionFactory.createQueueConnection();
session = queueConn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); //javax.jms.Destination是javax.jms.Queue和javax.jms.Topic的父类
Destination destination = (Destination)ctx.lookup("topic/tTopic"); MessageProducer producer = session.createProducer(destination);
producer.send(session.createTextMessage("Topic Test ..测试。。。"));
//把消息发送到服务器上对应的jndi的消息队列中
//用于做异步,像邮件发送
System.out.println("发送完毕!");
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(session != null){
session.close();
}
if(queueConn != null){
queueConn.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
} }

下面进行测试:

启动jboss,首先确保消息目标地址配置文件和消息接受者的jar包已经放入了jboss的deploy目录下

测试点对点,运行QueueSender.java

3.开发Java消息驱动bean实例代码

测试发布/订阅,运行TopicSender.java

3.开发Java消息驱动bean实例代码

测试通过。。