使用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并通过
@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"));
}
}
答案 0 :(得分:0)
结果发送消息的方法仍然需要被声明为非事务性的,即使连接工厂已经配置为:
@PostConstruct
@TransactionAttribute(TransactionAttributeType.NEVER)
private void init() {
...
立即行动!