1

これを行うためのよりエレガントな方法はありますか:

widget.notes.where(:author_id => a).first.message= widget.notes.where(:author_id => a).first.message << "Potato"

たとえば、次の場合は機能しません。

widget.notes.where(:author_id => a).first.message << "Potato"
widget.notes.where(:author_id => a).first.message <<! "Potato"

それぞれ変更しないか、エラーを返します (

<<!

オペレーター)

key: widget は Widget のインスタンスです。ウィジェットにはメモを付けることができます。メモには、:message の attr_accessible があります。「a」は単なるユーザー インスタンスです。


再配信の遅延設定が ActiveMQXAConnectionFactory で機能しない

camel コンテキスト (camel 2.8) で jms エンドポイント (activemq 5.7) を構成しようとしてきたので、ロールバック時にメッセージの再配信を使用する必要があります。残念ながら、期待どおりには機能しません。メッセージをキューに返しますが、遅延パラメーターが指定されているにもかかわらず、コンシューマーはその直後にメッセージを受け取ります。

私の構成は次のとおりです。

...
<bean id="jmstx" class="org.apache.activemq.camel.component.ActiveMQComponent"> 
    <property name="configuration" ref="jmsTxConfig" /> 
</bean> 

<bean id="jmsTxConfig" class="org.apache.camel.component.jms.JmsConfiguration"> 
    <property name="connectionFactory" ref="jmsXaPoolConnectionFactory"/> 
    <property name="transactionManager" ref="osgiPlatformTransactionManager"/>
    <property name="transacted" value="false"/>
    <property name="cacheLevelName" value="CACHE_NONE"/>
    <property name="concurrentConsumers" value="${jms.concurrentConsumers}" />
</bean> 

<bean id="jmsXaPoolConnectionFactory" class="org.apache.activemq.pool.XaPooledConnectionFactory">
    <property name="maxConnections" value="${jms.maxConnections}" />
    <property name="connectionFactory" ref="jmsXaConnectionFactory" />
    <property name="transactionManager" ref="osgiJtaTransactionManager" />
</bean>

<bean id="jmsXaConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
    <property name="brokerURL" value="${jms.broker.url}"/>
    <property name="redeliveryPolicy">
        <bean class="org.apache.activemq.RedeliveryPolicy">
            <property name="maximumRedeliveries" value="-1"/>
            <property name="initialRedeliveryDelay" value="2000" />
            <property name="redeliveryDelay" value="5000" />
        </bean>
    </property>
</bean>

エンドポイントの使用方法を示す小さなサンプル:

    <route id="main-route">
        <from uri="jmstx:queue:my-queue" />
        <to uri="direct:subroute" />
        ...
        <!-- some logic -->
    </route>

    <route id="subroute">
        <from uri="direct:subroute" />
        <transacted ref="PROPAGATION_MANDATORY"/>
        ...
        <!-- Rollback on some condition -->
        <rollback/>
        ...
    </route>

なぜそれが起こるのか誰か知っていますか?ありがとうございました。

4

1 に答える 1

3

This is not a problem of << not modifying the string in-place - it does modify the string in-place. << might not have a ! in its name, but it still acts like a bang-method. You can see this easily if you replace << with a call to gsub! (which does have a ! in its name) in your example code: it won't make a bit of difference.

In your case you get back the unchanged string because widget.notes.where(:author_id => a).first presumably returns a new object each time, which will have its own independent string.

Further, if message corresponds to a database column, not an instance variable, I'm not sure whether calling mutating methods on it will even work as it would circumvent calling ActiveRecord's (or whichever ORM you're using) setter methods. Using += might be your safest bet here.

This should work as you want:

note = widget.notes.where(:author_id => a).first
note.message += "Potato"
note.save
于 2012-12-21T11:59:43.543 に答える