我正在使用一个新的Glassfish安装,只需很少的自定义.
我有一个消息驱动Bean(ObjectUpdateMDB),它监听一个主题,然后更新它在数据库中收到的对象.有很多对象正在更新.经过一段时间的运行后,我得到了这个例外:
SEVERE: JTS5031: Exception [org.omg.CORBA.INTERNAL: vmcid: 0x0 minor code: 0 completed: Maybe] on Resource [rollback] operation. SEVERE: MDB00049: Message-driven bean [Persistence:ObjectUpdateMDB]: Exception in postinvoke : [javax.transaction.SystemException: org.omg.CORBA.INTERNAL: JTS5031: Exception [org.omg.CORBA.INTERNAL: vmcid: 0x0 minor code: 0 completed: Maybe] on Resource [rollback] operation. vmcid: 0x0 minor code: 0 completed: No] SEVERE: javax.transaction.SystemException javax.transaction.SystemException: org.omg.CORBA.INTERNAL: JTS5031: Exception [org.omg.CORBA.INTERNAL: vmcid: 0x0 minor code: 0 completed: Maybe] on Resource [rollback] operation. vmcid: 0x0 minor code: 0 completed: No at com.sun.jts.jta.TransactionManagerImpl.rollback(TransactionManagerImpl.java:350) at com.sun.enterprise.distributedtx.J2EETransactionManagerImpl.rollback(J2EETransactionManagerImpl.java:1144) at com.sun.enterprise.distributedtx.J2EETransactionManagerOpt.rollback(J2EETransactionManagerOpt.java:426) …
我正在尝试使用此方法在EJB3应用程序中接收邮件.简而言之,这意味着使用以下注释创建MDB:
@MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "mailServer", propertyValue = "imap.company.com"),
@ActivationConfigProperty(propertyName = "mailFolder", propertyValue = "INBOX"),
@ActivationConfigProperty(propertyName = "storeProtocol", propertyValue = "imap"),
@ActivationConfigProperty(propertyName = "debug", propertyValue = "false"),
@ActivationConfigProperty(propertyName = "userName", propertyValue = "username"),
@ActivationConfigProperty(propertyName = "password", propertyValue = "pass") })
@ResourceAdapter("mail-ra.rar")
@Name("mailMessageBean")
public class MailMessageBean implements MailListener {
public void onMessage(final Message msg) {
...snip...
}
}
Run Code Online (Sandbox Code Playgroud)
我有这个工作,但情况不太理想:主机名,用户名和密码是硬编码的.如果没有使用ant和build.properties在编译之前替换这些值,我不知道如何外化它们.
使用MBean是理想的,但我不知道如何从MBean获取值到MDB配置.
我该怎么做?
我希望有人可以帮助我 - 我在基于EJB/JMS的应用程序中使用JBoss 5.1和MQ Series 7.我的应用程序中有几个消息驱动的bean,每个bean都在MQ Series消息队列上进行监听.当在处理消息期间遇到错误时,我需要能够配置"重试延迟",以便mq系列在尝试重新传递消息之前等待一段时间.我已经广泛地梳理了MQ系列文档,并且还没有找到在MQ系列中实现这一目标的方法.我知道JBoss默认的JMS提供程序有办法实现这一点,但我目前仅限于使用MQ Series.由于我无法设置重试延迟 - 当我的消息失败时,我的应用程序会陷入紧急循环,传递消息并不断回滚.任何人都可以帮助我理解MQ系列中是否有一些配置选项允许我在重新发送失败的消息之前等待X毫秒?
我需要在Java中动态创建异步消息队列.我的用例是通过多个SMTP服务器发送电子邮件:我需要按顺序强制执行相同SMTP服务器的电子邮件,但可以同时处理发送到不同SMTP服务器的电子邮件.我以前使用过JMS,但据我所知它只允许编译时队列创建,而我需要在运行时创建队列(每个SMTP服务器一个队列).
我是否遗漏了有关JMS的内容,或者是否有其他工具/建议我应该查看一下?
我在一个数据处理应用程序上工作,通过在消息驱动bean(MDB)的多个实例监听的消息队列上放置几个工作单元来实现并发.除了以这种方式实现并发之外,我们没有任何具体的理由使用消息传递基础结构和MDB.
这让我想到为什么使用多线程无法实现同样的目标.
所以我的问题是,在什么情况下,异步消息传递(例如JMS)可以用作替代mutithreading作为实现并发的手段?使用一种方法比另一种方法有什么优点/缺点.
我按照这个链接并将ActiveMq 5.6与JBoss eap 6.3集成在一起.我想在我的poc项目中使用MDB.虽然战争部署成功,但onMessage()方法不会被解雇.
QueueName:employee_q
MDB,
package com.test.oms.mdb;
import java.util.logging.Logger;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;
import org.jboss.ejb3.annotation.ResourceAdapter;
import com.test.oms.entity.Employee;
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue.employee_q") })
@ResourceAdapter("activemq-ra.rar")
public class QueueListener implements MessageListener {
private final static Logger LOGGER = Logger.getLogger(QueueListener.class
.toString());
@Override
public void onMessage(Message rcvMessage) {
LOGGER.info("____________OnMessage fired______________");
Employee emp = null;
if (rcvMessage instanceof Employee) {
emp = …
Run Code Online (Sandbox Code Playgroud) 我最近发现了消息选择器
@ActivationConfigProperty(
propertyName="messageSelector",
propertyValue="Fragile IS TRUE")
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何在运行时使选择器动态化?
让我们说消费者决定他们只想要属性为"Fragile IS FALSE"的消息
消费者可以在不重新部署MDB的情况下以某种方式更改选择器吗?
注意:我使用的是Glassfish v2.1
我们有一个使用消息驱动bean处理JMS消息的应用程序.此应用程序部署在OC4J应用程序服务器上.(10.1.3)
我们计划在多个OC4J应用程序服务器上部署此应用程序,这些服务器将配置为在群集中运行.
问题在于此群集中的JMS消息处理.我们必须确保一次只在整个OC4J集群中处理单个消息.这是必需的,因为必须按时间顺序处理消息.
您是否知道可以控制跨OC4J集群的消息处理的配置参数?
或者您认为我们必须实现自己的同步代码,以便在群集中同步消息驱动的bean吗?
我在我的应用程序中使用Jboss MQ.
我正在尝试处理重新传递给JMS队列的消息.有没有办法可以在消费者收到的原始消息中设置一些值(第一次收到消息)这样每当重新传递消息时,我都可以读取值并做出一些决定.
如果问题不明确,请告诉我,我可以尝试详细解释.
JBoss:6或7
问题1:
Jboss创建了多少个消息驱动 Bean 实例来处理消息?
问题2:
如何配置JBoss创建的消息驱动 Bean 的数量?
在我们的项目中,我们正在使用一个 MDB 来侦听特定队列上的消息。它被定义为注释。
例子:
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "maxSessions", propertyValue = "20")})
Run Code Online (Sandbox Code Playgroud)
.
为了更改 maxSessions 的值,每次都必须编译代码。即使我在 ejb-jar.xml 中配置它而不是作为注释,我也需要编译代码并生成 EAR 文件。
有没有办法让它用户可配置(从属性文件中读取),以便不需要重新编译代码,只需将 maxSession 值更改为“30”并重新启动 jboss,它应该可以工作。
请帮忙。
参考代码:
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "ABCQueue"),
@ActivationConfigProperty(propertyName = "maxSessions", propertyValue = "20"), @ActivationConfigProperty(propertyName="maxMessagesPerSessions",propertyValue="15")})
public class ABCMDB implements MessageListener
{
-----------
}
Run Code Online (Sandbox Code Playgroud) 我们刚刚开始构建我们的JMS体系结构并具有以下基本设置:
现在,MDB在新消息到达时生成一个工作线程,即使我们按顺序传递消息,我们也需要一个同步机制,以便线程在同时处理请求之前检查某个条件.
这些线程有没有办法共享数据?或者我们可以用于同步的其他机制(数据库表/行锁除外)吗?
提前致谢.
为了澄清,我不是在创建自己的线程.正如每个人都正确指出的那样,容器就是为我做的.让我用一个例子帮助解释我的困境.
-Message A到达t = 0,'创建'数据id 1
- 消息B到达t = 0.1,其'更新'数据id 1
现在假设容器产生2个工人来处理A和B,并且"创建"数据比花费更多时间需要更多时间,更新将更早地处理并且不起作用.
为了更清楚,
- 处理消息B时,我会在t = 1时查找数据id 1(找不到它,因此没有做任何事情就完成了).
- 在t = 2处理消息A时将创建数据ID 1.
我正在寻找一个JBoss MQ教程(在JBoss工具上),这样我就可以编写一个MDB和一个客户端.我只能找到JBoss Messaging.