标签: message-driven-bean

消息队列与套接字

我没有太多的套接字编程经验,但我尝试了一下它.我对MDB和消息队列非常熟悉.有人告诉我队列(例如MDB)是"不比直接套接字连接多".有人可以比较这两个对我.

sockets message-queue message-driven-bean websocket

22
推荐指数
2
解决办法
2万
查看次数

如何限制侦听Jboss JMS队列的MDB实例的数量

我遇到以下设置问题:

Java应用程序将电子邮件msg发送到JMS队列,然后侦听队列的MDB使用onMessage方法获取电子邮件msg,它在Gmail SMTP上打开连接,将电子邮件发送到SMTP并关闭连接.对JMS队列中的所有消息执行此操作.

当我在队列中同时拥有最多5条消息时,它工作得很好.5个不同的MDB实例同时拾取所有邮件,因此我有5个并发连接到Gmail SMTP服务器.但是当JMS队列中有更多消息时,我从Gmail SMTP服务器收到连接错误.5个第一个消息是正确发送的,但不是其余的,所以其他消息丢失,因为它们不再在队列中.

所以我的问题是,是否可以限制将侦听JMS队列的MDB实例的数量?如果我最多有5个MDB,那么即使队列中有1000个消息,也只需要更长的时间来清空队列,但至少我不会丢失任何消息.

任何其他建议来解决这个问题将非常感谢.

这是Jboss版本:

[服务器]版本ID:JBoss [Trinity] 4.2.3.GA(build:SVNTag = JBoss_4_2_3_GA date = 200807181417)

MDB的配置如下:

@MessageDriven(activationConfig = {   
  @ActivationConfigProperty( propertyName = "destinationType", propertyValue = "javax.jms.Queue" ),   
  @ActivationConfigProperty( propertyName = "destination", propertyValue = "queue/emailQueue")  
})
Run Code Online (Sandbox Code Playgroud)

你需要更多吗?

谢谢

编辑2011-02-14
也许我想错误地限制MDB实例的数量.我看到了一个关于JMS线程数量的配置.如果我限制将发布到MDB的线程数,也许它会解决我的问题?在再次发布消息之前,JMS是否会等到MDB可用?这样做会有副作用吗?你虽然请.谢谢
结束编辑

jboss jms message-driven-bean ejb-3.0 jboss-4.2.x

15
推荐指数
1
解决办法
1万
查看次数

为什么不使用Session Bean而不是Message Driven Beans?

我想知道,为什么不使用Session Bean而不是Message Driven Beans?

如果您可以从EJB调用远程方法,那么为什么还要使用Message Driven Beans(比会话bean更难开发)来发送/接收消息呢?

Message Driven Beans在哪些场景中变得有用?

ejb session-bean java-ee message-driven-bean

11
推荐指数
1
解决办法
4595
查看次数

JMS使用者和消息驱动Bean(MDB)之间有什么区别

异步JMS(Java消息服务)使用者与实际MDB(消息驱动Bean)之间是否存在任何差异.我看到的唯一区别是MDB类具有@MessageDriven异步JMS使用者没有的注释.

还有我遗失的其他东西?

ejb jms java-ee message-driven-bean java-ee-5

10
推荐指数
1
解决办法
8864
查看次数

JavaEE 6:如何在独立的JMS客户端中注入JMS资源?

我无法javax.jms.ConnectionFactory注入我的独立JMS客户端.我得到一个java.lang.NullPointerExceptionconnectionFactory.createConnection()下面的代码.

JmsClient.java

public class JmsClient {

    @Resource(mappedName="jms/QueueConnectionFactory")
    private static ConnectionFactory connectionFactory;    

    @Resource(mappedName="jms/ShippingRequestQueue")
    private static Destination destination;

    public static void main(String[] args) {        
        try {
            Connection connection = connectionFactory.createConnection();
            connection.start();

            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageProducer producer = session.createProducer(destination);
            ObjectMessage message = session.createObjectMessage();

            ShippingRequestQueue shippingRequest = new ShippingRequestQueue(1, "107, Old Street");

            message.setObject(shippingRequest);
            producer.send(message);
            session.close();
            connection.close();

            System.out.println("Shipping request message sent ..");
        } catch (Throwable ex) {
            ex.printStackTrace();
        }        
    }

}
Run Code Online (Sandbox Code Playgroud)

我使用Glassfish 3.1管理控制台在Open MQ(MoM)上创建了相应的连接工厂和目标资源.

有人能帮我理解我错过了什么吗?

jms message-driven-bean java-ee-6 glassfish-3

9
推荐指数
1
解决办法
1万
查看次数

WebSphere 7中的消息驱动Bean(EJB3),XA事务,错误处理

我是EJB的新手.背景:我有一个使用WebSphere缺省消息传递提供程序的MDB接收具有java.sql.DataSource的MapMessages来做一些工作,使用preparedstatement,jdbc事务等.我在ibm-ejb-bnd.xml中设置了MDB, ejb-jar.xml使用带有激活规范和目标名称的JCA适配器.我在ejb-jar和ibm-ejb-jar-bind中添加了一个java.sql.DataSource.我还在MessageListener中添加了带有@Resource注释的DataSource.

2个场景我无法理解(第一个场景已修复,请参阅更新)......

容器管理的MDB: DataSource驱动程序不兼容XA,因此我在WebSphere中启用了"Last Participant Support".但是,当MDB事务类型设置为Container时,我在提交时收到错误:

[11/28/11 10:56:10:988 MST] 0000002e RegisteredRes E   WTRN0063E: An illegal attempt to commit a one phase capable resource with existing two phase capable resources has occurred.
Run Code Online (Sandbox Code Playgroud)

也许这是因为在DataSource提交之后,返回MessageListener,它提交它作为最后一个参与者?我相信WAS 7中的默认消息传递提供程序是XA兼容的,尽管我没有看到任何明确说明的文档.

在第一个错误之后,消息会立即重新运行4次(即使根据WebSphere中的ActivationSpec应该有30秒的延迟).每次抛出相同的错误.根据MessageListener它完成没有错误,所以这个错误是美妙的隐形容器托管事务的一部分.我不认为我需要XA全局事务,因为除了JMS之外只有一个DataSource,我以编程方式处理事务回滚.此外,JMS消息,MDB是异步的,AUTO-ACKNOWLEDGE.收到消息后,可以确认消息.

如果我引入了一个应用程序错误,所以有一个Exception,我立即看到这个错误5次(没有延迟):

[11/28/11 10:16:18:857 MST] 0000002b LocalExceptio E   CNTR0020E: EJB threw an unexpected (non-declared) exception during invocation of method "onMessage" on bean...
Run Code Online (Sandbox Code Playgroud)

所以我切换到................

Bean托管MDB: 提交正在运行而没有XA错误,只发生一次.但是,错误处理仍然不像我期望或想要的那样!在MessageListener类中,捕获的异常抛出EJB异常,我认为这应该导致MDB具有我想要的行为: 异常的原因对我来说无关紧要,当MDB抛出捕获的异常时,MDB不应该是根据WebSphereActivationSpec中的属性重试? 相反,消息将立即传递给MessageListener 5次,同时抛出与容器管理的MDB相同的错误:"EJB引发了意外(未声明的)异常......"

如果我抛出RuntimeException,则不会发生"未声明(未声明)的消息"消息,但消息仍然会立即重试4次,而不是等待重试延迟.

感谢阅读,非常感谢任何帮助或见解!

更新: 我最终通过将数据源切换到XA兼容来解决XA兼容性问题.在WAS管理控制台中:Resources-> JDBC Providers-> DB2 Universal JDBC Driver Provider->将实现类名更改为:com.ibm.db2.jcc.DB2XADataSource

但是当消息失败时我仍然遇到同样的问题.它会立即重试,而不是根据WAS中的ActivationSpec.

java websphere ejb jms message-driven-bean

8
推荐指数
1
解决办法
5657
查看次数

@MessageDriven事务和重新传递语义

完成以下任务的最佳方法是什么?

  • @MessageDriven bean在数据库上做了一些工作
  • 失败时,我想回滚数据库事务
  • 但是我也希望JMS消息不被重新传递,即不要重新尝试.

我能想到的几个方法可能会工作.还有其他什么,哪个最好?

  • 使用@TransactionManagement(type=BEAN)UserTransaction,并在捕获异常后显式回滚.例如:

    catch (Exception e) { e.printStackTrace(); utx.rollback(); }

  • 使用容器管理的事务,指定@TransactionAttribute(value=NOT_SUPPORTED)onMessage然后委托DB活动与一个单独的方法@TransactionAttribute(value=REQUIRED).

  • 保留事务处理,并在服务器中重新配置重试属性.我正在使用Glassfish 3.1.1,我不确定如何设置它.

  • 保留所有内容并明确检查消息是否在正文中重新发送,onMessage如果重新发送则退出.(message.getJMSRedelivered()?)

什么运作良好?有没有一种标准/最佳实践方法来处理这个问题?

jms glassfish message-driven-bean ejb-3.1 glassfish-3

8
推荐指数
1
解决办法
1819
查看次数

EJB和线程

据我所知,从EJB中生成线程是非法的,因为它可能会干扰EJB的生命周期.但是,使用JDK中的预定义Java类是非法的,它在内部生成并处理EJB中的Executor等线程,特别是MDB?

java ejb java-ee message-driven-bean

7
推荐指数
3
解决办法
2万
查看次数

WebSphere MQ中的消息组

我要求我需要处理JMS消息(通过MDB),使得属于某个组(设置了组ID)的消息被同一个bean实例使用.我在此要求的行为是,顺序处理具有相同组ID的消息(尽管消息排序无关紧要),并将它们绑定到同一个MDB实例应该提供.

消息不带任何类型的序列号(因为它是无关紧要的),我们不知道组中的第一个或最后一个消息是什么(理论上"永远不会"是组中的最后一个消息).我们希望一旦消费者能够接收它们就能交付它们.

ActiveMQ 通过简单地设置JMSXGroupID来提供这个确切的功能(http://activemq.apache.org/message-groups.html).但是,我们必须使用WebSphere MQ.到目前为止,我发现的是,可以收集队列中同一组的消息,并使用MessageSelector接收"组中的最后一条消息"消息,如http://www.ibm.com/中所述. developerworks/websphere/library/techarticles/0602_currie/0602_currie.html.我们更喜欢更清洁的方式(如在ActiveMQ中).有谁知道如何在WebSphere中实现这种行为?

谢谢!

java jms message-driven-bean ibm-mq

7
推荐指数
1
解决办法
2527
查看次数

@RequestScoped将CDI注入@MessageDriven bean

如果我有一个@MessageDriven使用JMS 注入EJB 的请求作用域CDI bean ,如下所示,我可以假设任何给定的Foo实例一次只能由一次onMessage调用使用吗?

换句话说,在下面的例子中,我可以安全地在Foo对象中使用成员变量来跨子例程存储状态,类似于JSF @RequestScoped托管bean吗?

请注意,如果同一个Foo对象从一个onMessage调用顺序循环到下一个调用,则可以,只要每个MessageDrivenBean实例都有自己的Foo实例,这样就可以隔离两个并发处理请求.

 @MessageDriven
 public class MessageDrivenBean implements MessageListener {
    @Inject 
    private Foo foo;

    public void onMessage(Message m) {
      foo.doSomething();
    }
 }

 @Named
 @RequestScoped
 public class Foo {
   private String property;
     public void doSomething() {
       property = ...;
     }
 }
Run Code Online (Sandbox Code Playgroud)

jms java-ee message-driven-bean cdi java-ee-6

6
推荐指数
1
解决办法
3586
查看次数