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

时间:2017-09-07 14:15:01

标签: configuration jms activemq wildfly

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

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

因为active-mq池连接工厂被标记为DefaultJMSConnectionFactory,所以使用JMS 2.0 API并通过

简单地注入JMSContext
@Inject
JmsContext jmsContext;

消息发送无效开箱即用。

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

默认情况下,connection-factory被定义为 transactional ,但这对我们的场景来说太过分了,所以我将其关闭了:

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

我检查了Wildfly messaging configuration guide和各种在线示例,涵盖了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"));
    }
}

1 个答案:

答案 0 :(得分:0)

结果发送消息的方法仍然需要被声明为非事务性的,即使连接工厂已经配置为:

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

立即行动!