我正在测试Wildfly16/jboss 7.2与ActiveMQ Artemis 2.7的连通性。
我写了一个简单的MDB,它可以从远程ActiveMQ Artemis服务器中消耗消息。
我正确地获得有效载荷(文本消息(和corserRealationID,但是接收到的messageID为null!这看起来很奇怪,很烦人,因为我想实现请求/回复。
- 要启用从野生蝇到外部ActiveMQ Artemis服务器的访问,我遵循了31.3中指示的步骤。配置Artemis资源适配器以连接到Red Hat Jboss AMQ 7.
- 我创建了一个简单的Java客户端,能够直接发送/消费/浏览队列。当我与此客户端一起发送消息时,我会得到MessageID,corseralationID和所有我期望的东西。
- 这个问题出现在Wildfly 16、17和JBOSS 7.2上的消息驱动的bean(我已经尝试过(。
- 我在Wildfly上部署的MDB的罐子没有依赖性(6KB(
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客户端发送以下消息时:
- messageID:ID:DEVTEMP-PC-49242-1561392550500-1:1:1:1:1:1
- CORERELATIONID:CID:20190624180910
- 短信:'这是我的测试消息'
我从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 ,看起来不正确。有什么想法吗?
由于您使用activemq-all-5.12.0.jar
的OpenWire协议与独立的Java客户端发送消息,并使用Artemis Core controm在Wildfly/EAP上接收消息在ActiveMQ Artemis中击中此错误,该错误导致已发送和接收不同协议的消息使消息ID无效。已经发送了一个拉值,因此应将问题定为2.10.0。
如果您不想等待2.10.0发布,则可以通过使用独立的Java应用程序使用Artemis Core JMS客户端实现来解决问题。只需放入Artemis客户端JAR(从< artemis_home>/lib/client目录(中,然后将初始上下文工厂更改为 org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
。
EAP 7.2在Artemis 2.x上,因此您不必那样做。您可以在子系统级别上使用简单配置良好的合并connection-factory:http://wildscribe.github.io/wildfly/16.0/subsystem/messaging-messaging-messaging-activemq/pooled-connection-connection-connection-connection-connection-factory/index.htex.htex.htex.htex.htex.html