标签: jms

在提交事务之前传递JMS消息

我有一个非常简单的场景,涉及应用程序服务器(Glassfish)中的数据库JMS.场景很简单:

1. an EJB inserts a row in the database and sends a message.
2. when the message is delivered with an MDB, the row is read and updated. 
Run Code Online (Sandbox Code Playgroud)

问题是有时在数据库中提交插入之前传递消息.如果我们考虑2阶段提交协议,这实际上是可以理解的:

1. prepare JMS
2. prepare database
3. commit JMS
4. ( tiny little gap where message can be delivered before insert has been committed)
5. commit database
Run Code Online (Sandbox Code Playgroud)

和其他人讨论过这个问题,但答案总是如此:"奇怪,它应该开箱即用".

我的问题是:

  • 它怎么能开箱即用?
  • 我的场景听起来很简单,为什么没有更多人遇到类似的麻烦?
  • 难道我做错了什么?有没有办法正确解决这个问题?

以下是关于我对问题的理解的更多细节:

只有在按此顺序处理参与者时才存在此计时问题.如果2PC以相反的顺序(数据库优先,然后是消息代理)处理参与者应该没问题.这个问题是随机发生的,但完全可以重现.

我发现无法在Glassfish文档中控制JTA,JCA和JPA规范中分布式事务中参与者的顺序.我们可以假设它们将在使用它们时按照顺序登记在分布式事务中,但是使用诸如JPA之类的ORM,很难知道何时刷新数据以及何时真正使用数据库连接.任何的想法?

database jms 2phase-commit distributed-transactions java-ee

20
推荐指数
1
解决办法
4249
查看次数

什么是一个很好的基于Java的主从通信机制?

我正在创建一个Java应用程序,它需要JVM之间的主从通信,可能驻留在同一台物理机器上.将在Java EE应用程序服务器(即JBoss)内部运行一个"主"服务器,该服务器将"从"客户端连接到它并动态注册自己进行通信(即主服务器将不知道该服务器的IP地址/端口奴隶因此无法提前配置).主服务器充当控制器,它将向从站执行工作,并且从站将定期响应通知,因此将进行双向通信.

我最初想的是基于RPC的系统,其中每一方都是服务器,但它可能变得复杂,所以我更喜欢一种机制,其中有一个打开的套接字,它们来回交谈.

我正在寻找一种低延迟的通信机制,其中消息主要是原始类型,因此不需要严格的序列化.这是我看过的:

  • RMI
  • JMS:内置于Java,"从"客户端将连接到应用程序服务器中的现有ConnectionFactory.
  • JAX-WS/RS:主服务器和从服务器都是暴露RPC接口以进行双向通信的服务器.
  • JGroups/Hazelcast:使用共享的分布式数据结构来促进沟通.
  • Memcached/MongoDB:使用这些作为"队列"来促进通信,虽然客户端必须轮询,因此会有一些延迟.
  • Thrift:这似乎保持持久连接,但不确定如何将Thrift服务器集成/嵌入JBoss
  • WebSocket/Raw Socket:这可以工作,但需要比我想要的更多自定义代码.

有没有我缺少的技术?

编辑:还看了看:

  • JMX:让客户端连接到JBoss的JMX服务器并接收双向通信的JMX通知.

java rpc jms rmi master-slave

20
推荐指数
2
解决办法
5870
查看次数

JMS性能

从性能角度理解JMS我遇到了一些麻烦.我们在应用程序中有这么简单的代码:

QueueConnection connection = null;
QueueSession session = null;
QueueSender sender = null;
TextMessage msg = null;

try {
  // The JNDIHelper uses InitialContext to look up things
  QueueConnectionFactory qcf = JNDIHelper.lookupFactory();
  Queue destQueue = JNDIHelper.lookupQueue();

  // These objects are created for every message, which is quite slow
  connection = qcf.createQueueConnection();
  session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
  sender = session.createSender(destQueue);

  // This is the actual message
  msg = session.createTextMessage(xmlMsg);
  sender.setTimeToLive(0);
  sender.send(msg);
} 
finally {

  // Close all objects again
  JMSUtilities.safeClose(sender);
  JMSUtilities.safeClose(session);
  JMSUtilities.safeClose(connection); …
Run Code Online (Sandbox Code Playgroud)

java weblogic jms message-queue

20
推荐指数
2
解决办法
8305
查看次数

ACTIVEMQ-发布者订阅者hello world示例

有两个程序:订阅者和发布者...订阅者能够将消息放入主题并且消息成功发送.当我在浏览器上检查activemq服务器时,它显示1 msg排队.但是当我运行消费者代码时,它没有收到消息

这是生产者代码:

import javax.jms.*;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class producer {

    private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;

    public static void main(String[] args) throws JMSException {

        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        Connection connection = connectionFactory.createConnection();
        connection.start();

        // JMS messages are sent and received using a Session. We will
        // create here a non-transactional session object. If you want
        // to use transactions you should set the first parameter to 'true'
        Session session = connection.createSession(false,
                Session.AUTO_ACKNOWLEDGE);

        Topic topic = session.createTopic("testt"); …
Run Code Online (Sandbox Code Playgroud)

java activemq-classic jms jmstemplate

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

死信队列和退出队列有什么区别?

死信队列和退出队列有什么区别?

在WebSphere MQ术语和应用程序服务器方面.

所有J2EE/JEE应用程序服务器都有一个MQ提供程序它们是否也有一个死信队列的构造,或者是特定于WebSphere MQ的东西?

我对退出队列的理解如下:

如果MQ在指定次数的尝试后无法将消息传递到目标,则会将消息移至后退队列.

我对死信队列没有清楚的了解.

感谢任何帮助.

jms java-ee ibm-mq

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

如何确定JMS连接是否存在?

在JMS中,很容易发现连接是否丢失,发生异常.但是我怎么知道连接是否再次存在?

场景:我使用JMS与我的服务器通信.现在我的连接断开(服务器关闭),这导致异常.到现在为止还挺好.如果服务器再次启动并重新建立连接,我该如何知道?

我没有看到任何能够提供此类信息的听众.

java jms

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

如何使用Spring JMS发布JMS主题?

我有一个组件将消息发送到队列以由另一个系统处理.它还应该每隔一段时间发布一个关于工作状态的主题.我可以使用相同的JmsTemplate用于发送到队列并发布到主题吗?

我在ActiveMQ中创建了一个新主题,不过当我从JmsTemplate发送一条消息时,一个带有主题名称的新队列会被发送的消息创建(而不是将数据发送到实际主题),我在这里做错了什么?

这是我的配置:

<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <constructor-arg ref="amqConnectionFactory" />
    <property name="exceptionListener" ref="jmsExceptionListener" />
    <property name="sessionCacheSize" value="100" />
</bean>

<!--  JmsTemplate Definition -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <constructor-arg ref="connectionFactory" />
</bean>


<bean id="messageFacade" class="org.foo.MessageFacadeJms">
    <property name="jmsTemplate" ref="jmsTemplate" />
</bean>
Run Code Online (Sandbox Code Playgroud)

MessageFacadeJms是我用来发送队列消息的类(它可以工作),我还可以用它来发布一个主题吗?

我可以使用它来同时进行队列发送和主题发布吗?:

jmsTemplate.convertAndSend("TOPIC_NAME" /* or queue name */, message);
Run Code Online (Sandbox Code Playgroud)

java spring activemq-classic jms

19
推荐指数
3
解决办法
4万
查看次数

JMS和Web服务之间的区别

我需要开发一个接受订单并返回确认的系统.订单可能来自java或非Java客户端.

不确定是否要使用Web服务实现或JMS.

有什么建议 ...

web-services jms

19
推荐指数
3
解决办法
4万
查看次数

使用Redis实现JMS/AMQP消息传递模式

这个问题是因为我碰到一些提到(如),有关使用邮件软件如ZeroMQ 非常久远的Redis,但我不断听到的Redis本身使用的通讯系统.因此,如果Redis与其他消息传递系统一起使用,那么当它作为消息传递系统使用时,它是否意味着Redis有一些严重的缺陷?

虽然我很清楚使用Redis进行缓存和发布/发布,但目前尚不清楚是否可以使用Redis 代替完整的消息系统,如JMS,AMQP或ZeroMQ.
仅仅依靠标准兼容性方面而只关注功能/特性,Redis是否为消息传递系统所需的所有消息传递模式/模型提供支持?

我所说的消息传递模式是:

  1. RPC/Request-reply( 使用ActiveMQ/JMS 的 示例和使用RabbitMQ/AMQP的另一个示例)
  2. 管道/工作队列(每次消息消耗一次和最多一次)
  3. 广播(每个人都订阅了频道)
  4. 组播(根据消费者的选择器过滤服务器上的消息)
  5. 任何其他消息模式?

如果是,那么Redis似乎同时解决了两个(可能更多)方面:缓存和消息传递.

我在由Java/Java EE服务器支持的Web应用程序的上下文中查看此内容.我不是从概念验证的角度来看这个,而是从大规模的软件开发角度来看.

Edit1:
用户:791406问了一个有效的问题:

"谁在乎redis是否支持这些模式; redis是否能满足您的SLA和QoS需求?"

我认为最好将这个细节作为问题的一部分,而不是在评论部分.

我目前的需求与SLA和QOS关系不大,更多的是选择我的工作(消息)工具,即使我的需求在未来(合理地)增长,我也可以使用.我首先从简单化的要求开始,我们都知道需求往往会增长.和NO,我不是在寻找一个工具,做这一切.我只是想知道Redis是否满足消息系统的预期要求,如ActiveMQ/RabbitMQ.当然,如果我的SLA/QOS需要极端/偏心,我需要一个特殊的工具来满足这一要求.例如:在某些情况下,由于特定的SLA要求,可以通过RabbitMQ选择ZeroMQ.我不是在谈论这种特殊要求.我专注于平均企业要求.

我害怕(基于我的一点理解)尽管redis可以用作当今我的消息传递需求的基本工具,但它可能是未来真正的消息传递工作的错误工具.我有使用ActiveMQ/RabbitMQ等消息传递系统的经验,并且知道它们可以用于简单到(合理)复杂的消息传递需求.

编辑2:

  1. redis网站提到"Redis经常被用作消息服务器"但是如何实现消息传递模式并不清楚.

  2. Salvatore sanfilippo提到Redis用户倾向于将其用作数据库,消息传递总线或缓存.它在多大程度上可以用作"消息传递总线"尚不清楚.

  3. 当我试图找出redis不支持的JMS的消息传递要求时,我遇到了Redis支持但JMS不支持的东西:模式匹配订阅,即客户端可以订阅glob样式模式以接收发送到的所有消息与给定模式匹配的通道名称.

结论:

我决定使用JMS来满足我的消息传递需求,并使用Redis进行缓存.

java messaging jms amqp redis

18
推荐指数
1
解决办法
5546
查看次数

Apache Kafka是JMS的另一个API吗?

是不是Apache Kafka另一个实现JMS

JMS+AMQ在我的应用程序中使用,并迁移到Apache Kafka.我是否需要更改所有JMS代码?

migration jms apache-kafka

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