在JBoss中开发自己的消息驱动Bean

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容器的消息管道。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值