JMS を介していくつかの Java サービスと通信している Rails アプリがあります。次のように、これらのオブジェクトのいくつかをレール側の memcached にキャッシュしています。
@my_objects = MEMCACHE["some_key"] || @service.retrieve_objects
MEMCACHE.set("some_key",@my_objects) if MEMCACHE["some_key"].nil?
MEMCACHE の場所
MEMCACHE = MemCache.new(['localhost'], :namespace=>"namespace-#{RAILS_ENV}")
現在、memcache がこれらを適切に保存し、適切に更新していることを確認するためのテストを作成しようとしています。残念ながら、キャッシュ内のオブジェクトにアクセスしようとすると、
MemCache::MemCacheError: Class not found unmarshaling Java type: my/java/package/Classname
奇妙なのは、スクリプト/コンソールでのキャッシュの参照が正常に機能することです。ただし、アプリと単体テストを実行すると、このエラーが発生します。同じ環境にある場合、コンソールとアプリに違いはないと思いました。
以下に完全なスタック トレースを含めました。ActiveSupports Memcache クライアントの奥深くから来ているようです。キャッシュにアクセスする直前にこの特定のクラスをインスタンス化することも含め、すべての組み合わせを試しましたが、どれも機能しません。
これらのJavaオブジェクトをテストで直接問題なく取得、インスタンス化、および作成できるため、Railsは明らかにクラスを認識しています。このエラーが発生するのは、MEMCACHEからアクセスする場合のみです。
jruby 1.4.0 のセットアップ
(ruby 1.8.7 パッチレベル 174) (2009-11-13 6586) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_17) [x86_64-java]
Rails 2.2.2
OSX 10.6
完全なテスト スタック トレース
1) Error:
test_testing_memcache_and_settings(MyTest):
MemCache::MemCacheError: Class not found unmarshaling Java type: my/java/package/Classname
/opt/local/share/java/jruby/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/vendor/memcache-client-1.5.1/memcache.rb:241:in `marshal_load'
/opt/local/share/java/jruby/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/vendor/memcache-client-1.5.1/memcache.rb:241:in `load'
/opt/local/share/java/jruby/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/vendor/memcache-client-1.5.1/memcache.rb:241:in `get'
./test/unit/my_test.rb:54:in `test_testing_memcache_and_settings'
/opt/local/share/java/jruby/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/setup_and_teardown.rb:60:in `run_with_callbacks_and_testunit'