无法通过Wildfly中默认的Artemis/ActiveMQ向本地JMS队列发送消息10
问题描述:
使用Wildfly 10.1.0.Final和定制的JMS消息队列,我可以通过in-vm InVmConnectionFactory
成功发送和接收消息,JNDI名称为java:/ConnectionFactory
。无法通过Wildfly中默认的Artemis/ActiveMQ向本地JMS队列发送消息10
但是,我不能得到新的pooled-connection-factory
使用JNDI名称java:/JmsXA
工作,消息只是迷路,不要在任何地方显示出来(也检查了wildfly控制台的运行时JMS服务器视图(Runtime->Subsystems->Messaging - ActiveMQ
)。
因为active-mq
池连接工厂被标记为DefaultJMSConnectionFactory
,使用JMS 2.0 API和简单地通过注入JMSContext
@Inject
JmsContext jmsContext;
消息发送将不起作用开箱。
这很奇怪,我发现最近使用包含Artemis(ActiveMQ)代理的wildfly 10配置没有类似的问题。
连接工厂被定义为事务默认情况下,但是这是矫枉过正我们的场景,所以我切换它关闭:
<pooled-connection-factory name="activemq-ra" entries="java:/JmsXA" connectors="in-vm" transaction="none"/>
我检查覆盖JMS 1.1 /的Wildfly messaging configuration guide和各种网上的例子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() {
...
现在工作!