标签: jms

始终确保 ActiveMQ 主题中只有最后 10 条消息

我们在 ActiveMQ 中遇到了一个问题,我们有大量的消息没有脱离主题。主题设置为非持久性、非持久性。我们的 Activemq.xml 文件是

<beans>

  <broker xmlns="http://activemq.apache.org/schema/core" useJmx="false" persistent="false">

<!--
    <persistenceAdapter>
      <journaledJDBC journalLogFiles="5" dataDirectory="../data"/>
    </persistenceAdapter>
-->

        <transportConnectors>
            <transportConnector uri="vm://localhost"/>
        </transportConnectors>

  </broker>

</beans>
Run Code Online (Sandbox Code Playgroud)

我们在 messages-config.xml 中的主题定义是

<destination id="traceChannel">

    <properties>

        <network>
        <session-timeout>10</session-timeout>
    </network>

        <server>
            <message-time-to-live>10000</message-time-to-live>
            <durable>false</durable>
            <durable-store-manager>flex.messaging.durability.FileStoreManager</durable-store-manager>
        </server>

        <jms>
            <destination-type>Topic</destination-type>
            <message-type>javax.jms.ObjectMessage</message-type>
            <connection-factory>ConnectionFactory</connection-factory>
            <destination-jndi-name>dynamicTopics/traceTopic</destination-jndi-name>
            <delivery-mode>NON_PERSISTENT</delivery-mode>
            <message-priority>DEFAULT_PRIORITY</message-priority>
            <acknowledge-mode>AUTO_ACKNOWLEDGE</acknowledge-mode>
            <transacted-sessions>false</transacted-sessions>
            <initial-context-environment>
                <property>
                    <name>Context.INITIAL_CONTEXT_FACTORY</name>
                    <value>org.apache.activemq.jndi.ActiveMQInitialContextFactory</value>
                </property>
                <property>
                    <name>Context.PROVIDER_URL</name>
                    <value>tcp://localhost:61616</value>
                </property>
            </initial-context-environment>
        </jms>
    </properties>

    <channels>
        <channel ref="rtmps" />
    </channels>

    <adapter ref="trace" />

</destination>
Run Code Online (Sandbox Code Playgroud)

我想要实现的是,在任何时候都只有最后 10 条消息是关于主题的,因为让它在一夜之间运行会导致超过 150K 的关于该主题的消息,即使它应该只包含很少的数字。

java messaging activemq-classic jms

2
推荐指数
1
解决办法
6121
查看次数

协议缓冲区作为活动 Mq 上的消息

我正在设计一个具有多个组件的应用程序,主要是用 java 和 python 编写的。我正在考虑使用“JMS-Active MQ”作为组件和“协议缓冲区”的面向消息的中间件。

1)这是前进的好方法吗?在我们的例子中,“消息大小”可以超过 10MB,协议缓冲区是否仍然具有跨组件通信的优势?对于可以处理“海量数据”的跨平台应用程序,是否有更好的通信“协议”?

2)我创建了一个概念证明,我通过“ActiveMQ”发送“协议buff”作为消息,我使用的是google的java教程中的示例proto文件。

AddressBook.Builder book = AddressBook.newBuilder();
Person.Builder person = Person.newBuilder();
person.setName("mayank");
person.setId(2);
book.addPerson(person); 
TextMessage message = session.createTextMessage();
message.setText(book.build().toString());
Run Code Online (Sandbox Code Playgroud)

在另一个 java 应用程序中,我听了这条消息并尝试将其反序列化回 AddressBook 对象:

public void onMessage(Message message) {
    TextMessage msg = (TextMessage) message;
    try {
        System.out.println(msg.getText());
        CodedInputStream stream =CodedInputStream.newInstance(msg.getText().getBytes());
        AddressBook book = AddressBook.parseFrom(stream);
    }
    catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
}
Run Code Online (Sandbox Code Playgroud)

这会导致异常:

com.google.protobuf.InvalidProtocolBufferException: While parsing a protocol 
  message, the input ended unexpectedly in the middle of a field. …
Run Code Online (Sandbox Code Playgroud)

activemq-classic jms protocol-buffers

2
推荐指数
1
解决办法
6835
查看次数

jms 和不同版本的枚举

我的团队通过 jms 向公司中的另一个团队提供服务。这涉及到作为更大对象的一部分传递给我们的枚举。他们很快就会改变枚举的定义——但是,我想先改变它,这样我就可以在改变前几天让我们的服务在生产中运行。更改将只涉及在最后添加另一个常量。我可以安全地做到这一点吗?

java enums serialization jms

2
推荐指数
1
解决办法
1115
查看次数

有谁确切地知道 javax.jms.InvalidDestinationException: Not allowed to create destination 是什么意思?

当我收到此错误时,我尝试使用 Spring 连接到 Tibco Ems 主题。

这是配置:

    <jms:listener-container connection-factory="Tcf"    acknowledge="auto" >
    <jms:listener id="ListenerContainer" destination="######" ref="MessageListener" />
</jms:listener-container>

<bean id="MessageListener" class="com.dcc.jms.listeners.TestListener"></bean>


<!-- JNDI Template --> 
<bean id="JndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
        <props>
            <prop key="java.naming.provider.url">#</prop>
            <prop key="java.naming.factory.url.pkgs">com.sun.jndi.ldap </prop>
            <prop key="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</prop>
        </props>
    </property>
</bean>

<!-- CONNECTION FACTORY -->
<bean id="Tcf"
    class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
    <property name="username" value="" />
    <property name="password" value="" />
    <property name="targetConnectionFactory">
        <bean class="org.springframework.jndi.JndiObjectFactoryBean">
            <property name="jndiTemplate" ref="JndiTemplate" />
            <property name="jndiName" value="#" />
        </bean>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

这到底是什么意思?我的详细信息或我的配置有误吗?

java spring jms tibco-ems spring-jms

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

什么时候应该使用`REQUIRED` vs`NOT_SUPPORTED`作为MDB的@TransactionAttribute的值?

我知道容器管理事务(CMT).我也知道枚举类型的不同可能值TransactionAttributeType.由于客户端从不直接调用MDB,因此没有客户端启动的事务要加入,因此除了MDB 之外的属性类型REQUIRED并且NOT_SUPPORTED没有意义.那么我何时应该onMessage()使用REQUIREDvs 注释MDB 的方法 NOT_SUPPORTED?提到两个选项中的默认行为是什么?

java transactions jta jms ejb-3.0

2
推荐指数
1
解决办法
1957
查看次数

设置ActiveMQ桥以连接到MOM的不同实现

我想部署ActiveMQ以便与其他MOM实现的jms连接和通信,例如WebsphereMQ,Tibco EMS,Oracle WebLogic JMS等.

就我在网上研究而言,这似乎可以通过在activemq之上构建一个能够与另一端通信的所谓桥接器,而不管每个jms实现使用的底层线路协议.

虽然示例很少,而且往往很少,因此我需要在我的类路径和桥接配置中包含来自每个此类实现(Weblogic,WebsphereMQ,TIBCO EMS等)的jms客户端jar,这一点令人困惑.没有任何这样的罐子可以做到这一点吗?

由于目标是连接到单独的组织MOM,我想避免使用任何第三方,可能是许可的jar.

activemq-classic jms tibco-ems ibm-mq

2
推荐指数
1
解决办法
669
查看次数

如何使 MDB 激活规范上下文属性可配置?

在我们的项目中,我们正在使用一个 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)

java jms jboss-mdb wildfly

2
推荐指数
1
解决办法
1584
查看次数

持久和非持久的区别 JMS-Topic。哪个最好使用耐用或非耐用?

任何人都可以清楚地解释 JMS Topic 中什么是持久和非持久?

到目前为止,我有服务器和客户端模型,服务器将请求发送到客户端以完成从服务器发送的请求,并且客户端接受请求蚂蚁将响应发送回服务器。

我有一个场景,不是服务器发起请求发送给我的客户端,我的客户端必须查看服务器以获取特定请求并将响应发送回服务器。

我可以应用 JMS 主题来解决这个问题吗?如果有人清楚地解释,将不胜感激。提前致谢。

activemq-classic jms jms-topic

2
推荐指数
1
解决办法
4332
查看次数

如果我的应用程序中断,如何使用 ActiveMQ 恢复队列中的消息?

我是新来的ActiveMQ。我有 2 queues:parser-queuegeneration-queue. 我的应用程序在2 个不同的服务器上运行,两者都在侦听队列。我的工作流程非常简单,从解析器队列获取消息,处理它并在工作完成后将另一条消息放入生成队列。

但是,如果在我的工作过程中,获取消息并处理它,我的应用程序将关闭,或者由于任何原因而中断。

未正确处理的同一消息如何再次发送到我的队列以进行处理?

我正在阅读有关订阅恢复策略的内容,但这似乎是一个非常复杂的主题,我不确定是否要使用基于时间的策略,因为我的工作可能会随着时间的推移而变化以完全由我的应用程序处理。

java spring activemq-classic jms spring-jms

2
推荐指数
1
解决办法
1089
查看次数

如何在微服务环境中通过消息查询处理大文件?

许多人认为组织 IPC(ImicroservicesC)的好方法是通过 Kafka 和 JMS 等查询进行异步通信。

但是如果我需要在服务之间传递大数据文件怎么办?

假设我有一个视频微服务和一个发布者微服务。第一个接收来自用户的视频,验证并将它们发送给发布者进行转换和发布。它的遗忘视频可以是一个非常大的文件,它可以使消息系统过载(Kafka根本不适合大消息)。当然,我可以为他们共享一个数据库并通过 Kafka 发送 video_id,但它耦合了这些服务,不再是真正的微服务架构。

你在实践中是否有类似的情况?你怎么处理?

谢谢

java ipc jms microservices

2
推荐指数
1
解决办法
2268
查看次数