我正在尝试理解与MDB,MQ,JMS相关的概念。在提出这个问题之前,我对SO进行过研究。
这是可能的情况:
部署在Application Server上的MDB,比如JBOSS(在物理Server-A上)。
差异物理服务器-B上的MQ(比如ApacheMQ)。
部署在物理服务器A中的MDB可以从物理服务器-B获取消息吗?
如果可以,那么MDB是否使用JMS API' s?
我听说过Jboss有MQ,我认为MQ与Jboss应用服务器有关;但是我想在不同的服务器上使用MDB,在不同的物理服务器上使用MQ服务器。
感谢您帮助理解这一点。
答案 0 :(得分:3)
这有4个实际部分。
1)您的申请。 MDB是一个实现J2EE消息驱动Bean API的应用程序,它最简单的形式意味着它具有onMessage()函数,当消息到达时,它将由应用程序服务器调用。
2)J2EE应用服务器JBOSS就是一个例子。它从MQ客户端接收消息,并将它们转发到MDB。
3)MQ客户端。这是由MQ提供程序(IBM / Apache / etc)编写的代码,它实现了J2EE的JCA RA和JMS部分。应用程序可以通过JMS与此客户端交互以发送和获取消息,但是当您作为MDB进行交互时,您将通过onMessage()方法进行驱动。该客户端将消息传递给驱动应用程序的应用程序服务器。
4)MQ服务器。 IBM MQ将其称为“队列管理器”,这可以存在于任何地方。来自#3的客户端将通过网络连接到队列管理器。
#1,#2和#3需要位于同一台物理计算机上(并在同一个JVM中运行)。 #4可以是通过网络访问的任何地方。
解决您的观点:
部署在物理服务器A中的MDB可以从物理服务器-B获取消息吗?
是
如果可以,那么MDB是否使用JMS API?
MDB由应用服务器使用J2EE API驱动,JMS只是其中的一部分。
顺便说一下,'MQ'是产品的名称而不是概念。通用名称是“Messaging Provider”。 IBM MQ和ApacheMQ都是消息传递提供者。
答案 1 :(得分:0)
由远程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");
}
}
}
答案 2 :(得分:0)
对于使用Glassfish4 / Payara-Server的人来说,这相当于["2017-04-19 9:00","2017-04-19 10:30:00"),
["2017-04-19 11:30:00","2017-04-19 12:30:00")
@Doug Grove
:
@ResourceAdapter
activemq-rar-x-x-x 是在AS部署的 ActiveMQ资源适配器。
问候。