我正在尝试理解与MDB、MQ、JMS相关的概念。在问这个问题之前,我对此做了研究。
这是不是可能的情况:
MDB部署在Application Server上,比如JBOSS (在物理服务器-A上)。
不同物理服务器B上的MQ (比如ApacheMQ)。
那么部署在物理服务器A中的MDB可以从物理服务器B获取消息吗?
如果这是可能的,那么MDB是否使用JMS API?
我听说Jboss有MQ,我假设MQ与Jboss应用程序服务器一起使用;但是,我希望MDB在不同的服务器上,MQ服务器在不同的物理服务器上。
感谢您在理解这一点上的帮助。
发布于 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都是消息传递提供者。
发布于 2015-10-28 01:51:39
一个由远程MQ实例激活的MDB示例:
/**
* 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");
}
}
}发布于 2017-04-20 01:45:14
对于使用Glassfish4 4/Payara服务器的人来说,这相当于@Doug Grove @ResourceAdapter:
@MessageDriven(
name = "foo",
activationConfig = {
@ActivationConfigProperty(propertyName = "resourceAdapter", propertyValue = "activemq-rar-x-x-x"),
:
:当activemq-rar-x-x-x是在AS上部署的ActiveMQ资源适配器时。
致以问候。
https://stackoverflow.com/questions/31192421
复制相似问题