繁体   English   中英

无法通过Wildfly 10中的默认Artemis / ActiveMQ将消息发送到本地JMS队列

[英]Cannot send message to local JMS Queue over default Artemis/ActiveMQ in Wildfly 10

使用Wildfly 10.1.0.Final和自定义的JMS消息队列,我可以通过JNDI名称为java:/ConnectionFactory的in-vm InVmConnectionFactory成功发送和接收消息。

但是,我无法使用JNDI名称为java:/JmsXA的新的pooled-connection-factory正常工作,消息只是迷路了,并且不会在任何地方显示(还检查了wildfly控制台的运行时JMS服务器视图( Runtime->Subsystems->Messaging - ActiveMQ )。

因为active-mq池连接工厂被标记为DefaultJMSConnectionFactory ,所以使用JMS 2.0 API并通过以下方式简单地注入JMSContext

@Inject
JmsContext jmsContext;

消息发送将无法立即使用

这很奇怪,我发现使用包含Artemis(ActiveMQ)代理的最新wildfly 10配置没有类似问题。

默认情况下,connection-factory定义为事务性的,但这对于我们的方案而言是过大的,所以我将其关闭:

<pooled-connection-factory name="activemq-ra" entries="java:/JmsXA" connectors="in-vm" transaction="none"/>

我检查了Wildfly消息传递配置指南和涵盖JMS 1.1 / 2.0的各种在线示例,但到目前为止没有发现任何线索。

样例代码:

@Startup  // just for a simple test sending a message right on startup
public class MessageService {

    @Inject
    @JMSConnectionFactory("java:/JmsXA")  // activemq-ra pooled-connection-factory
    private JMSContext jmsContext;

    @Resource(lookup = JAVA_JMS_PROGRESS_QUEUE)
    private Queue progressQueue;

    public MessageService() {
    }

    @PostConstruct
    private void init() {
        final JMSProducer jmsProducer = jmsContext.createProducer();
        jmsProducer.send(progressQueue, "Hello queue"));
    }
}

事实证明,即使已经将连接工厂配置为这样,发送消息的方法仍需要声明为非事务处理:

@PostConstruct
@TransactionAttribute(TransactionAttributeType.NEVER)
private void init() {
...

现在工作!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM