【问题标题】:Weblogic how to have only one instance/thread of Message driven beanWeblogic如何只有一个消息驱动bean的实例/线程
【发布时间】:2017-01-03 23:57:26
【问题描述】:

在 Weblogic 12c 中,我怎样才能只有一个消息驱动 bean 的实例/线程。

我找不到此处定义的“max-beans-in-free-pool”的等效注释属性 https://docs.oracle.com/cd/E24329_01/web.1211/e24977/summary.htm#WLMDB1385

Java 代码:-

    @MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "connectionFactoryJndiName", propertyValue = "jms/myConnectionFactory"),
        @ActivationConfigProperty(propertyName = "destinationJndiName", propertyValue = "jms/myQueue"),
        @ActivationConfigProperty(propertyName = "MaxPoolSize", propertyValue = "1") })
public class JayMDB implements MessageListener {

额外参考:https://docs.oracle.com/cd/E24329_01/web.1211/e24390/mdbtuning.htm#PERFM271

【问题讨论】:

  • 这似乎是一个瓶颈。在请求涌入的高峰期,您为什么不想要一个更大的池?
  • 你试过了吗?可能适用于 WLS 12c stackoverflow.com/questions/8939292/…
  • @Filip 谢谢伙计,我会试试的。实际上我没有使用 weblogic-application.xml 并且没有使用任何 xml 并且只使用了所有注释。希望我能够混合使用 xml 和注释。
  • @duffymo 谢谢。我明白。但另一方面,如果我们抽取并发调用,第三方 SOAP Webservices api 会出现死锁错误......因此试图一次限制一个调用。
  • Web 服务应该是无状态和幂等的。我会调查死锁并修复它,而不是让调速器阻碍你的系统。

标签: java ejb weblogic12c message-driven-bean


【解决方案1】:

您是否尝试过与 weblogic 的 workmanagers 合作? 从管理控制台 -> 创建一个,将 1 分配给新的最大线程容量约束并将其分配给您的工作经理。在您的 MDB 中使用此工作管理器(例如在您的 weblogic-ra.xml 中设置)。

在这种情况下,您的 MDB 所针对的节点将只有一个线程。

【讨论】:

    【解决方案2】:

    感谢大家的投入,是的,我通过工作管理器和 max-beans-in-free-pool、maxSession 属性的组合解决了这个问题。这是我的完整代码,供以后需要的人使用。

    weblogic.xml

    <?xml version='1.0' encoding='UTF-8'?>
    <weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.6/weblogic-web-app.xsd">
      <session-descriptor></session-descriptor>
      <jsp-descriptor></jsp-descriptor>
      <container-descriptor></container-descriptor>
      <work-manager>
        <name>WorkManager-MDB</name>
        <max-threads-constraint>
          <name>MaxThreadsConstraint-MDB</name>
          <count>1</count>
        </max-threads-constraint>
      </work-manager>
    </weblogic-web-app>
    

    weblogic-ejb-jar.xml

    <?xml version='1.0' encoding='UTF-8'?>
    <weblogic-ejb-jar xmlns="http://xmlns.oracle.com/weblogic/weblogic-ejb-jar"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-ejb-jar http://www.oracle.com/technology/weblogic/weblogic-ejb-jar/1.1/weblogic-ejb-jar.xsd">
    
        <weblogic-enterprise-bean>
            <ejb-name>JayMDB</ejb-name>
    
            <message-driven-descriptor>
                <pool>
                    <max-beans-in-free-pool>1</max-beans-in-free-pool>
                </pool>
            </message-driven-descriptor>
        </weblogic-enterprise-bean>
    
    </weblogic-ejb-jar>
    

    消息驱动 Bean

    @MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "connectionFactoryJndiName", propertyValue = "jms/myConnectionFactory"),
    @ActivationConfigProperty(propertyName = "destinationJndiName", propertyValue = "jms/myQueue"),
    @ActivationConfigProperty(propertyName = "maxSession", propertyValue = "1")})
    public class JayMDB implements MessageListener {
    

    【讨论】:

      猜你喜欢
      • 2014-08-23
      • 2015-04-05
      • 2014-03-15
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2014-08-26
      相关资源
      最近更新 更多