我正在测试Wildfly16 / JBoss 7.2与ActiveMQ Artemis 2.7的连接。
我已经编写了一个简单的MDB,它可以使用来自远程ActiveMQ Artemis服务器的消息。
我正确获取了有效载荷(文本消息)和CorrelationId,但收到的MessageId为空!这看起来很奇怪,而且非常烦人,因为我想实现请求/回复。
客户端,它能够直接发送/消费/浏览队列。当我使用这个客户端的消息时,我得到了MessageId、CorrelationId和所有我想要的东西。Wildfly 16、17和JBoss 7.2 (我都试过了)上出现了这个问题和一个消息驱动的Bean。
下面是MDB的代码
import java.util.Properties;
import java.util.logging.Logger;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.jboss.ejb3.annotation.ResourceAdapter;
@ResourceAdapter("activemq-ra-remote")
@MessageDriven(name = "JmsTestMDB", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "testReqQueue"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")})
public class WildflyMdb implements MessageListener {
private static final Logger LOGGER = Logger.getLogger(WildflyMdb.class.toString());
public void onMessage(Message rcvMessage) {
TextMessage txtMessage = null;
try {
if (rcvMessage instanceof TextMessage) {
txtMessage = (TextMessage) rcvMessage;
LOGGER.info("Received Message from queue: MessageId=" + rcvMessage.getJMSMessageID() +
", CorrelationId=" + rcvMessage.getJMSCorrelationID() +
", Text='" + txtMessage.getText() + "'");
LOGGER.info("rcvMessage (toString): " + rcvMessage.toString());
} catch (Exception e) {
LOGGER.severe("EXCEPTION:" + e.getMessage());
}
}
当我使用Java客户端发送以下消息时:
测试消息: ID:DEVTEMP-PC-49242-1561392550500-1:1:1:1:1
我从Wildfly中的MDB获得以下日志:
16:23:29,694 INFO [class com.fluide.mdb.WildflyMdb] (Thread-360 (ActiveMQ-client-global-threads)) Received Message from queue: MessageId=null, CorrelationId=CID:20190624180910, Text='This is my test message'
16:23:29,695 INFO [class com.fluide.mdb.WildflyMdb] (Thread-360 (ActiveMQ-client-global-threads)) rcvMessage (toString): ActiveMQMessage[null]:PERSISTENT/ClientMessageImpl[messageID=946860, durable=true, address=testReqQueue,userID=null,properties=TypedProperties[__AMQ_CID=ID:DEVTEMP-PC-49242-1561392550500-0:1,_AMQ_GROUP_SEQUENCE=0,__HDR_BROKER_IN_TIME=1561392550749,_AMQ_ROUTING_TYPE=1,__HDR_ARRIVAL=0,__HDR_REPLY_TO=[0000 0011 6401 000D 7465 7374 5265 7370 5175 6575 65),__HDR_COMMAND_ID=5,JMSCorrelationID=CID:20190624180910,__HDR_PRODUCER_ID=[0000 0039 7B01 0025 4944 3A44 4556 5445 4D50 2D50 432D 3439 3234 322D 3135 ... 31 3339 3235 3530 3530 302D 313A 3100 0000 0000 0000 0100 0000 0000 0000 01),__HDR_MESSAGE_ID=[0000 004C 6E00 017B 0100 2549 443A 4445 5654 454D 502D 5043 2D34 3932 3432 ... 0000 0000 0001 0000 0000 0000 0001 0000 0000 0000 0001 0000 0000 0000 0000),__HDR_DROPPABLE=false]]
正如您所看到的,MessageId
返回为null,这看起来并不正确。有什么想法吗?
发布于 2019-06-25 21:38:19
由于您使用来自activemq-all-5.12.0.jar
的OpenWire协议的独立Java客户端发送消息,并使用Artemis核心协议在Wildfly/EAP上使用MDB接收消息,因此我相信您正在使用ActiveMQ Artemis中的this bug,这会导致使用不同协议发送和接收的消息的消息ID为空。
如果您不想等待2.10.0的发布,那么您可以在独立的Java应用程序中使用Artemis核心JMS客户端实现来解决这个问题。只需放入Artemis客户端jar (从/lib/client目录)并将初始上下文工厂更改为org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
。
发布于 2019-06-25 03:09:10
EAP 7.2是在Artemis 2.x上的,所以你不需要这样做。您可以在子系统级别使用一个简单的、配置良好的池连接工厂:http://wildscribe.github.io/WildFly/16.0/subsystem/messaging-activemq/pooled-connection-factory/index.html
https://stackoverflow.com/questions/56740744
复制相似问题