首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >消息驱动bean (MDB)可以监听“外部”MQ吗?

消息驱动bean (MDB)可以监听“外部”MQ吗?
EN

Stack Overflow用户
提问于 2015-07-03 02:52:25
回答 3查看 1.7K关注 0票数 0

我正在尝试理解与MDB、MQ、JMS相关的概念。在问这个问题之前,我对此做了研究。

这是不是可能的情况:

MDB部署在Application Server上,比如JBOSS (在物理服务器-A上)。

不同物理服务器B上的MQ (比如ApacheMQ)。

那么部署在物理服务器A中的MDB可以从物理服务器B获取消息吗?

如果这是可能的,那么MDB是否使用JMS API?

我听说Jboss有MQ,我假设MQ与Jboss应用程序服务器一起使用;但是,我希望MDB在不同的服务器上,MQ服务器在不同的物理服务器上。

感谢您在理解这一点上的帮助。

EN

回答 3

Stack Overflow用户

发布于 2015-07-12 01:01:30

这里有4个真实的部分。

1)你的申请。MDB是实现J2EE消息驱动Bean API的应用程序,其最简单的形式意味着它有一个onMessage()函数,当消息到达时,应用程序服务器将调用该函数。

2)以J2EE应用服务器JBOSS为例。这将从MQ客户端接收消息,并将它们转发到MDB。

3) MQ客户端。这是由实现J2EE的JCA、RA和JMS部分的MQ提供程序(IBM/Apache/etc)编写的代码。应用程序可以通过JMS与这个客户端进行交互,以放入和获取消息,但是当您作为MDB进行交互时,您将通过onMessage()方法进行驱动。此客户端将消息传递给驱动应用程序的应用程序服务器。

4) MQ服务器。IBM MQ将其称为“队列管理器”,它可以存在于任何地方。来自#3的客户机将通过网络连接到队列管理器。

#1、#2和#3需要在相同的物理机上(并且在相同的JVM中运行)。#4可以在任何地方,因为它可以通过网络访问。

要解决您的观点:

那么部署在物理服务器A中的MDB可以从物理服务器B获取消息吗?

如果这是可能的,那么MDB是否使用JMS API?

MDB由应用服务器使用JMS驱动,J2EE只是其中的一部分。

顺便说一句,“MQ”是产品的名称,而不是一个概念。通用名称是“消息传递提供程序”。IBM MQ和ApacheMQ都是消息传递提供者。

票数 3
EN

Stack Overflow用户

发布于 2015-10-28 01:51:39

一个由远程MQ实例激活的MDB示例:

代码语言:javascript
复制
/**
 * WebSphereMQ.java
 * 
 * Created on Sep 21, 2012, 9:11:29 AM
 *
 * To the extent possible under law, Red Hat, Inc. has dedicated all copyright to this 
 * software to the public domain worldwide, pursuant to the CC0 Public Domain Dedication. This 
 * software is distributed without any warranty.  
 *
 * See <http://creativecommons.org/publicdomain/zero/1.0/>.
 *
 */
package org.jboss.sample.mq;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.MessageDriven;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.jboss.ejb3.annotation.Pool;
import org.jboss.ejb3.annotation.ResourceAdapter;
import org.jboss.logging.Logger;

/**
 * 
 */
@MessageDriven(name = "WebSphereMQ", activationConfig = {
        @ActivationConfigProperty(propertyName = "maxPoolDepth", propertyValue="100"),
        @ActivationConfigProperty(propertyName = "maxMessages", propertyValue="1"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "hostName", propertyValue = "10.0.0.150"),
        @ActivationConfigProperty(propertyName = "port", propertyValue = "1414"),
        @ActivationConfigProperty(propertyName = "userName", propertyValue = "redhat"),
        @ActivationConfigProperty(propertyName = "password", propertyValue = "redhat"),
        @ActivationConfigProperty(propertyName = "channel", propertyValue = "SYSTEM.DEF.SVRCONN"),
        @ActivationConfigProperty(propertyName = "queueManager", propertyValue = "REDHAT.QUEUE.MANAGER"),
        @ActivationConfigProperty(propertyName = "useJNDI", propertyValue = "true"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/queue/gssQueue"),
        @ActivationConfigProperty(propertyName = "transportType", propertyValue = "CLIENT") })

@Pool(value="MQpool") 
@ResourceAdapter(value="wmq.jmsra.7.5.0.4.rar")
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class WebSphereMQ implements MessageListener {
    private static final Logger logger = Logger.getLogger(WebSphereMQ.class);

    /*
     * (non-Javadoc)
     * 
     * @see javax.jms.MessageListener#onMessage(javax.jms.Message)
     */
    public void onMessage(Message message) {
        try {
            logger.info("Received message: " + message.getJMSMessageID() + " : " + ((TextMessage)message).getText());

            try {           
                Thread.sleep(10000);
            } catch(Exception e) {
                logger.info("interrupted");
            }               
    }
}
票数 0
EN

Stack Overflow用户

发布于 2017-04-20 01:45:14

对于使用Glassfish4 4/Payara服务器的人来说,这相当于@Doug Grove @ResourceAdapter

代码语言:javascript
复制
@MessageDriven(
  name = "foo",
  activationConfig = {
     @ActivationConfigProperty(propertyName = "resourceAdapter", propertyValue = "activemq-rar-x-x-x"),
:
:

activemq-rar-x-x-x是在AS上部署的ActiveMQ资源适配器时。

致以问候。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31192421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档