WebLogic中部署消息驱动Bean_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
4
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2698 | 回复: 3   主题: WebLogic中部署消息驱动Bean        下一篇 
nengqiang.wang
注册用户
等级:中校
经验:1658
发帖:34
精华:0
注册:1970-1-1
状态:离线
发送短消息息给nengqiang.wang 加好友    发送短消息息给nengqiang.wang 发消息
发表于: IP:您无权察看 2015-8-17 10:28:31 | [全部帖] [楼主帖] 楼主

     消息驱动bean是一种通过消息方式为外界提供服务的组件。mdb和它的使用者之间是一种松散耦合的关系:由于mdb组件在使用的过程中,其客户并不拥有mdb组件的远程(程序中并没有将

接口打包引入到客户端)引用,而是直接将消息发送到特定的队列中,因而用户的调用并不强求mdb组件的运行,在mdb组件没有运行的情况下,客户发送的请求数据会临时保存到消息队列中,

当mdb组件加载后,消息队列中的调用消息才能得到处理。java ee规范并没有规定mdb将处理结果返回给消息调用者的方式,但是通常情况下mdb组件是将处理玩的结果以消息方式发送到特定

结果队列中,如果客户程序没有运行,结果会临时存放在消息队列中,直到客户程序启动,结果队列中的消息才能得到处理。mdb可以和两种消息队列关联,如果和Topic型的队列关联,则客户

发送到队列中的消息。会依次广播给所有的mdb组件,所有的mdb组件会得到相同的消息。mdb组件和具体的业务逻辑无关,从特定的消息队列中获得消息,消息内容要在mdb的onMessage方

法中处理,具体的而业务逻辑通常委托给其他的ejb组件。下面就做一个简单的例子。

1 使用Eclipse创建EJB工程

北京联动北方科技有限公司北京联动北方科技有限公司

2 创建消息驱动Bean

北京联动北方科技有限公司北京联动北方科技有限公司

代码:

package com.wnq.mdbBean;
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="connectionFactoryJndiName",propertyValue="jmsfactory"),
      //消息类型
      @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
      @ActivationConfigProperty(propertyName = "destination", propertyValue = "jmstest")
},
//这一句非常重要,给消息驱动Bean定义一个外部访问的JNDI名
mappedName = "jmstest")
public class MdbBean implements MessageListener {
      public MdbBean() {
      }
      public void onMessage(Message message) {
            TextMessage msg=(TextMessage)message;
            try {
                  System.out.println("MyQueueMDBBean被调用了"+msg.getText());
            } catch (JMSException e) {
                  e.printStackTrace();
            }
      }
}


3 客户端


客户端的作用是向weblogicJms发送消息。


package mdbBeanClient;
import java.util.Properties;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class MyQueueMDBBeanClient {
      public static void main(String[] args) throws JMSException {
            String url="t3://127.0.0.1:7001";
            Properties p=new Properties();
            p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
            p.put(Context.PROVIDER_URL, url);
            try {
                  Context context=new InitialContext(p);
                  //获得JMS信息连接队列工厂
                  QueueConnectionFactory connFactory=(QueueConnectionFactory)context.lookup("jmsfactory");
                  //获得JMS信息链接队列
                  QueueConnection qConn=connFactory.createQueueConnection();
                  //产生队列session,设置事务模拟模式为false,自动应答消息接受
                  QueueSession qSession=qConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
                  qConn.start();
                  //获得队列
                  Queue queue=(Queue)context.lookup("jmstest");
                  //创建文本消息
                  TextMessage msg=qSession.createTextMessage("请问你是消息驱动Bean吗?<你终于接收到我的消息了,真的不简单啊,累死宝宝了!>");
                  QueueSender qSender=qSession.createSender(queue);
                  qSender.send(msg);
                  System.out.println("消息已经发送");
            } catch (NamingException e) {
                  e.printStackTrace();
            }
      }
}


4Eclipse截图



北京联动北方科技有限公司

5weblogic控制台截图


北京联动北方科技有限公司

北京联动北方科技有限公司



人们都向往和寻找快乐,其实快乐就是一种心情,秘密隐藏于人的心中。快乐从不曾远离我们,而是我们远离了快乐。原本单纯的心,一旦复杂起来,快乐和幸福就 会远离而去,烦恼和忧愁就会随之而来。






赞(0)    操作        顶端 
nengqiang.wang
注册用户
等级:中校
经验:1658
发帖:34
精华:0
注册:1970-1-1
状态:离线
发送短消息息给nengqiang.wang 加好友    发送短消息息给nengqiang.wang 发消息
发表于: IP:您无权察看 2015-8-17 10:31:13 | [全部帖] [楼主帖] 2  楼

mappedName = "jmstest";这一句代码很重要,为外部应用程序调用提供JNDI名,如果没有的话当你在部署消息驱动Bean时会出现如下错误:

Module named 'mdbBean2' failed to deploy. See Error Log view for more detail.

weblogic.application.ModuleException: Exception preparing module: EJBModule(mdbBean2)

Unable to deploy EJB: MyQueueMDBBean from mdbBean2:

[EJB:011113]Error: The Message Driven Bean 'MyQueueMDBBean(Application: mdbBean2, EJBComponent: mdbBean2)', does not have a message destination configured. The message destination must be set using a message-destination-link, destination-resource-link, destination-jndi-name or a resource-adapter-jndi-name.

Exception received from deployment driver. See Error Log view for more detail.


人们都向往和寻找快乐,其实快乐就是一种心情,秘密隐藏于人的心中。快乐从不曾远离我们,而是我们远离了快乐。原本单纯的心,一旦复杂起来,快乐和幸福就 会远离而去,烦恼和忧愁就会随之而来。






赞(0)    操作        顶端 
arcona
注册用户
等级:少校
经验:1100
发帖:10
精华:0
注册:2015-6-1
状态:离线
发送短消息息给arcona 加好友    发送短消息息给arcona 发消息
发表于: IP:您无权察看 2016-6-17 8:00:55 | [全部帖] [楼主帖] 3  楼

顶一个~



赞(0)    操作        顶端 
duff
注册用户
等级:少校
经验:968
发帖:0
精华:0
注册:2015-7-22
状态:离线
发送短消息息给duff 加好友    发送短消息息给duff 发消息
发表于: IP:您无权察看 2016-6-17 9:02:41 | [全部帖] [楼主帖] 4  楼

学习一下



赞(0)    操作        顶端 
总帖数
4
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论